short_open_tag对cli模式完全无效,仅影响web sapi;cli默认不解析

short_open_tag 设置对 CLI 模式完全无效——它只影响 Web SAPI(如 Apache、PHP-FPM)下的 PHP 解析行为。CLI 默认不启用短标签,且该设置在命令行中始终被忽略。
为什么 php -f script.php 不报错但没输出?
这不是 short_open_tag 的问题,而是脚本本身可能用了 ?> 或 = ?>,而 CLI 环境下这些标签根本不会被识别为 PHP 代码,直接当纯文本跳过。PHP 解释器看到 echo "hello"; ?>,会原样输出这行,而不是执行。
- CLI 的
short_open_tag值恒为Off,哪怕你在 php.ini 里设成On,php -i | grep short_open_tag仍显示0 -
= ?>是例外:从 PHP 5.4 起,它被硬编码支持,CLI 和 Web 下都可用,不依赖short_open_tag - 真正要检查的是:你是否误把 Web 风格的模板(含大量
?>)直接丢进 CLI 执行
如何验证当前 CLI 是否真在“执行”PHP?
别依赖 echo 输出,先用最基础的语法确认解析器是否工作:
- 写一个
test.php,内容只有:<?php var_dump(function_exists('date')); - 运行
php -f test.php,如果输出bool(true),说明 PHP 正常执行;如果输出原样代码或空白,说明文件没被当作 PHP 解析——大概率是用了?>开头且无php关键字 - 再试
="hello";?>,它应该能输出hello,因为=是强制支持的
CLI 下想安全使用短回显,只用 =
= 是唯一跨环境、无需配置、无兼容性风险的短标签。其他所有 ?> 形式在 CLI 中都不可靠,尤其当你需要把 Web 模板复用到命令行任务(如导出、批量处理)时,必须提前替换或重构。
- 批量清理旧模板中的
:用sed -i 's/ \(.*\);?>/<?php \1; ?>/g' *.php(Linux/macOS) - 不要指望
.htaccess或ini_set()在 CLI 生效——它们压根不加载 - 若必须保留
?>风格,只能改用php -d short_open_tag=On -f script.php,但这是临时 hack,不推荐用于生产脚本
真正容易被忽略的点是:开发时在浏览器里跑通了,就默认 CLI 也能一样执行——其实两者连解析器入口都不一样,short_open_tag 只是表层差异,底层行为隔离得非常彻底。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











