PHP 应用监控:从 A 到 Z 的指标与告警

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP 应用监控:从 A 到 Z 的指标与告警



在现代 Web 开发中,应用的稳定性和性能不仅仅是一个愿望,而是一个关键要求。尽管 PHP 已经成熟,但仍需密切关注监控。没有监控,您可能从用户那里得知网站宕机,而不是从告警系统获知。在本文中,我们将探讨如何构建一个完整的 PHP 应用监控系统:从收集关键指标到配置告警,从而拯救您的项目免于停机。



为什么要监控 PHP?关键指标



监控可以回答三个主要问题:“应用是否在运行?”、“运行速度如何?”以及“是否发生异常?”。对于 PHP 应用,以下指标组至关重要:



  • 可用性指标 (Uptime):检查 Web 服务器和 PHP-FPM 是否响应请求。最简单的方法是使用健康检查端点。
  • 性能指标:请求执行时间 (Response Time)、吞吐量 (Requests per Second)、数据库和外部 API 的响应时间。
  • 资源指标:内存使用量 (Memory Usage)、CPU 负载、活跃的 PHP-FPM 进程数。
  • 错误指标:HTTP 错误数 (5xx, 4xx)、异常数 (Exceptions)、致命错误和警告数。
  • 业务指标:订单处理速度、注册数量——所有对您的业务重要的数据。


收集这些指标有多种方式:从简单的文件日志记录到使用高级可观测性系统,如 Prometheus + Grafana 或商业解决方案 (Datadog, New Relic)。



收集指标:从简单到复杂



我们从基础方法开始——创建一个简单的健康检查并以 Prometheus 格式收集指标。



1. 健康检查端点

创建一个简单的端点,用于检查数据库和缓存的连接:



<?php// health.php$checks = [    'database' => false,    'redis' => false,    'status' => 'unhealthy'];

try { new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); $checks['database'] = true;} catch (PDOException $e) { // 记录错误}

if ($checks['database'] && $checks['redis']) { $checks['status'] = 'healthy'; http_response_code(200);} else { http_response_code(503);}

header('Content-Type: application/json');echo json_encode($checks);


2. 为 Prometheus 收集指标

Prometheus 是一个流行的指标收集系统。您的应用应以 /metrics 格式提供数据。以下是一个简单的导出器示例:



<?php// metrics.phpheader('Content-Type: text/plain; version=0.0.4');

$metrics = [];

// 请求计数器$metrics[] = '# HELP http_requests_total Total number of HTTP requests.';$metrics[] = '# TYPE http_requests_total counter';$metrics[] = 'http_requests_total{method="GET",route="/home"} 1024';

// 响应时间直方图$metrics[] = '# HELP http_request_duration_seconds Request duration in seconds.';$metrics[] = '# TYPE http_request_duration_seconds histogram';$metrics[] = 'http_request_duration_seconds_bucket{le="0.1"} 500';$metrics[] = 'http_request_duration_seconds_bucket{le="0.5"} 800';$metrics[] = 'http_request_duration_seconds_bucket{le="+Inf"} 1024';

// PHP 指标(内存、时间)$metrics[] = '# HELP php_memory_bytes Current memory usage.';$metrics[] = '# TYPE php_memory_bytes gauge';$metrics[] = 'php_memory_bytes ' . memory_get_usage(true);

echo implode("", $metrics) . "";


配置告警:何时以及如何通知



没有告警的指标只是数字。告警应基于阈值进行配置。基本原则:



<

博客

书籍推荐