PHP file_exists問題雜談
公司有個(gè)框架是基于smarty寫的,我負(fù)責(zé)php的升級(jí),維護(hù)人員把新環(huán)境布上來(lái)之后,測(cè)試人員找我提出經(jīng)常報(bào)錯(cuò)(錯(cuò)誤:提示找不到文件的)。
我追蹤了一下代碼,原來(lái)是smarty的這個(gè)地方報(bào)的錯(cuò)誤。
思考過程:
1、我原以為是程序里沒有這個(gè)文件呢,結(jié)果發(fā)現(xiàn),文件是有的,那是怎么回事?
2、后來(lái)我再猜是不是php內(nèi)核有問題,我把php的相關(guān)內(nèi)核文件看了一遍,也沒發(fā)現(xiàn)問題。結(jié)果我就把整個(gè)過程跟項(xiàng)目經(jīng)理說去了。——事情也沒解決,就這樣先不了了之。升級(jí)的事情先耽誤著。
今天又發(fā)現(xiàn)這個(gè)問題,我第一反應(yīng)是php版本是不是升級(jí)了,發(fā)現(xiàn)沒有。——后來(lái)把整個(gè)目錄設(shè)置成777就沒事了(chmod 777 -R 目錄)。我想是不是file_exists()方法問題。
所以,我就進(jìn)行了相關(guān)的調(diào)試和實(shí)驗(yàn)。
目錄:
觀察各個(gè)權(quán)限:test對(duì)www是沒有任何權(quán)限的,而執(zhí)行文件index.php有讀寫執(zhí)行權(quán)限,包含文件test.txt有讀寫權(quán)限。
運(yùn)行結(jié)果:
既然成功了,說明file_exists()函數(shù)是受目錄權(quán)限的限制的。
那什么樣的目錄權(quán)限影響file_exists()呢?
我做了幾個(gè)實(shí)驗(yàn):
1、文件的任何上級(jí)目錄,只有寫權(quán)限時(shí)報(bào)文件不存在;
2、文件的任何上級(jí)目錄,只有讀權(quán)限時(shí)也報(bào)文件不存在;
3、而當(dāng)所有上級(jí)目錄都有執(zhí)行權(quán)限的時(shí)候,報(bào)文件是存在的,一切都正常。
結(jié)果,說明file_exists()在判斷文件是否存在的時(shí)候是遞歸判斷每個(gè)目錄是不是有執(zhí)行權(quán)限。
修改文件路徑為相對(duì)路徑,得出一樣的結(jié)果。
在php手冊(cè)上并沒有提到,file_exists會(huì)受目錄的執(zhí)行權(quán)限影響。今通過此文告知那些也有這方面問題的開發(fā)者。僅以此為戒。
附加信息
感謝大家留的言,非常有用。經(jīng)過大家的意見我再查了下手冊(cè),確實(shí),如果目錄沒有執(zhí)行權(quán)限,php-fpm應(yīng)用進(jìn)程就不能到這個(gè)目錄下面去進(jìn)行文件搜索,當(dāng)然就認(rèn)為文件不存在(實(shí)際是認(rèn)為沒有可執(zhí)行的目錄是不存在的)。
手冊(cè)內(nèi)容,大家可以一起斟酌一下,主要是執(zhí)行權(quán)限。在這里就不詳談讀寫權(quán)限了(一般都很好理解)。
相關(guān)文章
PHP實(shí)現(xiàn)的購(gòu)物車類實(shí)例
這篇文章主要介紹了PHP實(shí)現(xiàn)的購(gòu)物車類,可實(shí)現(xiàn)購(gòu)物車基本的加入、刪除、統(tǒng)計(jì)等相關(guān)功能,需要的朋友可以參考下2015-06-06再Docker中架設(shè)完整的WordPress站點(diǎn)全攻略
這篇文章主要介紹了再Docker中架設(shè)完整的WordPress站點(diǎn)全攻略,Docker是當(dāng)下最火爆的虛擬機(jī)類技術(shù),需要的朋友可以參考下2015-07-07PHP將MySQL的查詢結(jié)果轉(zhuǎn)換為數(shù)組并用where拼接的示例
這篇文章主要介紹了PHP將MySQL的查詢結(jié)果轉(zhuǎn)換為數(shù)組并用where拼接的示例,這樣處理where條件時(shí)便可以在一定程度上優(yōu)化查詢和轉(zhuǎn)化的性能,需要的朋友可以參考下2016-05-05PHP實(shí)現(xiàn)的文件操作類及文件下載功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的文件操作類及文件下載功能,結(jié)合實(shí)例形式分析了php針對(duì)文件的讀、寫、創(chuàng)建及下載等功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-12-12ThinkPHP的RBAC(基于角色權(quán)限控制)深入解析
本篇文章是對(duì)ThinkPHP的RBAC(基于角色權(quán)限控制)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06比較strtr, str_replace和preg_replace三個(gè)函數(shù)的效率
本篇文章是對(duì)strtr, str_replace和preg_replace三個(gè)函數(shù)的效率問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06