/ php

php-error

显示错误

ini_set('display_errors','On');
error_reporting(E_ALL);

//code ...

记录错误

php 中错误日志配置

/etc/php.ini

display_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On
error_log = /var/log/php_errors.log

php 的配置中的log_errorserror_log 这两项配置会被 php-fpm 的配置覆盖掉,保持默认不修改就好吧。

php-fpm 中错误日志控制

记录 php-fpm 自身错误日志

/etc/php-fpm.conf 中的 error_log 是为 php-fpm 自身准备记录日志的文件 error.log

error_log = /var/log/php-fpm/error.log

记录 php 代码产生的错误日志

/etc/php-fpm.d/www.conf 中的日志记录的是代码中产生的错误的日志文件 www-error.log

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on

代码中调用 trigger_error('xxx'),默认会写到上面定义的文件 /var/log/php-fpm/www-error.log

**注意:**如果没有权限没有日志没有写进去,说明 php-fpm 的运行身份有问题。建议保持默认值 apache,转而将项目所属用户更改为 apache,来保证 php 读写文件的权限。

为了更灵活的应对多个项目,可以每个项目新建一个配置文件,来定义项目对应的日志文件:

/etc/php-fpm.d/blog.conf

php_admin_value[error_log] = /var/log/php-fpm/blog-error.log
php_admin_flag[log_errors] = on

/etc/php-fpm.d/formu.conf

php_admin_value[error_log] = /var/log/php-fpm/formu-error.log
php_admin_flag[log_errors] = on

trigger_error的日志输出到哪里?

情况1:未调用 set_error_handler 指定的错误处理函数时,会写进 php-fpm 中项目配置文件 /etc/php-fpm.d/blog.conf 中指定的日志文件,注意,如果 php-fpm 所运行用户身份没有写该日志文件的权限,则不会产生日志。

情况2:调用 set_error_handler 指定了指定的错误处理函数,那就得看自定义的错误处理函数把错误日志输出到哪里了!一般使用类似 Laravel、Yii、Ci 等开发框架时要注意。

error_reporting() - 设置应该报告何种 PHP 错误
set_error_handler() - 设置用户自定义的错误处理函数
restore_exception_handler() - 恢复之前定义过的异常处理函数。
trigger_error() - 产生一个用户级别的 error/warning/notice 信息

如果是框架内的代码

框架一般默认会使用 set_error_handler 接管错误处理。

set_error_handler()

trigger_error()

trigger_error 有 3 个错误类型:

E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE (this is default)

if ($divisor == 0) {
    trigger_error("Cannot divide by zero", E_USER_ERROR);
}

error_log()

error_log() 相比 trigger_error() 更加灵活:

// 如果无法连接到数据库,发送通知到服务器日志
if (!Ora_Logon($username, $password)) {
    error_log("Oracle database not available!", 0);
}

// 如果用尽了 FOO,通过邮件通知管理员
if (!($foo = allocate_new_foo())) {
    error_log("Big trouble, we're all out of FOOs!", 1,
               "operator@example.com");
}

// 调用 error_log() 的另一种方式:
error_log("You messed up!", 3, "/var/tmp/my-errors.log");