現在の位置: ホーム> 最新記事一覧> phpでfile_get_contentsでis_executableを使用する場合、どのような一般的な問題が発生しますか?これらの問題を回避する方法は?

phpでfile_get_contentsでis_executableを使用する場合、どのような一般的な問題が発生しますか?これらの問題を回避する方法は?

gitbox 2025-06-12

在日常开发中、 is_executable()file_get_contents )是php

一、常见问题分析

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 )、而没有读取权限( 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_readable()判断文件是否可读。

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. alow_url_fopen设置

如果你尝试通url使用file_get_contents() 、而服务器的php.ini

 <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()无关、但在组合使用时更容易造成混淆、尤其是开发者误以为是is_executable()造成的问题。

二、如何避免这些问题?

? 明确分离本地与远程资源的处理逻辑

避免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_readable()搭配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请确认php.ini

 <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中都是基础函数、但当两者组合使用时、开发者需要对本地与远程资源、文件权限、 php 配置等方面有更清晰的认识。通过明确分工、合理判断、提前配置检查、我们可以有效避免大多数隐性问题、提高代码的稳定性和可维护性。