GAE php74标准环境下PHP错误与HTTP请求的关联方案咨询
Google App Engine PHP7.4 标准环境PHP错误与HTTP请求关联实现方案
实现原理
PHP5.5 GAE运行时的日志关联是运行时层面原生内置的能力,PHP7+运行时调整了架构,不再默认处理PHP错误的上下文绑定,需要手动注册全局错误处理钩子,将当前请求的trace上下文注入到错误日志中,即可实现和PHP5.5版本一致的关联效果。
具体操作步骤
- 第一步:安装依赖库
通过composer安装Google官方Cloud Logging相关依赖:composer require google/cloud-logging - 第二步:在应用入口文件初始化日志实例并获取请求trace上下文
GAE标准环境会在每个请求的X-Cloud-Trace-Context请求头中携带本次请求的唯一trace ID,直接解析即可获取:<?php require __DIR__ . '/vendor/autoload.php'; use Google\Cloud\Logging\LoggingClient; // 从环境变量读取项目ID,GAE环境会自动注入该变量 $projectId = getenv('GOOGLE_CLOUD_PROJECT'); $logging = new LoggingClient(['projectId' => $projectId]); $logger = $logging->logger('php-runtime-error'); // 解析trace ID $traceHeader = $_SERVER['HTTP_X_CLOUD_TRACE_CONTEXT'] ?? ''; $traceId = explode('/', $traceHeader)[0] ?? ''; $currentTrace = sprintf('projects/%s/traces/%s', $projectId, $traceId); - 第三步:注册全局错误处理钩子,注入trace上下文
分别注册普通错误、未捕获异常、致命错误的处理函数,所有错误日志都携带当前请求的trace信息:// 处理普通运行错误 set_error_handler(function ($errno, $errstr, $errfile, $errline) use ($logger, $currentTrace) { $logger->error($errstr, [ 'trace' => $currentTrace, 'labels' => [ 'error_type' => $errno, 'file' => $errfile, 'line' => $errline ] ]); // 返回false保留PHP原生错误处理逻辑,不需要可移除 return false; }); // 处理未捕获的异常 set_exception_handler(function ($e) use ($logger, $currentTrace) { $logger->critical($e->getMessage(), [ 'trace' => $currentTrace, 'labels' => [ 'exception_file' => $e->getFile(), 'exception_line' => $e->getLine(), 'exception_trace' => $e->getTraceAsString() ] ]); }); // 处理致命运行错误 register_shutdown_function(function () use ($logger, $currentTrace) { $lastError = error_get_last(); if ($lastError && in_array($lastError['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) { $logger->alert($lastError['message'], [ 'trace' => $currentTrace, 'labels' => [ 'file' => $lastError['file'], 'line' => $lastError['line'] ] ]); } }); - 第四步:修改php.ini配置关闭原生错误日志
在项目根目录的php.ini文件中添加以下配置,避免重复输出错误日志:display_errors = Off log_errors = Off
效果验证
配置完成后,所有PHP运行时产生的错误都会自动携带对应请求的trace ID,在Cloud Logging控制台可直接和对应HTTP请求的访问日志关联查看,与PHP5.5运行时的原生效果完全一致。
内容的提问来源于stack exchange,提问作者Voriki
相关产品推荐
相关产品推荐

