PHP脚本Shebang行被include时输出内容的问题及解决咨询
问题原因
这不是PHP的bug,是正常行为:
- PHP只会解析
<?php和?>标签之间的代码,标签之前的所有文本都会直接输出到终端或网页。 - PHP CLI在直接执行脚本时,会自动跳过第一行以
#!/开头的shebang行,所以命令行执行时不会输出这行;但当用include引入脚本时,PHP不会跳过这行,因此会被当作普通文本输出。
解决方案
可以通过判断脚本是否被引入,结合输出缓冲来过滤掉shebang行,既保留命令行直接执行的能力,又避免include时输出多余内容。
修改你的mytest.php如下:
#!/usr/bin/env php <?php // 判断当前脚本是否被其他文件include $isIncluded = (__FILE__ !== $_SERVER['SCRIPT_FILENAME']); if ($isIncluded) { // 开启输出缓冲,捕获所有输出内容 ob_start(); } // -------------------------- // 这里写你的业务代码 echo "测试内容"; // -------------------------- if ($isIncluded) { // 获取缓冲内容并清理缓冲 $output = ob_get_clean(); // 移除开头的shebang行 $output = preg_replace('/^#!/usr/bin/env php\s+/', '', $output); // 输出处理后的内容 echo $output; }
原理说明
- 当直接执行
./mytest.php时,__FILE__等于$_SERVER['SCRIPT_FILENAME'],不会触发缓冲逻辑,PHP CLI自动忽略shebang行,正常输出业务内容。 - 当被
include时,开启输出缓冲捕获所有内容(包括shebang行),然后通过正则移除开头的shebang行,再输出处理后的内容,避免多余输出。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

