
`xdebug_info()` 输出的是 php 当前运行时实际加载并生效的 xdebug 配置,完全真实可靠;所谓“旧值”现象通常源于配置未正确重载,而非函数本身误导。
在 Ubuntu 20.04(及类似 LAMP 环境)中,执行 xdebug_info() 后仍看到旧配置,根本原因并非 Xdebug “缓存”或“显示假象”,而是 PHP 进程未真正重新加载更新后的配置。尤其当使用 Apache 作为 Web 服务器时,需注意以下关键点:
✅ 正确重载 Xdebug 配置的步骤
-
确认配置文件路径正确
你修改的是 /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
-
重启对应 SAPI 的服务,而非仅 reload
service apache2 reload 或 force-reload 不会重启 PHP 子进程,而 Xdebug 是模块级扩展,其 ini 设置仅在 PHP 启动时读取。因此必须 完全重启 Apache:sudo systemctl restart apache2
⚠️ 注意:reload 仅重读 Apache 配置,不终止已有 PHP(mod_php)工作进程;只有 restart 才会重建全部子进程,从而加载新 ini 值。
-
验证 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
-
检查 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 ; 启用日志便于排错
-
终极验证:清除所有缓存并强制重载
# 清理 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、彻底重启服务、交叉验证配置路径,即可一劳永逸解决“旧值幻觉”。










