【发布时间】:2017-03-09 20:26:26
【问题描述】:
php 似乎没有解析符号链接。
我正在尝试将符号链接的目标添加到 php 文件中的包含路径,但 php 似乎无法识别符号链接指向目录,因此无法找到我想要的文件包括。
关于上下文,这里是相关的目录详细信息
$> pwd
/var/www/siteroot
$> ls -l
content
...
includes -> content/subdir/includes
...
public_html
$> ls includes/common/
default-home.php
这是我试图从中加载 default-home.php 页面的 php 文件。
$> cat public_html/index.php
<?php
wanted_path="../includes/common"
set_include_path($wanted_path.PATH_SEPARATOR.get_includes_path());
var_dump(is_dir($wanted_path)); # testing to see if the included path is a directory
var_dump(is_dir("../includes")); # test to see if the symbolic link alone resolves to a directory
include "default-home.php";
?>
基于上述,当我访问index.php 网页时,我希望看到:
bool(true) bool(true)
...(output/contents of default-home.php)
但是,is_dir() 调用导致 False 和 False,并且错误日志显示
PHP Warning: include(default-home.php): Failed to open stream: No such file or directory
根据我对php的了解,例如this SO question和php docs,似乎php通常默认解析符号链接,但也许我的配置不同?
无论如何,如何让 php 定位符号链接下的目录中的文件?
我在 OpenBSD5.7 本机 httpd 服务器上使用 PHP 5.5.22。提前致谢。
编辑
这原来是一个权限问题。要显示权限和所有权:
$> ls -la
drwx------- hilcharge daemon ... content
...
lrwxr------ hilcharge daemon ... includes -> content/subdir/includes/
...
即使将includes 目标的权限更改为chmod -R -L 0755 includes,仍然找不到文件夹。
为了解决问题,我更改了content 和subdir 的权限。
【问题讨论】:
-
运行 Web 服务器的用户是否有权访问这些目录?
-
糟糕,他们没有,谢谢。但我刚刚做了
chmod -R -L 0755 includes,问题仍然存在,输出没有明显变化。所有者和组也是一样的。 -
我将输出添加到问题中,并找到了解决方案。我不得不更改链接和目标之间所有目录的权限。我很惊讶 php 说它找不到文件,而不是说权限被拒绝。我记得不久前 perl cgi 文件也有类似的问题。是否有一些记录在案的原因?
-
尝试包含一个绝对目录:/dir/dir/includes/common。或者只是执行 echo get_include_path() 以确保它正确构建。
-
好的,我尝试了绝对路径,它也有效。但是,正确包含是什么意思?
标签: php