PHP file_exists問題雜談
更新時間:2012年05月07日 18:43:26 作者:
我發(fā)現了一個問題,今天與大家分享。我把整個過程描述一下
問題
公司有個框架是基于smarty寫的,我負責php的升級,維護人員把新環(huán)境布上來之后,測試人員找我提出經常報錯(錯誤:提示找不到文件的)。
我追蹤了一下代碼,原來是smarty的這個地方報的錯誤。
思考過程:
1、我原以為是程序里沒有這個文件呢,結果發(fā)現,文件是有的,那是怎么回事?
2、后來我再猜是不是php內核有問題,我把php的相關內核文件看了一遍,也沒發(fā)現問題。結果我就把整個過程跟項目經理說去了?!虑橐矝]解決,就這樣先不了了之。升級的事情先耽誤著。
今天又發(fā)現這個問題,我第一反應是php版本是不是升級了,發(fā)現沒有。——后來把整個目錄設置成777就沒事了(chmod 777 -R 目錄)。我想是不是file_exists()方法問題。
所以,我就進行了相關的調試和實驗。
總結
在php手冊上并沒有提到,file_exists會受目錄的執(zhí)行權限影響。今通過此文告知那些也有這方面問題的開發(fā)者。僅以此為戒。
附加信息
感謝大家留的言,非常有用。經過大家的意見我再查了下手冊,確實,如果目錄沒有執(zhí)行權限,php-fpm應用進程就不能到這個目錄下面去進行文件搜索,當然就認為文件不存在(實際是認為沒有可執(zhí)行的目錄是不存在的)。
手冊內容,大家可以一起斟酌一下,主要是執(zhí)行權限。在這里就不詳談讀寫權限了(一般都很好理解)。
公司有個框架是基于smarty寫的,我負責php的升級,維護人員把新環(huán)境布上來之后,測試人員找我提出經常報錯(錯誤:提示找不到文件的)。
我追蹤了一下代碼,原來是smarty的這個地方報的錯誤。

思考過程:
1、我原以為是程序里沒有這個文件呢,結果發(fā)現,文件是有的,那是怎么回事?
2、后來我再猜是不是php內核有問題,我把php的相關內核文件看了一遍,也沒發(fā)現問題。結果我就把整個過程跟項目經理說去了?!虑橐矝]解決,就這樣先不了了之。升級的事情先耽誤著。
今天又發(fā)現這個問題,我第一反應是php版本是不是升級了,發(fā)現沒有。——后來把整個目錄設置成777就沒事了(chmod 777 -R 目錄)。我想是不是file_exists()方法問題。
所以,我就進行了相關的調試和實驗。

調試代碼:

目錄:

觀察各個權限:test對www是沒有任何權限的,而執(zhí)行文件index.php有讀寫執(zhí)行權限,包含文件test.txt有讀寫權限。


運行結果:


目錄的執(zhí)行權限影響file_exists()
1、給test一個最大的權限——755



既然成功了,說明file_exists()函數是受目錄權限的限制的。
那什么樣的目錄權限影響file_exists()呢?
我做了幾個實驗:
1、文件的任何上級目錄,只有寫權限時報文件不存在;
2、文件的任何上級目錄,只有讀權限時也報文件不存在;
3、而當所有上級目錄都有執(zhí)行權限的時候,報文件是存在的,一切都正常。
結果,說明file_exists()在判斷文件是否存在的時候是遞歸判斷每個目錄是不是有執(zhí)行權限。
修改文件路徑為相對路徑,得出一樣的結果。


在php手冊上并沒有提到,file_exists會受目錄的執(zhí)行權限影響。今通過此文告知那些也有這方面問題的開發(fā)者。僅以此為戒。
附加信息
感謝大家留的言,非常有用。經過大家的意見我再查了下手冊,確實,如果目錄沒有執(zhí)行權限,php-fpm應用進程就不能到這個目錄下面去進行文件搜索,當然就認為文件不存在(實際是認為沒有可執(zhí)行的目錄是不存在的)。
手冊內容,大家可以一起斟酌一下,主要是執(zhí)行權限。在這里就不詳談讀寫權限了(一般都很好理解)。


相關文章
PHP表單遞交控件名稱含有點號(.)會被轉化為下劃線(_)的處理方法
做項目的過程中發(fā)現,表單遞交就是不成功,后來發(fā)現原來我給控件的名字不規(guī)范導致,控件遞交到后端之后,發(fā)現所有我控件名字中含有.號的名字,遞交過之后都會被轉化成下劃線_2013-01-01

