应使用 ob_start() + ob_get_clean() 捕获 phpinfo() 输出再写入日志,或提取关键配置项以纯文本记录;生产环境禁用完整 HTML 日志,CLI 下推荐 php -i 重定向。

不能直接把 phpinfo() 输出写入日志文件——它默认向标准输出(浏览器或 CLI stdout)发送 HTML 内容,且内部做了输出缓冲和 header 控制,强行捕获容易失败或写入乱码。
用 ob_start() + ob_get_clean() 捕获 HTML 输出
这是最常用也最可靠的方式:开启输出缓冲,调用 phpinfo(),再从中取出字符串内容。注意必须在调用前关闭所有已启用的缓冲层(比如某些框架会自动开启),否则可能捕获不到。
-
phpinfo()必须在缓冲开启后、关闭前调用,顺序不能颠倒 - 不要用
ob_get_contents()后不清除缓冲,会导致重复输出或后续响应异常 - 若日志路径不可写,
file_put_contents()会静默失败,建议加is_writable()判断
ob_start();
phpinfo();
$info_html = ob_get_clean();
file_put_contents('/var/log/phpinfo.log', $info_html . "\n" . str_repeat('-', 80) . "\n", FILE_APPEND | LOCK_EX);
只记录关键配置项,避免 HTML 和敏感信息
生产环境不建议记录完整 phpinfo() HTML,体积大、含敏感字段(如 $_SERVER['DOCUMENT_ROOT']、扩展路径)、不易 grep。更安全的做法是提取关键变量,转为纯文本。
- 用
ini_get('display_errors')、extension_loaded('curl')等代替整页扫描 -
get_loaded_extensions()和get_defined_constants(true)可用于检查扩展与常量状态 - 避免记录
$_SERVER全量内容,尤其HTTP_COOKIE、PHP_AUTH_PW等字段
$log_entry = date('Y-m-d H:i:s') . " | PHP_VERSION: " . PHP_VERSION
. " | DISPLAY_ERRORS: " . ini_get('display_errors')
. " | EXT_CURL: " . (extension_loaded('curl') ? 'yes' : 'no') . "\n";
file_put_contents('/var/log/php-config.log', $log_entry, FILE_APPEND | LOCK_EX);
CLI 场景下用 php -i 重定向到文件(不依赖 PHP 脚本)
如果只是临时排查,且有服务器 shell 权限,直接用命令行执行更轻量、无 PHP 脚本依赖,也不受 web 服务器配置影响。
立即学习“PHP免费学习笔记(深入)”;
-
php -i输出的是纯文本,比phpinfo()的 HTML 更适合日志解析 - 加
2>&1可同时捕获 stderr(比如某些扩展报错) - 注意权限:确保运行用户对目标日志路径有写权限,否则会提示
Permission denied
php -i > /var/log/php-info-cli.log 2>&1
真正麻烦的不是“怎么写进去”,而是“写什么”和“谁能看到”。HTML 格式难解析、敏感路径暴露、日志轮转缺失——这些比技术实现更容易引发问题。











