CLI模式下需显式启用错误显示:用php -d display_errors=1 -f script.php,或同时设error_reporting=32767;若脚本内禁用则需修改代码;调试时注意输出缓冲、换行及环境变量模拟,并正确配置XDEBUG_MODE适配PHP版本。

php -f 执行时如何看到错误详情
默认情况下,CLI 模式会隐藏 PHP 错误提示(display_errors=Off),哪怕脚本里有 parse error 也只报个空行或 Segmentation fault。必须显式开启错误输出:
- 加
-d display_errors=1参数:比如php -d display_errors=1 -f script.php
- 或临时改
error_reporting:比如php -d error_reporting=32767 -d display_errors=1 -f script.php
(32767 = E_ALL) - 注意:如果脚本里自己调了
error_reporting(0)或ini_set('display_errors', '0'),命令行参数会被覆盖,得去代码里删或注释掉
用 var_dump / print_r 调试但没输出?
CLI 下 var_dump() 默认不带换行和 HTML 格式,容易被后续输出“盖掉”,尤其在循环或管道中;print_r() 默认也不换行。常见表现是:明明执行了,终端却没反应。
- 强制刷新输出缓冲:
var_dump($data); fflush(STDOUT);
- 加换行和类型标识更稳妥:
var_dump($data); echo "\n";
- 对数组/对象,用
print_r($data, true)避免直接输出干扰流程(比如写入日志前拼接字符串) - 别依赖浏览器调试习惯——CLI 没
die()就不会停住,要主动exit;或die();中断流程看中间态
怎么模拟 Web 环境变量($_SERVER、$_ENV)
很多 CLI 脚本会检查 $_SERVER['REQUEST_METHOD'] 或读取 $_ENV['APP_ENV'],直接运行会因缺失而逻辑异常。
- 手动设置环境变量再运行:
APP_ENV=production php script.php
(Linux/macOS)或set APP_ENV=production && php script.php
(Windows cmd) - 在脚本开头补全关键
$_SERVER项:$_SERVER['REQUEST_METHOD'] = 'CLI'; $_SERVER['SCRIPT_NAME'] = __FILE__;
- 避免硬编码判断方式,改用
php_sapi_name() === 'cli'更可靠 - 注意:
getenv()和$_ENV行为受variables_order影响,CLI 下默认可能不自动填充$_ENV,优先用getenv('KEY')
xdebug 在 CLI 下不触发断点?
Web 版 xdebug 常配了 xdebug.mode=debug + 浏览器插件触发,但 CLI 默认不监听,也不传 XDEBUG_SESSION_START。
立即学习“PHP免费学习笔记(深入)”;
- 启用 CLI 调试需加环境变量:
XDEBUG_MODE=debug php script.php
- 确保
xdebug.client_host指向你的 IDE(如127.0.0.1),且xdebug.client_port和 IDE 监听端口一致(默认 9003) - PHP 8.0+ 必须用
XDEBUG_MODE=debug,旧版的XDEBUG_CONFIG="idekey=PHPSTORM"已失效 - 验证是否加载成功:
php -m | grep xdebug
和php -i | grep -A5 "xdebug.mode"
display_errors 和 error_reporting 是否生效,再查环境变量和 xdebug 模式是否匹配当前 PHP 版本。











