PHP - 无法打开流:没有这样的文件或目录

时间:2016-04-12 14:58:40

标签: php require fopen include-path

在PHP脚本中,无论是调用{{/if}}include()require()还是其衍生产品,例如fopen()include_once,甚至是{{1一个人经常遇到错误或警告:

  

无法打开流:没有此类文件或目录。

快速找到问题的根本原因的好过程是什么?

8 个答案:

答案 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> apachewww-data(取决于您的服务器)。 cron作业或CLI执行具有运行它的用户具有的任何权限(即以root身份运行PHP脚本将以root权限执行)。

很多时候,人们会通过执行以下操作来解决权限问题(Linux示例)

httpd

这不是一个明智的想法,因为文件或目录现在是全局可写的。如果你拥有服务器并且是唯一的用户,那么这不是什么大问题,但是如果你是在共享主机环境中,那么你只需要让服务器上的每个人都访问。

您需要做的是确定需要访问权限的用户,并仅授予他们访问权限。一旦您知道哪些用户需要访问权限,您就会确保

  1. 该用户拥有文件,可能还有父目录(如果您要编写文件,则特别是父目录)。在大多数共享托管环境中,这不是一个问题,因为您的用户应该拥有根目录下的所有文件。 Linux示例如下所示

    chmod 777 /path/to/file
    
  2. 用户(仅限该用户)具有访问权限。在Linux中,一个好的做法是chown apache:apache /path/to/file (只有所有者可以读写)或chmod 600(所有者可以写,但每个人都可以阅读)

  3. 你可以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)

  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上运行相同的代码,直到一切正常为止。希望这对某人有帮助。

  1. 复制浏览器中的文件位置以确保文件存在。有时文件被意外删除(发生在我身上),这也是我的问题。

答案 4 :(得分:1)

PHP - 无法打开流:mac 中没有这样的文件或目录

比如我会上传一张图片。但我收到此错误。首先,我会右键单击图像并获取信息。

$thePathOfMyPicture = "/Users/misstugba/Desktop/"; 与函数一起使用

if(move_uploaded_file($_FILES["file"]["tmp_name"],$thePathOfMyPicture.$_FILES["file"]["name"])){
echo "image uploaded successfully";

} enter image description here

答案 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';