在PHP脚本中,无论是调用include(), require(), fopen(),还是它们的衍生物,如include_once, require_once,甚至move_uploaded_file(),都经常会遇到错误或警告:
无法打开流:没有这样的文件或目录。
什么是快速找到问题根源的良好流程?
在PHP脚本中,无论是调用include(), require(), fopen(),还是它们的衍生物,如include_once, require_once,甚至move_uploaded_file(),都经常会遇到错误或警告:
无法打开流:没有这样的文件或目录。
什么是快速找到问题根源的良好流程?
当前回答
下面的PHP设置在PHP .ini中如果设置为不存在的目录也会引发
PHP警告:未知:未能打开流:权限被拒绝 第0行未知
sys_temp_dir
upload_tmp_dir
session.save_path
其他回答
无法打开流:在mac中没有这样的文件或目录
例如,我会上传一张图片。但是我得到了这个错误。第一件事,我会做右键点击图像和获取信息。
$ thepathofmpicture = "/Users/misstugba/Desktop/"; 配合功能使用
if(move_uploaded_file($_FILES["file"]["tmp_name"],$thePathOfMyPicture.$_FILES["file"]["name"])){
echo "image uploaded successfully";
}
为现有的(非常好的)答案补充
共享托管软件
Open_basedir是一个让你为难的参数,因为它可以在web服务器配置中指定。虽然如果你运行自己的专用服务器,这很容易补救,但有一些共享托管软件包(如Plesk, cPanel等)会在每个域的基础上配置配置指令。因为软件构建了配置文件(即httpd.conf),所以你不能直接更改该文件,因为主机软件在重新启动时会覆盖它。
使用Plesk,它们提供了一个地方来覆盖所提供的httpd.conf,称为vhost.conf。只有服务器管理员可以写这个文件。Apache的配置如下所示
<Directory /var/www/vhosts/domain.com>
<IfModule mod_php5.c>
php_admin_flag engine on
php_admin_flag safe_mode off
php_admin_value open_basedir "/var/www/vhosts/domain.com:/tmp:/usr/share/pear:/local/PEAR"
</IfModule>
</Directory>
让你的服务器管理员查阅他们使用的主机和web服务器软件的手册。
文件权限
It's important to note that executing a file through your web server is very different from a command line or cron job execution. The big difference is that your web server has its own user and permissions. For security reasons that user is pretty restricted. Apache, for instance, is often apache, www-data or httpd (depending on your server). A cron job or CLI execution has whatever permissions that the user running it has (i.e. running a PHP script as root will execute with permissions of root).
很多时候人们会通过以下方法来解决权限问题(以Linux为例)
chmod 777 /path/to/file
这不是一个明智的想法,因为文件或目录现在是全局可写的。如果您拥有服务器,并且是唯一的用户,那么这不是什么大问题,但如果您在共享托管环境中,您只是给了服务器上的每个人访问权。
您需要做的是确定需要访问权限的用户,并只给他们访问权限。一旦你知道哪些用户需要访问,你就会想要确保这一点
该用户拥有文件,可能还拥有父目录(如果您想写入文件,则尤其拥有父目录)。在大多数共享主机环境中,这不是问题,因为您的用户应该拥有根目录下的所有文件。下面显示了一个Linux示例 Chown apache:apache /path/to/file 用户,且只有该用户具有访问权限。在Linux中,一个好的做法是chmod 600(只有所有者可以读写)或chmod 644(所有者可以写,但每个人都可以读)
你可以在这里阅读更多关于Linux/Unix权限和用户的讨论
下面的PHP设置在PHP .ini中如果设置为不存在的目录也会引发
PHP警告:未知:未能打开流:权限被拒绝 第0行未知
sys_temp_dir
upload_tmp_dir
session.save_path
对我来说,我得到了这个错误,因为我试图读取一个需要HTTP认证的文件,有用户名和密码。希望能帮助别人。可能是另一个极端情况。
Edit
你可以通过检查头文件来检查是否存在这种类型的身份验证:
$file_headers = get_headers($url);
if (!$file_headers) echo 'File headers missing';
else if (strpos($file_headers[0], '401 Unauthorized') > -1) echo '401 Unauthorized';
除了其他精彩的回答,在Windows上写一个简单的脚本时,我忽略了一件事:当试图打开一个带有Windows不支持的文件名字符的文件时,会出现这个错误。
例如:
$file = fopen(date('Y-m-d_H:i:s'), 'w+');
将:
fopen(2022-06-01_22:53:03): Failed to open stream: No such file or directory in…
Windows不喜欢:在文件名中,以及其他一些字符。