在我們一般正常情況下使用file_exists 檢查檔案或目錄是否存在是沒有問題了,但要注意一個是安全模式和目錄沒有執行許可權的時就會返回false哦。
我們先來看看關於file_exists的用法
file_exists() 函數檢查檔案或目錄是否存在。
如果指定的檔案或目錄存在則返回 true,否則返回 false。
文法
file_exists(path)參數 描述
path 必需。規定要檢查的路徑。
例子
echo file_exists("test.txt");
?>
輸出:
1
按這個原理 我在smarty模板開始工作如下
介紹
我發現了一個問題,今天與大家分享。我把整個流程說明一下。
問題
公司有個架構是基於smarty寫的,我負責php的升級,維護人員把新環境布上來之後,測試人員找我提出經常報錯(錯誤:提示找不到檔案的)。
我追蹤了一下代碼,原來是smarty的這個地方報的錯誤。
錯誤:這裡報出檔案不存在。
思考過程:
1、我原以為是程式裡沒有這個檔案呢,結果發現,檔案是有的,那是怎麼回事?
2、後來我再猜是不是php核心有問題,我把php的相關核心檔案看了一遍,也沒發現問題。結果我就把整個過程跟專案經理說去了。——事情也沒解決,就這樣先不了了之。升級的事情先耽誤著。
今天又發現這個問題,我第一反應是php版本是不是升級了,發現沒有。——後來把整個目錄設定成777就沒事了(chmod 777 -R 目錄)。我想是不是file_exists()方法問題。
所以,我就進行了相關的調試和實驗。
調試代碼:
目錄:
觀察各個許可權:test對www是沒有任何許可權的,而執行檔案index.php有讀寫執行許可權,包含檔案test.txt有讀寫權限。
運行結果:
目錄的執行許可權影響file_exists()
1、給test一個最大的許可權——755
既然成功了,說明file_exists()函數是受目錄許可權的限制的。
那什麼樣的目錄許可權影響file_exists()呢?
我做了幾個實驗:1、檔案的任何上級目錄,只有寫入權限時報檔案不存在;
2、檔案的任何上級目錄,只有讀許可權時也報檔案不存在;
3、而當所有上級目錄都有執行許可權的時候,報檔案是存在的,一切都正常。
結果,說明file_exists()在判斷檔案是否存在的時候是遞迴判斷每個目錄是不是有執行許可權。
修改檔案路徑為相對路徑,得出一樣的結果。
總結
在php手冊上並沒有提到,file_exists會受目錄的執行許可權影響。今通過此文告知那些也有這方面問題的開發人員。僅以此為戒。
附加資訊
感謝大家留的言,非常有用。經過大家的意見我再查了下手冊,確實,如果目錄沒有執行許可權,php-fpm應用進程就不能到這個目錄下面去進行檔案搜尋,當然就認為檔案不存在(實際是認為沒有可執行檔目錄是不存在的)。
手冊內容,大家可以一起斟酌一下,主要是執行許可權。在這裡就不詳談讀寫權限了(一般都很好理解)。
明顯手冊中,對目錄的執行許可權有明確的指示。對目錄的執行許可權,就是擁有被搜尋的權利。
最後我又在php官網找到了一句Warning
如果因為安全模式的限制而導致不能訪問檔案的話,該函數會返回 FALSE。然而,如果檔案在 safe_mode_include_dir 所指定的目錄內的話,仍然可以使用 include 來包含。 這個大家也可注意哈。
http://www.bkjia.com/PHPjc/632216.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632216.htmlTechArticle在我們一般正常情況下使用file_exists 檢查檔案或目錄是否存在是沒有問題了,但要注意一個是安全模式和目錄沒有執行許可權的時就會返回f...