當前位置: 首頁> 最新文章列表> 在PHP 中使用is_executable 配合file_get_contents 時會遇到哪些常見問題?如何避免這些問題?

在PHP 中使用is_executable 配合file_get_contents 時會遇到哪些常見問題?如何避免這些問題?

gitbox 2025-06-12

在日常開發中, is_executable()file_get_contents()php中兩個看似簡單但實用的函數。 is_executable )用於判斷文件是否具有可執行權限

一、常見問題分析

1.誤用is_executable判斷遠程url

is_executable()是專門用於檢查本地文件是否可執行的函數。如果你嘗試對一個url使用它,例如::

 <span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'https://gitbox.net/scripts/remote-check.php'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_executable</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
}
</span></span>

這段代碼會失敗,因為is_executable()只接受本地文件路徑。傳入一個url false,並可能觸發警告。 php並不會解析url的權限或可執行性,因此這種寫法邏輯上是錯誤的。 ,因此這種寫法邏輯上是錯誤

2.權限問題導致讀取失敗

即使是本地文件,在使用file_get_contents()時也需要具備讀取權限。很多開發者以為is_executable()返回true就表示一切正常,但實際上, x ),x),而沒有讀取權限( r ),那麼file_get_contents()

 <span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-string">'/usr/local/bin/script.sh'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_executable</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
    </span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>); </span><span><span class="hljs-comment">// &#21487;&#33021;&#22833;&#36133;&#65292;&#25243;&#20986; warning</span></span><span>
}
</span></span>

在這種情況下,建議先用iS_redable()判斷文件是否可讀。

3.文件路徑錯誤或文件不存在

很多時候路徑錯誤並不會立刻暴露出來,尤其是在用is_executable()判斷後接file_get_contents()的場景中。一個不存在的文件會導致is_executable()返回false ,可能不會產生任何提示,而file_get_contents()則可能拋出警告:

 <span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-string">'/path/to/missing-file'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_executable</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
    </span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>); </span><span><span class="hljs-comment">// &#26681;&#26412;&#19981;&#20250;&#25191;&#34892;</span></span><span>
}
</span></span>

雖然代碼不會出錯執行,但邏輯會悄悄“失敗”,使調試變得困難。

4.錯誤使用結合允許_URL_FOPEN設置

如果你嘗試通過url file_get_contents() ,而服務器的php.ini中關閉了允許_url_fopen ,會直接導致無法讀取遠程內容,即使url是有效的::

 <span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'https://gitbox.net/data/info.json'</span></span><span>;
</span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>); </span><span><span class="hljs-comment">// &#33509; allow_url_fopen = Off&#65292;&#21017;&#20250;&#22833;&#36133;</span></span><span>
</span></span>

這與is_executable()無關

二、如何避免這些問題?

? 明確分離本地與遠程資源的處理邏輯

避免對url使用iS_executable() ,也不要試圖對其進行任何與文件權限相關的判斷。建議通過簡單的正則或parse_url()來判斷資源類型:

 <span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-string">'https://gitbox.net/scripts/check.php'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">filter_var</span></span><span>(</span><span><span class="hljs-variable">$target</span></span><span>, FILTER_VALIDATE_URL)) {
    </span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$target</span></span><span>);
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_executable</span></span><span>(</span><span><span class="hljs-variable">$target</span></span><span>) &amp;&amp; </span><span><span class="hljs-title function_ invoke__">is_readable</span></span><span>(</span><span><span class="hljs-variable">$target</span></span><span>)) {
    </span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$target</span></span><span>);
}
</span></span>

? 使用is_redable()搭配is_executable()

如果目標是本地文件,建議同時判斷是否可執行和可讀取::

 <span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-string">'/usr/local/bin/myscript.sh'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_executable</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>) &amp;&amp; </span><span><span class="hljs-title function_ invoke__">is_readable</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
    </span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span></span>

? 捕獲異常或使用錯誤控制

即使進行了判斷,仍可能發生錯誤(比如文件在判斷之後被刪除)。推薦使用@file_get_contents()try-catch結合stream_context_create() (尤其是遠程讀取時):

 <span><span><span class="hljs-variable">$content</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">'https://gitbox.net/api/status.json'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$content</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"&#35835;&#21462;&#22833;&#36133;&#65292;&#35831;&#26816;&#26597;URL&#25110;&#32593;&#32476;&#37197;&#32622;"</span></span><span>);
}
</span></span>

? 檢查php配置項

使用遠程url

<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ini_get</span></span><span>(</span><span><span class="hljs-string">'allow_url_fopen'</span></span><span>)) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"&#36828;&#31243;&#25991;&#20214;&#35835;&#21462;&#34987;&#31105;&#27490;&#65292;&#35831;&#20462;&#25913;php.ini&#37197;&#32622;"</span></span><span>);
}
</span></span>

三、結語

雖然is_executable()file_get_contents()在php中都是基礎函數,但當兩者組合使用時