如何在Zend Expressive 2.0.5中将PHP错误记录到PHP错误日志文件?
解决Zend Expressive 2.0.5将PHP错误写入原生PHP错误日志的方案
我来帮你搞定这个问题!结合你已经做的自定义ErrorHandlerFactory操作,咱们调整细节就能实现把PHP错误写入原生错误日志的需求:
1. 完善自定义ErrorHandlerFactory的监听器逻辑
你已经给Zend Stratigility的ErrorHandler添加了监听器,现在把第一个监听器改成直接调用PHP原生错误日志函数,就能把错误信息写入PHP自身的日志文件。示例代码如下:
<?php namespace App\Container; use Interop\Container\ContainerInterface; use Zend\Stratigility\ErrorHandler; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; class ErrorHandlerFactory { public function __invoke(ContainerInterface $container) { $errorHandler = new ErrorHandler(); // 第一个监听器:写入PHP原生错误日志 $errorHandler->attachListener(function ( ServerRequestInterface $request, ResponseInterface $response, \Throwable $error ) { // 格式化错误信息,包含关键调试信息 $errorLogContent = sprintf( '[%s] %s: %s in %s on line %d', date('Y-m-d H:i:s'), get_class($error), $error->getMessage(), $error->getFile(), $error->getLine() ); // 调用PHP原生error_log函数,直接写入PHP错误日志 error_log($errorLogContent); }); // 第二个监听器保留你原有的业务逻辑(比如返回前端错误响应) $errorHandler->attachListener(function ( ServerRequestInterface $request, ResponseInterface $response, \Throwable $error ) { // 这里写你原本的响应处理逻辑,比如返回JSON格式错误 $response = $response->withStatus(500); $response->getBody()->write(json_encode([ 'code' => 500, 'message' => '服务器内部错误' ])); return $response; }); return $errorHandler; } }
2. 注册自定义Factory到依赖配置
在项目的config/config.php中,把默认的ErrorHandler替换成你的自定义Factory:
return [ 'dependencies' => [ 'factories' => [ Zend\Stratigility\ErrorHandler::class => App\Container\ErrorHandlerFactory::class, ], ], ];
3. 检查PHP错误日志配置
确保你的php.ini里的错误日志相关配置正确生效:
log_errors = On:开启错误日志记录error_log:指定PHP错误日志的具体路径(比如/var/log/php/errors.log)error_reporting:设置需要记录的错误级别,推荐E_ALL & ~E_DEPRECATED & ~E_STRICT
可以通过执行phpinfo()查看当前配置状态,确认这些参数已正确设置。
4. 测试验证
写一个简单的路由触发错误来验证:
$app->get('/test-error', function () { // 触发一个未定义函数的致命错误 undefinedTestFunction(); });
访问该路由后,查看你php.ini指定的错误日志文件,就能看到对应的错误记录了。
内容的提问来源于stack exchange,提问作者Ashish Ranjan
相关产品推荐
相关产品推荐

