不能直接用 cron 执行 phpinfo() 保存 HTML,因 CLI 模式缺失 Web SAPI 环境,导致配置加载不全、$_SERVER 为空、输出非标准 HTML;正确做法是部署内网 phpinfo.php 并用 curl 定时抓取。

不能直接用 cron 定时执行 phpinfo() 并保存 HTML——因为 phpinfo() 依赖完整的 PHP SAPI 环境(如 Web Server 的 headers、request context),命令行下运行会缺失大量模块信息或报错,且输出格式错乱。
为什么 php -r "phpinfo();" > info.html 不可靠
CLI 模式下的 phpinfo() 和 Web 模式差异极大:
- 不加载
.htaccess或php_admin_value类配置 - 扩展加载状态可能不同(比如
opcache在 CLI 默认关闭) -
$_SERVER变量为空或极简,导致“Loaded Configuration File”等字段显示为no value - 输出是纯文本流,不是标准 HTML,浏览器打开后样式错乱、无折叠/搜索功能
正确做法:用 Web 环境 + curl 定时抓取
在服务器上部署一个仅限内网访问的 phpinfo.php,再用 cron 调用 curl 抓取其响应并保存。这是唯一能反映真实运行环境的方式。
操作步骤:
立即学习“PHP免费学习笔记(深入)”;
- 把
phpinfo.php放到 Web 可访问目录(如/var/www/html/phpinfo.php),内容为: - 确保该文件无法被公网访问(Nginx/Apache 配置中限制 IP,或放在非 DocumentRoot 下并通过 alias 暴露)
- 添加定时任务:
0 3 * * * /usr/bin/curl -s http://localhost/phpinfo.php > /var/log/phpinfo_$(date +\%Y\%m\%d).html 2>/dev/null
- 加个清理脚本(可选),避免日志无限膨胀:
find /var/log -name "phpinfo_*.html" -mtime +30 -delete
进阶:自动比对配置变更
如果需要监控 PHP 配置是否被意外修改,可在保存的同时生成摘要:
- 用
curl抓取后,用grep提取关键行生成简版快照:curl -s http://localhost/phpinfo.php | grep -E "(PHP Version|Loaded Configuration File|extension_dir|memory_limit|upload_max_filesize)" > /var/log/php_summary_$(date +\%Y\%m\%d).txt
- 再用
diff对比前后两天的php_summary_*.txt,配合邮件通知(mail -s "PHP config changed" admin@example.com ) - 注意:不要对完整
phpinfo()做diff,HTML 中时间戳、进程 ID 等动态内容会导致误报
真正有效的存档,必须和线上环境同源同路径同权限。任何绕过 Web SAPI 的“简化方案”,最后查问题时都会少掉最关键的一块拼图。











