我今天登录到我的开发服务器,发现 PHP 无法包含某些文件并出现以下 E_WARNING 消息:
警告:include_once(../file2.php) [function.include-once]:无法打开流:/var/www/web/some_directory_1/file1.php 中的任何行中没有该文件或目录
我与我们的系统管理员进行了一些调查,我们发现只有当 PHP 尝试在路径中包含带有“../”或“./”的文件路径时才会失败。
假设我们的文件结构如下:
/var/www/web/--index.php--file2.php--some_directory_1/----file1.php----file3.php
如果 file1.php 想要包含 file2.php,则可以这样做:
include_once('/var/www/web/file2.php');
但这不会:
include_once('../file2.php');
现在,稍等一下...我知道你在想什么!“哦,他们的include_path 简直是一团糟。”嗯,不完全是。
如果你在 index.php 中执行此操作,它将起作用:
include_once('some_directory_1/file1.php');
如果你在 file1.php 中执行此操作,它也会起作用:
include_once('file3.php');
我们的 include_path 设置为.:/usr/lib/php
。在过去 24 小时内,服务器环境没有任何变化(没有更新、没有新软件、没有更改包含内容、没有更改 Apache 或 PHP 配置),我和系统管理员是过去 24 小时内唯一访问过服务器的人,并且包含内容昨天运行正常。我们已经用尽了可能的原因列表。有什么线索可能导致这种情况发生吗?
编辑:忘记了 PHP 警告信息。
答案1
您遇到麻烦的原因是 include/require 中的相对路径始终是相对的最初的脚本,而使用相对路径会导致 php 忽略 include_path 值。因此,在您的示例中include_once('../file2.php');
,假设 index.php 是初始脚本,则在 index.php 的父级中查找文件。
不确定为什么它会突然改变。但是,解决方案是不使用相对路径 - 要么使用include_path,要么使用评论中建议的__DIR__
/ 。dirname()