通过ThinkPHP的中间件机制,可自定义中间件记录每个请求的响应时间、内存占用等核心指标,直接集成到应用层。
app/middleware目录下新建PerformanceMiddleware.php,代码如下:namespace app\middleware;
use think\facade\Log;
use think\middleware\BaseMiddleware;
class PerformanceMiddleware extends BaseMiddleware
{
public function handle($request, \Closure $next)
{
$start_time = microtime(true); // 记录开始时间
$response = $next($request); // 执行请求
$end_time = microtime(true); // 记录结束时间
$cost_time = $end_time - $start_time; // 计算耗时
$memory_usage = memory_get_peak_usage(true) / 1024 / 1024; // 峰值内存(MB)
// 记录日志(可扩展为写入数据库或发送到监控系统)
Log::info("请求路径:{$request->path()} | 耗时:{$cost_time}秒 | 内存:{$memory_usage}MB");
return $response;
}
}
(2)注册中间件:在application/middleware.php中添加中间件:return [
'app\middleware\PerformanceMiddleware',
];
通过CentOS自带的系统命令,实时监控服务器的CPU、内存、磁盘IO等资源使用情况,快速定位系统级瓶颈。
top:动态显示进程的CPU、内存占用,按M键按内存排序,按P键按CPU排序。free -h:查看系统内存使用情况(总内存、已用、空闲),-h参数显示人类可读格式。vmstat 1:每1秒刷新一次系统资源统计(进程、内存、IO、CPU),重点关注r(运行队列长度)、b(阻塞进程数)、si/so(交换分区读写)。iostat -x 1:查看磁盘IO详情(读写速率、IO等待时间),-x参数显示扩展统计。netstat -tulnp:查看网络连接状态(端口、进程),识别异常连接。通过Prometheus(时间序列数据库)采集ThinkPHP的性能指标,Grafana(可视化工具)展示实时监控面板,适合大规模应用的长期监控。
prometheus.yml添加ThinkPHP的指标抓取任务(需ThinkPHP暴露指标接口)。think-prometheus等扩展,在应用中暴露/metrics接口,输出请求量、响应时间、错误率等指标(格式为Prometheus可识别的文本)。ThinkPHP Grafana Dashboard),创建包含请求耗时趋势、内存占用、错误率等指标的面板。借助New Relic、Datadog等成熟的APM(应用性能管理)工具,实现全链路性能监控(从代码到数据库、第三方API)。
composer require newrelic/php-agent)。通过ThinkPHP的日志系统和错误处理机制,记录应用运行中的错误、慢查询等信息,辅助排查性能问题。
application/config.php中设置日志级别(如info、error)和存储路径:'log' => [
'type' => 'file', // 日志类型(文件)
'var_log_path' => './runtime/log', // 日志目录
'level' => ['info', 'error'], // 日志级别
],
try-catch捕获异常,并记录到日志:try {
// 业务逻辑
} catch (\Exception $e) {
\think\facade\Log::error('捕获到异常:' . $e->getMessage());
}
slow_query_log=1),结合ThinkPHP的query方法记录慢SQL,优化数据库性能。通过缓存减少重复计算和数据库查询,提升应用性能,间接降低服务器负载。
cache方法缓存整个页面(适用于静态内容):public function index()
{
return cache('index_page', function() {
// 页面内容生成逻辑
return 'Hello, ThinkPHP!';
}, 3600); // 缓存1小时
}
config.php中开启模板缓存(template_cache设为true),避免重复解析模板文件。cache方法缓存查询结果(适用于不常变化的数据):$data = Db::table('user')->cache(3600)->select(); // 缓存1小时
cache' => 'redis'),提升缓存读写速度。