如何解決符號連結上下文中的 PHP 錯誤“需要打開失敗”?
我在 MacOS X Lion 10.7.4 上執行 Apache/PHP。我的目錄結構是這樣設置的:
/Users/achan/Sites/ lrwxrwx--- 1 achan staff 23B Apr 27 16:21 epwbst@ -> /Users/achan/dev/epwbst`
epwbst/
裡面的符號連結在哪裡~/Sites
。如果我放入
test.php
目錄Sites/
中,Apache 會正確提供文件;phpinfo()
它像它應該的那樣噴出來。如果我將相同的文件放在符號連結下,我會收到此錯誤:[Mon May 28 14:47:13 2012] [error] [client ::1] PHP Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0 [Mon May 28 14:47:13 2012] [error] [client ::1] PHP Fatal error: Unknown: Failed opening required '/Users/achan/Sites/epwbst/test.php' (include_path='.:/usr/lib/php/pear') in Unknown on line 0
為了確保 Apache 正常工作,我在下面創建了一個測試 html 文件
~/Sites/epwbst/
,Apache 按預期提供了它。為什麼 Apache 不能在我的符號連結目錄下執行 php?
我在這裡粘貼了我的 php 配置:http: //pastebin.com/gg27JyVZ
好吧,這讓我發瘋了好幾個小時。這是一個權限問題,但不是人們的想法。問題在於符號連結本身的權限:
/Users/achan/Sites/ lrwxrwx--- 1 achan staff23B Apr 27 16:21 epwbst@ -> /Users/achan/dev/epwbst`
這就是問題所在:
chmod
通常不會更改符號連結的權限,因為(除了php5_module
這個答案範圍之外的一些其他情況明顯例外)這些權限在很大程度上是無關緊要的,因為它們在幾乎所有上下文中都被忽略了。這是修復:chmod -h 755 /Users/achan/Sites/epwbst
注意
-h
. 從手冊頁:... -h If the file is a symbolic link, change the mode of the link itself rather than the file that the link points to. ...
由於某種原因,
php5_module
實際上要注意符號連結上的權限。如果它們過於嚴格,php5_module
將拒絕查看目標,即使httpd
使用者可以使用/usr/bin/php
.考慮以下:
% umask 027 % cd ~/Sites % mkdir bar % chmod 755 bar % ln -sv bar foo foo -> bar % ls -al ~/Sites/foo lrwxr-x--- 1 xyz xyz 3 Apr 22 13:17 foo -> bar % ls -adl ~/Sites/foo/. drwxr-xr-x 2 xyz xyz 68 Apr 22 13:17 /Users/xyz/Sites/foo/. % echo 'Hello!' >bar/hello.txt % chmod 644 bar/hello.txt % curl http://localhost/~xyz/bar/hello.txt Hello! % curl http://localhost/~xyz/foo/hello.txt Hello!
到現在為止還挺好。現在考慮:
% echo '<?php phpinfo(); ?>' >bar/info.php % chmod 644 bar/info.php % curl http://localhost/~xyz/bar/info.php <html xmlns="http://www.w3.org/1999/xhtml"><head> ... </div></body></html> % curl http://localhost/~xyz/foo/info.php <br /> <b>Warning</b>: Unknown: failed to open stream: No such file or directory in <b>Unknown</b> on line <b>0</b><br /> <br /> <b>Fatal error</b>: Unknown: Failed opening required '/Users/xyz/Sites/foo/info.php' (include_path='.:') in <b>Unknown</b> on line <b>0</b><br />
嗯。我
httpd
以使用者身份執行_www
,所以讓我們檢查一下該使用者是否可以閱讀.../foo/info.php
:% sudo sudo -u _www cat ~/Sites/foo/info.php Password: <?php phpinfo(); ?>
是的。現在讓我們看看該使用者是否可以執行
.../foo/info.php
:% sudo sudo -u _www /usr/bin/php ~/Sites/foo/info.php Password: phpinfo() PHP Version => 5.4.24 ... If you did not receive a copy of the PHP license, or have any questions about PHP licensing, please contact license@php.net.
是的?!怎麼回事?!***呸!***現在修復它:
% chmod -h 755 foo % curl http://localhost/~xyz/foo/info.php <html xmlns="http://www.w3.org/1999/xhtml"><head> ... </div></body></html>
所以,是的。看起來,它
php5_module
做了一些偏執和不標準的事情。這可能已被忽略,因為umask
通常預設為022
,這至少會創建與 . 的符號連結755
。此外,許多文件系統(不是 HFS+)在創建符號連結期間會施加 777 的核心級別權限,而與umask
.你和我似乎是太陽系中在 HFS+ 上執行 Apache+PHP 的兩個人,同時將我們的 umask 設置為比預設設置更嚴格的東西。我敢打賭你甚至會使用區分大小寫的 HFS+。;o)