Xdebug 配置生效问题:xdebug_info() 显示的值是否实时准确?

`xdebug_info()` 输出的是 php 当前运行时实际加载并生效的 xdebug 配置,完全真实可靠;所谓“旧值”现象通常源于配置未正确重载,而非函数本身误导。

在 Ubuntu 20.04(及类似 LAMP 环境)中,执行 xdebug_info() 后仍看到旧配置,根本原因并非 Xdebug “缓存”或“显示假象”,而是 PHP 进程未真正重新加载更新后的配置。尤其当使用 Apache 作为 Web 服务器时,需注意以下关键点:

✅ 正确重载 Xdebug 配置的步骤

  1. 确认配置文件路径正确
    你修改的是 /etc/php/8.1/mods-available/xdebug.ini —— 这是正确的启用模板路径,但必须确保该文件已被符号链接到对应 SAPI 的配置目录:

    # 检查是否已启用(对 Apache)
    ls -l /etc/php/8.1/apache2/conf.d/20-xdebug.ini
    # 应指向 mods-available/xdebug.ini
  2. 重启对应 SAPI 的服务,而非仅 reload
    service apache2 reload 或 force-reload 不会重启 PHP 子进程,而 Xdebug 是模块级扩展,其 ini 设置仅在 PHP 启动时读取。因此必须 完全重启 Apache

    sudo systemctl restart apache2
    ⚠️ 注意:reload 仅重读 Apache 配置,不终止已有 PHP(mod_php)工作进程;只有 restart 才会重建全部子进程,从而加载新 ini 值。
  3. 验证 PHP CLI 与 Web SAPI 是否分离
    xdebug_info() 在网页中调用时反映的是 Apache + mod_php 的配置;而你在终端运行 php -v 或 php --ini 查看的是 CLI SAPI 的配置。二者可能不同:

    # 查看 Web 环境实际加载的配置(在 PHP 脚本中输出):
    
    # 对比 CLI:
    php --ini

    若你只改了 mods-available/xdebug.ini,需确保它同时被 apache2 和 cli 启用(或分别链接):

    sudo phpenmod -s apache2 xdebug
    sudo phpenmod -s cli xdebug
  4. 检查 Xdebug 版本兼容性与启用状态
    Xdebug 3+ 默认禁用调试功能(如 xdebug.start_with_request = off),即使扩展已加载,xdebug_info() 中的 Enabled 字段为 ✅,但调试器相关设置(如 client_host, client_port)可能未激活。请确认:

    ; /etc/php/8.1/apache2/conf.d/20-xdebug.ini
    zend_extension=xdebug.so
    xdebug.mode=debug
    xdebug.client_host=localhost
    xdebug.client_port=9009
    xdebug.log=/var/log/xdebug.log  ; 启用日志便于排错
  5. 终极验证:清除所有缓存并强制重载

    # 清理 OPCache(如有启用)
    sudo systemctl restart php8.1-fpm  # 若使用 FPM
    sudo systemctl restart apache2
    # 清空浏览器缓存或使用隐身窗口访问 xdebug_info() 页面

? 补充说明:为什么“重启电脑才生效”?

这通常是因误以为 reload 已生效,实则旧 Apache 进程仍在运行;或系统中存在多个 PHP 版本/配置副本(如通过 ppa:ondrej/php 安装后残留旧配置),导致你以为修改了 A 文件,实际加载的是 B 文件。使用 php_ini_loaded_file() 和 phpinfo() 是唯一可信的验证方式。

总之:xdebug_info() 从不撒谎——它永远告诉你此刻真实的运行态。问题永远出在“你认为已生效的配置,其实并未进入当前 PHP 进程”。精准定位 SAPI、彻底重启服务、交叉验证配置路径,即可一劳永逸解决“旧值幻觉”。