Uni-App项目集成mp-html全攻略:从插件市场导入到npm引入的三种姿势
2026/4/25 22:07:10
PHP 可观测性(Observability)不是简单的“加日志”,而是通过结构化数据(Logs、Metrics、Traces)构建系统行为的可推理模型,使开发者能在不重启、不登录服务器的情况下,精准定位性能瓶颈与故障根因。
| 支柱 | 作用 | PHP 实现方式 |
|---|---|---|
| Logs(日志) | 记录离散事件(如错误、请求) | Monolog + JSON 格式 |
| Metrics(指标) | 聚合统计(如 QPS、内存使用率) | Prometheus client + OPcache stats |
| Traces(链路追踪) | 跟踪请求全链路(跨服务调用) | OpenTelemetry + Jaeger |
💡核心认知:
可观测性 = Logs(发生了什么) + Metrics(整体状态如何) + Traces(具体路径怎样)
error_log()→ 纯文本(难解析)// Monolog + JsonFormatter$logger=newLogger('app');$logger->pushHandler(newStreamHandler('php://stderr'));$logger->pushProcessor(newWebProcessor);// 自动添加 request_id$logger->info('User login',['user_id'=>123]);{"message":"User login","context":{"user_id":123},"extra":{"request_id":"abc123"}}// /metrics 端点$stats=opcache_get_status();echo"opcache_memory_usage{state=\"used\"} ".$stats['memory_usage']['used_memory'];usePrometheus\CollectorRegistry;$registry=newCollectorRegistry();$counter=$registry->registerCounter('http','requests_total','Total HTTP requests');$counter->inc();useOpenTelemetry\SDK\Trace\TracerProvider;$tracer=(newTracerProvider())->getTracer('app');$span=$tracer->spanBuilder('database.query')->startSpan();// 执行 SQL$span->end();traceparent头stderr+JsonFormattererror_log = /proc/self/fd/2# Nginx 配置 location /metrics { allow 10.0.0.0/8; # 仅内网访问 deny all; fastcgi_pass php-fpm; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /app/metrics.php; }[HTTP Request] → [Laravel Middleware] → [MySQL Query] → [Redis Get] │ │ │ │ Duration: 120ms Duration: 50ms Duration: 30ms Duration: 10mstrace_id:全局唯一标识span_id:当前操作 IDparent_span_id:父操作 ID| 陷阱 | 破局方案 |
|---|---|
| 日志未结构化 | 强制使用 JSON 格式,包含request_id、user_id |
| 指标暴露公网 | /metrics仅限内网访问(Nginx allow/deny) |
| 链路追踪性能损耗 | 采样率设为 10%(OTEL_TRACES_SAMPLER=traceidratio) |
| 忽略上下文传播 | 确保traceparent头在服务间传递(Nginx → PHP → 下游服务) |
**“可观测性不是工具,
而是推理的骨架——
- 当你结构化日志,
你在记录事件;- 当你暴露指标,
你在量化状态;- 当你追踪链路,
你在还原路径。真正的系统掌控,
始于对数据的敬畏,
成于对细节的精控。”
从今天起:
/metrics端点(内网访问)因为最好的系统稳定性,
不是祈祷不崩,
而是让每一比特都可被推理。