介紹 我發現了一個問題,今天與大家分享。我把整個過程描述一下。 問題 問題 公司有個框架是基於smarty寫的,我負責php的升級,維護人員把新環境布上來之後,測試人員找我提出經常報錯(錯誤:提示找不到文件的)。 我追蹤了一下代碼,原來是smarty的這個地方報的錯誤。 錯誤:這裡報出文件不存在。 ...
介紹 我發現了一個問題,今天與大家分享。我把整個過程描述一下。 問題 公司有個框架是基於smarty寫的,我負責php的升級,維護人員把新環境布上來之後,測試人員找我提出經常報錯(錯誤:提示找不到文件的)。 我追蹤了一下代碼,原來是smarty的這個地方報的錯誤。
錯誤:這裡報出文件不存在。
思考過程:
1、我原以為是程式里沒有這個文件呢,結果發現,文件是有的,那是怎麼回事?
2、後來我再猜是不是php內核有問題,我把php的相關內核文件看了一遍,也沒發現問題。結果我就把整個過程跟項目經理說去了。——事情也沒解決,就這樣先不了了之。升級的事情先耽誤著。
今天又發現這個問題,我第一反應是php版本是不是升級了,發現沒有。——後來把整個目錄設置成777就沒事了(chmod 777 -R 目錄)。我想是不是file_exists()方法問題。
所以,我就進行了相關的調試和實驗。
目錄:
觀察各個許可權:test對www是沒有任何許可權的,而執行文件index.php有讀寫執行許可權,包含文件test.txt有讀寫許可權。
運行結果:
既然成功了,說明file_exists()函數是受目錄許可權的限制的。
那什麼樣的目錄許可權影響file_exists()呢?
我做了幾個實驗:
1、文件的任何上級目錄,只有寫許可權時報文件不存在;
2、文件的任何上級目錄,只有讀許可權時也報文件不存在;
3、而當所有上級目錄都有執行許可權的時候,報文件是存在的,一切都正常。
結果,說明file_exists()在判斷文件是否存在的時候是遞歸判斷每個目錄是不是有執行許可權。
修改文件路徑為相對路徑,得出一樣的結果。