PHP 雜談 坑爹的file_exists

来源:http://www.cnblogs.com/shouce/archive/2016/04/05/5353688.html
-Advertisement-
Play Games

介紹 我發現了一個問題,今天與大家分享。我把整個過程描述一下。 問題 問題 公司有個框架是基於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()   1、給test一個最大的許可權——755

 

既然成功了,說明file_exists()函數是受目錄許可權的限制的。

那什麼樣的目錄許可權影響file_exists()呢?

我做了幾個實驗:

1、文件的任何上級目錄,只有寫許可權時報文件不存在;

2、文件的任何上級目錄,只有讀許可權時也報文件不存在;

3、而當所有上級目錄都有執行許可權的時候,報文件是存在的,一切都正常。

結果,說明file_exists()在判斷文件是否存在的時候是遞歸判斷每個目錄是不是有執行許可權。

 

修改文件路徑為相對路徑,得出一樣的結果。

 

 

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

明顯手冊中,對目錄的執行許可權有明確的指示。對目錄的執行許可權,就是擁有被搜索的權利。  

  推薦   如果這篇文章對你有所幫助,或者也讓你解決了此類問題,請推薦一把,讓哥們有更強的寫作動力。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在第一次插入USB設備時(筆者用的是自己做的USB最小系統來測試),插入電腦後,在設備管理器中會顯示 未知設備,如下圖所示: 點擊右鍵,選擇屬性,在詳細信息中可以看到硬體ID以及PID等,如下圖所示。 根據手冊中的內容,和上述的描述是一致的,如下圖所示: 那麼先預設安裝cypress官網上面的驅動, ...
  • 對於使用FX2的用戶,可以升級到FX2LP,上述的應用筆記《AN4078-C》中就講解了在升級中的註意事項。 必要的修改: 1.晶振的匹配電容需要更改,FX2LP是12pF,不過筆者最近做的最小系統板,用的晶振匹配電容是22pF,沒問題,反而用12pF晶振不能穩定的工作。 2.reset引腳,確認是 ...
  • 準備的文件 新建虛擬機 選擇新建一個空的虛擬機 選擇linux和centos 分配20G的硬碟空間 ' 修改配置 調整記憶體空間 橋接:虛擬機和真實機通訊使用的是真實機的網卡,要占用真是IP NAT:虛擬網卡VMnet8 HOST ONLY :VMnet1 只能和虛擬機通訊,不能上網 安裝CentOS ...
  • 在Linux中,主要編輯器為vi或者vim,本文圍繞vim做簡單的講解說明: Linux預設自帶vi(vim)編輯器,其程式包為: vim 編輯器模式切換: 命令模式 、命令行模式、編輯模式 命令模式: 字元操作 i 當前字元之前插入 I 行首插入 a 當前字元之後插入 A 行尾插入 esc 退出當 ...
  • PHP的語言規範: 1、php中的變數名區分大小寫,但是函數名,類名,方法名,不區分大小寫,但建議區分大小寫 2、php代碼必須書寫在(php標簽),開啟標記(<?php)中間不能空格 3、php代碼每一行以分號結束,最後一行可以省略分號。 4、如果一個Php文件是由純 php代碼組成,那麼php結... ...
  • i = 0def myFun(): global i i=i +1 return i myFun() accumulate( ) total = 0def accumulate(): global total total += 1 return total ...
  • oauth應該屬於security的一部分。關於oauth的的相關知識可以查看阮一峰的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 一、目標 現在很多系統都支持第三方賬號密碼等登陸我們自己的系統,例如:我們經常會看到,一些系統使用微 ...
  • 最近遇到的問題小結: 1.django 工程內不要有與項目名稱相同的文件。會導致無法import settings.py文件。 2.django 的 csrf 問題,當發送post請求時,會要求同時發送csrf token,是為了防止跨站請求偽造。 具體使用方法見官方文檔。 http://docs. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...