php命令行脚本怎么调试_phpcli模式调试教程汇总【教程】

16次阅读

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

php命令行脚本怎么调试_phpcli模式调试教程汇总【教程】

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_errorserror_reporting 是否生效,再查环境变量和 xdebug 模式是否匹配当前 PHP 版本。

text=ZqhQzanResources