PHP通过错误常量组合定义日志记录的粒度,常见常量及含义如下:
trigger_error()触发)。常用组合示例:
E_ALL & ~E_NOTICE:报告所有错误,但忽略通知(平衡详细性与噪音);E_ERROR | E_WARNING:仅记录致命错误和警告(适合生产环境减少日志量)。php.ini是PHP的全局配置文件,修改后会影响所有通过该配置运行的PHP进程(包括Apache、CLI等)。
定位php.ini文件:
/etc/php/{php_version}/apache2/php.ini(如/etc/php/8.1/apache2/php.ini);/etc/php/{php_version}/cli/php.ini;/etc/php/{php_version}/fpm/php.ini(部分系统可能整合到www.conf中)。
可通过php --ini(CLI)或phpinfo()(网页)命令确认路径。修改关键参数: 打开php.ini文件,找到并修改以下参数(取消注释若被禁用):
error_reporting = E_ALL & ~E_NOTICE # 设置日志级别(示例:忽略通知)
log_errors = On # 启用日志记录
error_log = /var/log/php_errors.log # 指定日志文件路径(需确保PHP进程有写入权限)
注:
error_log路径需使用绝对路径,且目录权限需设置为755(文件权限644),避免因权限问题导致日志无法写入。
重启Web服务: 修改完成后,重启Apache或PHP-FPM使配置生效:
sudo systemctl restart apache2 # Apache
sudo systemctl restart php8.1-fpm # PHP-FPM(版本替换为实际值)
若使用PHP-FPM(FastCGI进程管理器),可通过其专属配置文件覆盖php.ini设置,实现更细粒度的控制。
修改PHP-FPM池配置:
编辑/etc/php/{php_version}/fpm/pool.d/www.conf(默认池配置),添加/修改以下参数:
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE # 强制覆盖php.ini的error_reporting
php_admin_flag[log_errors] = on # 强制开启日志
php_admin_value[error_log] = /var/log/php-fpm/www-error.log # 指定FPM专用日志路径
catch_workers_output = yes # 捕获子进程输出(可选,用于调试)
注:
php_admin_value/php_admin_flag为强制配置,优先级高于php.ini中的同名参数。
重启PHP-FPM服务:
sudo systemctl restart php8.1-fpm
若使用Nginx作为Web服务器,需确保Nginx能正确传递PHP错误到PHP-FPM日志。
配置Nginx错误日志级别:
编辑Nginx主配置文件(/etc/nginx/nginx.conf或站点配置文件),设置error_log级别:
error_log /var/log/nginx/error.log warn; # 可选级别:debug/info/notice/warn/error/crit
注:此配置仅影响Nginx自身的日志,不影响PHP错误日志。
确保PHP-FPM接收错误:
在Nginx的PHP-FPM配置块(如location ~ \.php$)中,确认fastcgi_param包含错误相关参数:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP-FPM监听地址
include fastcgi_params;
fastcgi_param PHP_VALUE "error_log=/var/log/php-fpm/www-error.log"; # 可选:重复强调日志路径
}
重启Nginx:
sudo systemctl restart nginx
若需临时调整日志级别(如脚本调试),可在PHP代码中使用ini_set()函数:
<?php
// 动态设置日志级别(仅当前脚本有效)
ini_set('error_reporting', E_ALL & ~E_NOTICE);
ini_set('log_errors', 1);
ini_set('error_log', '/tmp/php_debug.log'); // 临时日志路径(需可写)
// 测试日志
trigger_error('This is a user notice', E_USER_NOTICE);
?>
注:动态设置无法覆盖php.ini中的
disable_functions限制(如禁用了ini_set),且生产环境不建议长期使用。
error_log指定的路径下是否有新日志生成(如/var/log/php_errors.log)。test.php),写入以下内容:<?php
trigger_error('Test warning message', E_USER_WARNING); // 触发用户警告
echo $undefined_var; // 触发E_NOTICE(若未忽略)
?>
访问该脚本后,检查日志文件是否记录了对应错误信息。phpinfo()函数查看当前配置是否生效(访问phpinfo.php页面,搜索error_reporting和error_log)。error_log路径的目录权限允许PHP进程写入(如/var/log/目录通常属主为root,组为syslog,权限755;文件权限644)。logrotate),避免日志文件过大占用磁盘空间。chmod 600 /var/log/php_errors.log),防止未授权访问。