文件存在,但 PHP 却报告找不到文件

最近发现正在开发的网站常常报找不到文件(并不总是出现),服务器返回状态码 500(内部服务器错误),查看 apache 的错误日志如下

tail /var/log/apache2/error.log
[Mon Nov 14 06:38:48 2011] [error] [client 121.10.139.198]
PHP Fatal error: Unknown: Failed opening required
'/home/USERNAME/public_html/x/SYMBOL-LINK/index.php'
(include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0

其中 /home/USERNAME/public_html/x/SYMBOL-LINK 是个符号链接,指向 /home/USERNAME/public_html

无效的解决方法

使 web 根目录的拥有者为 apache 进程的执行者 www-data,对 Debian 来说是这个用户,有些系统是 www。用如下命令:

chown www-data:www-data /home/USERNAME/public_html

最终解决方法

过了一段时间发现问题依旧,只是 500 错误的出现频率稍微少了一些,所以又修改为如下方案

/home/USERNAME/public_html/x/SYMBOL-LINK 这个路径不再用符号链接,改为如下子目录

/home/USERNAME/public_html/x/SUBDIR,这个目录下的文件和子目录都指向 /home/USERNAME/public_html/ 下相应的的文件和目录。

测试了几天,事情终于平息了,谢天谢地!

而且,/home/USERNAME/public_html 及其下的文件 owner 也不必一定得是 www-data,只要能读的可读,能写的可写即可,对owner 没有要求。