PHP - 无法打开流:没有这样的文件或目录
PHP - Failed to open stream : No such file or directory
在PHP脚本中,无论是调用include()
、require()
、fopen()
,还是它们的派生物,如include_once
、require_once
,甚至 move_uploaded_file()
,人们经常遇到错误或警告:
Failed to open stream : No such file or directory.
快速找到问题根源的好流程是什么?
人们可能 运行 陷入此错误的原因有很多,因此一份关于首先要检查的内容的清单很有帮助。
假设我们正在对以下行进行故障排除:
require "/path/to/file"
清单
1。检查文件路径是否有拼写错误
- 要么手动检查(通过目视检查路径)
或将 require*
或 include*
调用的任何内容移动到它自己的变量中,回显它,复制它,然后尝试从终端访问它:
$path = "/path/to/file";
echo "Path : $path";
require "$path";
然后,在终端中:
cat <file path pasted>
2。根据相对路径和绝对路径的考虑,检查文件路径是否正确
- 如果它以正斜杠“/”开头,则它不是指您网站文件夹的根目录(文档根目录),而是指您服务器的根目录。
- 例如,您网站的目录可能是
/users/tony/htdocs
- 如果它不是以正斜杠开头,那么它要么依赖于包含路径(见下文),要么路径是相对的。如果是相对的,那么PHP会相对于current working directory的路径进行计算。
- 因此,与您网站的根路径或您输入的文件无关
- 因此,始终使用绝对文件路径
最佳实践:
为了让你的脚本在你四处移动的情况下健壮,同时在 运行 时仍然生成绝对路径,你有 2 个选项:
- 使用
require __DIR__ . "/relative/path/from/current/file"
。 __DIR__
magic constant returns 当前文件的目录。
自己定义一个SITE_ROOT
常量:
- 在您网站目录的根目录下,创建一个文件,例如
config.php
在config.php
中写入
define('SITE_ROOT', __DIR__);
在每个要引用站点根文件夹的文件中,包含 config.php
,然后在任何需要的地方使用 SITE_ROOT
常量:
require_once __DIR__."/../config.php";
...
require_once SITE_ROOT."/other/file.php";
这两种做法还使您的应用程序更具可移植性,因为它不依赖于 ini 设置,例如包含路径。
3。检查您的包含路径
另一种既不是相对也不是纯粹绝对地包含文件的方法是依赖 include path。 Zend 框架等库或框架通常就是这种情况。
这样的包含将如下所示:
include "Zend/Mail/Protocol/Imap.php"
在这种情况下,您需要确保 "Zend" 所在的文件夹是包含路径的一部分。
您可以检查包含路径:
echo get_include_path();
您可以通过以下方式向其中添加文件夹:
set_include_path(get_include_path().":"."/path/to/new/folder");
4。检查您的服务器是否可以访问该文件
可能总的来说,用户 运行 使用服务器进程(Apache 或 PHP)根本没有读取或写入该文件的权限。
要检查服务器是哪个用户 运行ning 你可以使用 posix_getpwuid :
$user = posix_getpwuid(posix_geteuid());
var_dump($user);
要找出文件的权限,请在终端中键入以下命令:
ls -l <path/to/file>
并查看permission symbolic notation
5。检查 PHP 设置
如果上面的 none 有效,那么问题可能是某些 PHP 设置禁止它访问该文件。
三个设置可能相关:
- open_basedir
- 如果设置 PHP 将无法访问指定目录之外的任何文件(甚至不能通过符号 link)。
- 但是,默认行为是不设置,在这种情况下没有限制
- 这可以通过调用
phpinfo()
或使用 ini_get("open_basedir")
来检查
- 您可以通过编辑 php.ini 文件或 httpd.conf 文件来更改设置
- safe mode
- 如果启用此功能,则可能会有限制。但是,这已在 PHP 5.4 中删除。如果你还在支持安全模式的版本升级到PHP版本就是still being supported.
- allow_url_fopen and allow_url_include
- 这仅适用于通过网络进程(例如 http://)包含或打开文件,不适用于尝试包含本地文件系统上的文件时
- 这可以用
ini_get("allow_url_include")
检查并用 ini_set("allow_url_include", "1")
设置
极端情况
如果启用上述 none 来诊断问题,以下是一些可能发生的特殊情况:
1。库的包含依赖于包含路径
您可能会使用相对或绝对路径包含一个库,例如 Zend 框架。例如:
require "/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php"
但是你仍然会得到同样的错误。
这可能是因为您(成功)包含的文件本身具有另一个文件的 include 语句,并且第二个 include 语句假定您已将该库的路径添加到包含路径。
例如前面提到的Zend框架文件可以包含以下内容:
include "Zend/Mail/Protocol/Exception.php"
既不是相对路径包含,也不是绝对路径包含。假设 Zend 框架目录已添加到包含路径。
在这种情况下,唯一可行的解决方案是将该目录添加到您的包含路径中。
2。 SELinux
如果您运行宁安全增强Linux,那么这可能是问题的原因,拒绝从服务器访问文件。
要检查您的系统是否启用了 SELinux,运行 在终端中输入 sestatus
命令。如果该命令不存在,则 SELinux 不在您的系统上。如果它确实存在,那么它应该告诉你它是否被强制执行。
要检查SELinux政策是否是问题的原因,您可以尝试暂时关闭它。但是要小心,因为这将完全禁用保护。不要在您的生产服务器上执行此操作。
setenforce 0
如果关闭 SELinux 后问题不再存在,那么这就是根本原因。
要解决它,你必须相应地配置SELinux。
需要以下上下文类型:
httpd_sys_content_t
对于您希望服务器能够读取的文件
httpd_sys_rw_content_t
对于您想要读写权限的文件
httpd_log_t
用于日志文件
httpd_cache_t
缓存目录
例如,要将 httpd_sys_content_t
上下文类型分配给您的网站根目录,运行 :
semanage fcontext -a -t httpd_sys_content_t "/path/to/root(/.*)?"
restorecon -Rv /path/to/root
如果您的文件位于主目录中,您还需要打开 httpd_enable_homedirs
布尔值:
setsebool -P httpd_enable_homedirs 1
无论如何,SELinux 拒绝访问文件的原因可能有多种,具体取决于您的策略。所以你需要调查一下。 Here 是专门针对 Web 服务器配置 SELinux 的教程。
3。交响乐
如果您使用的是 Symfony,并且在上传到服务器时遇到此错误,则可能是应用的缓存尚未重置,因为 app/cache
已上传,或者缓存尚未重置'已清除。
您可以通过 运行 执行以下控制台命令来测试和修复此问题:
cache:clear
4。 Zip 文件中的非 ACSII 字符
显然,当 zip 中的某些文件的文件名中包含非 ASCII 字符(例如“é”)时,调用 zip->close()
时也会发生此错误。
一个可能的解决方案是在创建目标文件之前将文件名包装在 utf8_decode()
中。
感谢 Fran Cano 识别并提出解决此问题的方法
添加到(非常好的)现有答案
共享主机软件
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 服务器软件的手册。
文件权限
请务必注意,通过 Web 服务器执行文件与命令行或 cron 作业执行有很大不同。最大的区别是您的网络服务器有自己的用户和权限。出于安全原因,该用户受到很大限制。例如,Apache 通常是 apache
、www-data
或 httpd
(取决于您的服务器)。 cron 作业或 CLI 执行具有用户 运行ning 拥有的任何权限(即 运行ning PHP 脚本作为 root 将以 root 权限执行)。
很多时候人们会通过执行以下操作来解决权限问题(Linux 示例)
chmod 777 /path/to/file
这不是个好主意,因为文件或目录现在是全局可写的。如果您拥有该服务器并且是唯一的用户,那么这没什么大不了的,但如果您在共享托管环境中,您就已经授予服务器上的每个人访问权限。
您需要做的是确定需要访问权限的用户并只授予他们访问权限。知道哪些用户需要访问权限后,您需要确保
该用户拥有文件 以及可能的父目录 (如果要写入文件,尤其是父目录)。在大多数共享主机环境中,这不会成为问题,因为您的用户应该拥有根目录下的所有文件。 Linux 示例如下所示
chown apache:apache /path/to/file
该用户,并且只有该用户具有访问权限。在 Linux 中,一个好的做法是 chmod 600
(只有所有者可以读写)或 chmod 644
(所有者可以写,但每个人都可以读)
你可以read a more extended discussion of Linux/Unix permissions and users here
添加带有查询参数的脚本
我就是这样。它实际上链接到 question #4485874,但我稍后会在这里解释它。
当您尝试要求 path/to/script.php?parameter=value
时,PHP 会查找名为 script.php?parameter=value
的文件,因为 UNIX 允许您使用这样的路径。
如果您确实需要将一些数据传递给包含的脚本,只需将其声明为 $variable=...
或 $GLOBALS[]=...
或您喜欢的其他方式。
- 查看准确错误
我的代码在所有机器上都运行良好,但只有这台机器开始出现问题(我猜它曾经工作过)。使用 echo "document_root" 路径进行调试,也仔细查看了错误,发现了这个
Warning:
include(D:/MyProjects/testproject//functions/connections.php):
failed to open stream:
你很容易看出问题出在哪里。问题是 // 在函数
之前
$document_root = $_SERVER['DOCUMENT_ROOT'];
echo "root: $document_root";
include($document_root.'/functions/connections.php');
因此,只需从 include 中删除提单 / 即可,它应该可以正常工作。有趣的是这种行为在不同版本上是不同的。我 运行 在笔记本电脑、Macbook Pro 和这台 PC 上使用相同的代码,一切正常,直到。希望这对某人有所帮助。
- 复制浏览器中的文件位置以确保文件存在。有时文件会意外删除(发生在我身上),这也是我的问题。
Samba 共享
如果您有一个 Linux 测试服务器并且您从 Windows 客户端工作,Samba 共享会干扰 chmod 命令。所以,即使你使用:
chmod -R 777 myfolder
在 Linux 方面,Unix Group\www-data 完全有可能仍然没有写入权限。如果您的共享设置为 Windows 管理员映射到根目录,则一个可行的解决方案是:从 Windows,打开权限,使用副本禁用文件夹的继承,然后授予对 www-data 的完全访问权限。
以下PHP设置在php.ini
如果设置到non-existent目录也可以提高
PHP Warning: Unknown: failed to open stream: Permission denied in
Unknown on line 0
sys_temp_dir
upload_tmp_dir
session.save_path
对我来说,我收到这个错误是因为我试图读取一个需要 HTTP 身份验证的文件,其中包含用户名和密码。希望能帮助别人。可能是另一个极端情况。
编辑
您可以通过检查 headers:
检查是否存在这种类型的身份验证
$file_headers = get_headers($url);
if (!$file_headers) echo 'File headers missing';
else if (strpos($file_headers[0], '401 Unauthorized') > -1) echo '401 Unauthorized';
PHP - 无法打开流:mac
中没有这样的文件或目录
比如我会上传一张图片。但是我收到了这个错误。我要做的第一件事是右键单击图像并获取信息。
$thePathOfMyPicture = "/Users/misstugba/Desktop/";
与函数一起使用
if(move_uploaded_file($_FILES["file"]["tmp_name"],$thePathOfMyPicture.$_FILES["file"]["name"])){
echo "image uploaded successfully";
}
在 PHP 中,启动 Apache,然后写入您的数据库名称和密码(如果您的环境中存在)(.env)。
除了其他出色的答案外,我在编写简单脚本时忽略了 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 不喜欢文件名中的 :
以及许多其他字符。
在PHP脚本中,无论是调用include()
、require()
、fopen()
,还是它们的派生物,如include_once
、require_once
,甚至 move_uploaded_file()
,人们经常遇到错误或警告:
Failed to open stream : No such file or directory.
快速找到问题根源的好流程是什么?
人们可能 运行 陷入此错误的原因有很多,因此一份关于首先要检查的内容的清单很有帮助。
假设我们正在对以下行进行故障排除:
require "/path/to/file"
清单
1。检查文件路径是否有拼写错误
- 要么手动检查(通过目视检查路径)
或将
require*
或include*
调用的任何内容移动到它自己的变量中,回显它,复制它,然后尝试从终端访问它:$path = "/path/to/file"; echo "Path : $path"; require "$path";
然后,在终端中:
cat <file path pasted>
2。根据相对路径和绝对路径的考虑,检查文件路径是否正确
- 如果它以正斜杠“/”开头,则它不是指您网站文件夹的根目录(文档根目录),而是指您服务器的根目录。
- 例如,您网站的目录可能是
/users/tony/htdocs
- 例如,您网站的目录可能是
- 如果它不是以正斜杠开头,那么它要么依赖于包含路径(见下文),要么路径是相对的。如果是相对的,那么PHP会相对于current working directory的路径进行计算。
- 因此,与您网站的根路径或您输入的文件无关
- 因此,始终使用绝对文件路径
最佳实践:
为了让你的脚本在你四处移动的情况下健壮,同时在 运行 时仍然生成绝对路径,你有 2 个选项:
- 使用
require __DIR__ . "/relative/path/from/current/file"
。__DIR__
magic constant returns 当前文件的目录。 自己定义一个
SITE_ROOT
常量:- 在您网站目录的根目录下,创建一个文件,例如
config.php
在
config.php
中写入define('SITE_ROOT', __DIR__);
在每个要引用站点根文件夹的文件中,包含
config.php
,然后在任何需要的地方使用SITE_ROOT
常量:require_once __DIR__."/../config.php"; ... require_once SITE_ROOT."/other/file.php";
- 在您网站目录的根目录下,创建一个文件,例如
这两种做法还使您的应用程序更具可移植性,因为它不依赖于 ini 设置,例如包含路径。
3。检查您的包含路径
另一种既不是相对也不是纯粹绝对地包含文件的方法是依赖 include path。 Zend 框架等库或框架通常就是这种情况。
这样的包含将如下所示:
include "Zend/Mail/Protocol/Imap.php"
在这种情况下,您需要确保 "Zend" 所在的文件夹是包含路径的一部分。
您可以检查包含路径:
echo get_include_path();
您可以通过以下方式向其中添加文件夹:
set_include_path(get_include_path().":"."/path/to/new/folder");
4。检查您的服务器是否可以访问该文件
可能总的来说,用户 运行 使用服务器进程(Apache 或 PHP)根本没有读取或写入该文件的权限。
要检查服务器是哪个用户 运行ning 你可以使用 posix_getpwuid :
$user = posix_getpwuid(posix_geteuid());
var_dump($user);
要找出文件的权限,请在终端中键入以下命令:
ls -l <path/to/file>
并查看permission symbolic notation
5。检查 PHP 设置
如果上面的 none 有效,那么问题可能是某些 PHP 设置禁止它访问该文件。
三个设置可能相关:
- open_basedir
- 如果设置 PHP 将无法访问指定目录之外的任何文件(甚至不能通过符号 link)。
- 但是,默认行为是不设置,在这种情况下没有限制
- 这可以通过调用
phpinfo()
或使用ini_get("open_basedir")
来检查
- 您可以通过编辑 php.ini 文件或 httpd.conf 文件来更改设置
- safe mode
- 如果启用此功能,则可能会有限制。但是,这已在 PHP 5.4 中删除。如果你还在支持安全模式的版本升级到PHP版本就是still being supported.
- allow_url_fopen and allow_url_include
- 这仅适用于通过网络进程(例如 http://)包含或打开文件,不适用于尝试包含本地文件系统上的文件时
- 这可以用
ini_get("allow_url_include")
检查并用ini_set("allow_url_include", "1")
设置
极端情况
如果启用上述 none 来诊断问题,以下是一些可能发生的特殊情况:
1。库的包含依赖于包含路径
您可能会使用相对或绝对路径包含一个库,例如 Zend 框架。例如:
require "/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php"
但是你仍然会得到同样的错误。
这可能是因为您(成功)包含的文件本身具有另一个文件的 include 语句,并且第二个 include 语句假定您已将该库的路径添加到包含路径。
例如前面提到的Zend框架文件可以包含以下内容:
include "Zend/Mail/Protocol/Exception.php"
既不是相对路径包含,也不是绝对路径包含。假设 Zend 框架目录已添加到包含路径。
在这种情况下,唯一可行的解决方案是将该目录添加到您的包含路径中。
2。 SELinux
如果您运行宁安全增强Linux,那么这可能是问题的原因,拒绝从服务器访问文件。
要检查您的系统是否启用了 SELinux,运行 在终端中输入 sestatus
命令。如果该命令不存在,则 SELinux 不在您的系统上。如果它确实存在,那么它应该告诉你它是否被强制执行。
要检查SELinux政策是否是问题的原因,您可以尝试暂时关闭它。但是要小心,因为这将完全禁用保护。不要在您的生产服务器上执行此操作。
setenforce 0
如果关闭 SELinux 后问题不再存在,那么这就是根本原因。
要解决它,你必须相应地配置SELinux。
需要以下上下文类型:
httpd_sys_content_t
对于您希望服务器能够读取的文件httpd_sys_rw_content_t
对于您想要读写权限的文件httpd_log_t
用于日志文件httpd_cache_t
缓存目录
例如,要将 httpd_sys_content_t
上下文类型分配给您的网站根目录,运行 :
semanage fcontext -a -t httpd_sys_content_t "/path/to/root(/.*)?"
restorecon -Rv /path/to/root
如果您的文件位于主目录中,您还需要打开 httpd_enable_homedirs
布尔值:
setsebool -P httpd_enable_homedirs 1
无论如何,SELinux 拒绝访问文件的原因可能有多种,具体取决于您的策略。所以你需要调查一下。 Here 是专门针对 Web 服务器配置 SELinux 的教程。
3。交响乐
如果您使用的是 Symfony,并且在上传到服务器时遇到此错误,则可能是应用的缓存尚未重置,因为 app/cache
已上传,或者缓存尚未重置'已清除。
您可以通过 运行 执行以下控制台命令来测试和修复此问题:
cache:clear
4。 Zip 文件中的非 ACSII 字符
显然,当 zip 中的某些文件的文件名中包含非 ASCII 字符(例如“é”)时,调用 zip->close()
时也会发生此错误。
一个可能的解决方案是在创建目标文件之前将文件名包装在 utf8_decode()
中。
感谢 Fran Cano 识别并提出解决此问题的方法
添加到(非常好的)现有答案
共享主机软件
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 服务器软件的手册。
文件权限
请务必注意,通过 Web 服务器执行文件与命令行或 cron 作业执行有很大不同。最大的区别是您的网络服务器有自己的用户和权限。出于安全原因,该用户受到很大限制。例如,Apache 通常是 apache
、www-data
或 httpd
(取决于您的服务器)。 cron 作业或 CLI 执行具有用户 运行ning 拥有的任何权限(即 运行ning PHP 脚本作为 root 将以 root 权限执行)。
很多时候人们会通过执行以下操作来解决权限问题(Linux 示例)
chmod 777 /path/to/file
这不是个好主意,因为文件或目录现在是全局可写的。如果您拥有该服务器并且是唯一的用户,那么这没什么大不了的,但如果您在共享托管环境中,您就已经授予服务器上的每个人访问权限。
您需要做的是确定需要访问权限的用户并只授予他们访问权限。知道哪些用户需要访问权限后,您需要确保
该用户拥有文件 以及可能的父目录 (如果要写入文件,尤其是父目录)。在大多数共享主机环境中,这不会成为问题,因为您的用户应该拥有根目录下的所有文件。 Linux 示例如下所示
chown apache:apache /path/to/file
该用户,并且只有该用户具有访问权限。在 Linux 中,一个好的做法是
chmod 600
(只有所有者可以读写)或chmod 644
(所有者可以写,但每个人都可以读)
你可以read a more extended discussion of Linux/Unix permissions and users here
添加带有查询参数的脚本
我就是这样。它实际上链接到 question #4485874,但我稍后会在这里解释它。
当您尝试要求 path/to/script.php?parameter=value
时,PHP 会查找名为 script.php?parameter=value
的文件,因为 UNIX 允许您使用这样的路径。
如果您确实需要将一些数据传递给包含的脚本,只需将其声明为 $variable=...
或 $GLOBALS[]=...
或您喜欢的其他方式。
- 查看准确错误
我的代码在所有机器上都运行良好,但只有这台机器开始出现问题(我猜它曾经工作过)。使用 echo "document_root" 路径进行调试,也仔细查看了错误,发现了这个
Warning: include(D:/MyProjects/testproject//functions/connections.php): failed to open stream:
你很容易看出问题出在哪里。问题是 // 在函数
之前$document_root = $_SERVER['DOCUMENT_ROOT'];
echo "root: $document_root";
include($document_root.'/functions/connections.php');
因此,只需从 include 中删除提单 / 即可,它应该可以正常工作。有趣的是这种行为在不同版本上是不同的。我 运行 在笔记本电脑、Macbook Pro 和这台 PC 上使用相同的代码,一切正常,直到。希望这对某人有所帮助。
- 复制浏览器中的文件位置以确保文件存在。有时文件会意外删除(发生在我身上),这也是我的问题。
Samba 共享
如果您有一个 Linux 测试服务器并且您从 Windows 客户端工作,Samba 共享会干扰 chmod 命令。所以,即使你使用:
chmod -R 777 myfolder
在 Linux 方面,Unix Group\www-data 完全有可能仍然没有写入权限。如果您的共享设置为 Windows 管理员映射到根目录,则一个可行的解决方案是:从 Windows,打开权限,使用副本禁用文件夹的继承,然后授予对 www-data 的完全访问权限。
以下PHP设置在php.ini
如果设置到non-existent目录也可以提高
PHP Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0
sys_temp_dir
upload_tmp_dir
session.save_path
对我来说,我收到这个错误是因为我试图读取一个需要 HTTP 身份验证的文件,其中包含用户名和密码。希望能帮助别人。可能是另一个极端情况。
编辑
您可以通过检查 headers:
检查是否存在这种类型的身份验证$file_headers = get_headers($url);
if (!$file_headers) echo 'File headers missing';
else if (strpos($file_headers[0], '401 Unauthorized') > -1) echo '401 Unauthorized';
PHP - 无法打开流:mac
中没有这样的文件或目录比如我会上传一张图片。但是我收到了这个错误。我要做的第一件事是右键单击图像并获取信息。
$thePathOfMyPicture = "/Users/misstugba/Desktop/";
与函数一起使用
if(move_uploaded_file($_FILES["file"]["tmp_name"],$thePathOfMyPicture.$_FILES["file"]["name"])){
echo "image uploaded successfully";
}
在 PHP 中,启动 Apache,然后写入您的数据库名称和密码(如果您的环境中存在)(.env)。
除了其他出色的答案外,我在编写简单脚本时忽略了 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 不喜欢文件名中的 :
以及许多其他字符。