在PHP脚本中,无论是调用{{/if}}
,include()
,require()
还是其衍生产品,例如fopen()
,include_once
,甚至是{{1一个人经常遇到错误或警告:
无法打开流:没有此类文件或目录。
快速找到问题的根本原因的好过程是什么?
答案 0 :(得分:11)
添加(非常好)现有答案
open_basedir
是可以阻止您的,因为它可以在Web服务器配置中指定。虽然如果您运行自己的专用服务器,这很容易解决,但有一些共享主机软件包(如Plesk,cPanel等)将基于每个域配置配置指令。由于软件构建配置文件(即httpd.conf
),因此您无法直接更改该文件,因为托管软件只会在重新启动时覆盖它。
使用Plesk,他们可以提供覆盖名为httpd.conf
的{{1}}提供的地方。只有服务器管理员才能写入此文件。 Apache的配置看起来像这样
vhost.conf
让您的服务器管理员查阅他们使用的托管和Web服务器软件的手册。
请注意,通过Web服务器执行文件与命令行或cron作业执行非常不同,这一点非常重要。最大的区别是您的Web服务器拥有自己的用户和权限。出于安全原因,用户非常受限制。例如,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>
,apache
或www-data
(取决于您的服务器)。 cron作业或CLI执行具有运行它的用户具有的任何权限(即以root身份运行PHP脚本将以root权限执行)。
很多时候,人们会通过执行以下操作来解决权限问题(Linux示例)
httpd
这不是一个明智的想法,因为文件或目录现在是全局可写的。如果你拥有服务器并且是唯一的用户,那么这不是什么大问题,但是如果你是在共享主机环境中,那么你只需要让服务器上的每个人都访问。
您需要做的是确定需要访问权限的用户,并仅授予他们访问权限。一旦您知道哪些用户需要访问权限,您就会确保
该用户拥有文件,可能还有父目录(如果您要编写文件,则特别是父目录)。在大多数共享托管环境中,这不是一个问题,因为您的用户应该拥有根目录下的所有文件。 Linux示例如下所示
chmod 777 /path/to/file
用户(仅限该用户)具有访问权限。在Linux中,一个好的做法是chown apache:apache /path/to/file
(只有所有者可以读写)或chmod 600
(所有者可以写,但每个人都可以阅读)
你可以read a more extended discussion of Linux/Unix permissions and users here
答案 1 :(得分:2)
Samba共享
如果您具有Linux测试服务器,并且使用Windows客户端工作,则Samba共享会干扰 chmod 命令。因此,即使您使用:
chmod -R 777 myfolder
在Linux上,很有可能Unix Group \ www-data仍然没有写访问权限。一种可行的解决方案(如果已设置共享,将Windows管理员映射到根目录):从Windows中打开“权限”,禁用带有副本的文件夹的“继承”,然后授予对www-data的完全访问权限。
答案 2 :(得分:1)
那是我的情况。它实际上链接到question #4485874,但我将在此稍后进行解释。
当您尝试要求path/to/script.php?parameter=value
时,PHP将查找名为script.php?parameter=value
的文件,因为UNIX允许您使用这样的路径。
如果确实需要将一些数据传递到包含的脚本,只需将其声明为$variable=...
或$GLOBALS[]=...
或其他方式即可。
答案 3 :(得分:1)
我的代码在所有机器上都能正常工作,但是只有在这台机器上才开始出现问题(我猜这曾经可以工作)。使用echo“ document_root”路径进行调试,并仔细查看错误,发现了
警告: 包括( D:/MyProjects/testproject//functions/connections.php ): 无法打开流:
您可以轻松查看问题所在。问题是// //在函数之前
$document_root = $_SERVER['DOCUMENT_ROOT'];
echo "root: $document_root";
include($document_root.'/functions/connections.php');
因此,只需从包含中删除提单/,它就可以正常工作。有趣的是,这种行为在不同版本上是不同的。我在笔记本电脑,Macbook Pro和这台PC上运行相同的代码,直到一切正常为止。希望这对某人有帮助。
答案 4 :(得分:1)
PHP - 无法打开流:mac 中没有这样的文件或目录
比如我会上传一张图片。但我收到此错误。首先,我会右键单击图像并获取信息。
$thePathOfMyPicture = "/Users/misstugba/Desktop/";
与函数一起使用
if(move_uploaded_file($_FILES["file"]["tmp_name"],$thePathOfMyPicture.$_FILES["file"]["name"])){
echo "image uploaded successfully";
答案 5 :(得分:0)
另一个可能的原因:在文本编辑器中重命名和/或移动文件。我完成了上述所有步骤,但没有成功,直到我删除了不断抛出此错误并创建了一个新错误的文件,从而修复了问题。
答案 6 :(得分:0)
php.ini
中的以下PHP设置(如果设置为不存在的目录)也会引发
PHP警告:未知:无法打开流:权限被拒绝 在第0行上未知
sys_temp_dir
upload_tmp_dir
session.save_path
答案 7 :(得分:0)
对我来说,我收到此错误是因为我试图使用用户名和密码读取需要 HTTP 身份验证的文件。希望能帮助别人。可能是另一个极端情况。
您可以通过检查标头来检查是否存在这种类型的身份验证:
$file_headers = get_headers($url);
if (!$file_headers) echo 'File headers missing';
else if (strpos($file_headers[0], '401 Unauthorized') > -1) echo '401 Unauthorized';