PHP框架性能优化实战技巧

从加载慢的后台说起

公司项目用的是Laravel,一开始功能简单,页面打开还挺快。可随着模块越加越多,后台列表页动不动就两三秒才出来,用户抱怨不断。这时候光靠换更好的服务器解决不了根本问题,得在框架层面做

减少自动加载的负担

Composer的自动加载虽然方便,但每次请求都要解析大量类文件。如果项目里引入了不少没用到的包, autoload 就成了拖累。定期清理 composer.json 里冗余的依赖,能明显缩短请求初始化时间。

还可以执行以下命令生成优化的自动加载文件:

composer dump-autoload --optimize

开启OPcache提升执行效率

PHP代码每次都要编译成opcode,这个过程很耗时。开启OPcache后,编译结果会被缓存下来,后续请求直接复用,速度提升显著。

在 php.ini 中启用并配置:

opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0

线上环境关闭时间戳验证,避免每次都检查文件变动。

合理使用缓存机制

数据库查一次要几百毫秒,把结果缓存到Redis或Memcached,下次直接取,省时又省资源。比如用户权限数据,不会频繁变,完全可以缓存几分钟。

Laravel中可以这样写:

<?php
$permissions = Cache::remember('user_permissions_'.$userId, 300, function () {
return DB::table('permissions')->where('user_id', $userId)->get();
});
?>

延迟加载与预加载的取舍

ORM用起来爽,但不小心就会掉进N+1查询的坑。比如显示用户列表同时要查每个用户的部门名称,如果不做处理,每条记录都去查一次数据库,100个用户就是101次查询。

改成预加载就能解决:

<?php
// 错误示范
foreach ($users as $user) {
echo $user->department->name;
}

// 正确做法
$users = User::with('department')->get();
foreach ($users as $user) {
echo $user->department->name;
}
?>

静态资源与接口分离部署

前端页面和API接口混在一起跑,容易相互影响。把API服务单独部署,配合CDN分发静态资源,主应用压力小了,响应也更稳定。

同时在Nginx配置压缩传输:

gzip on;
gzip_types text/css application/javascript application/json;

日志别拖垮系统

调试时打满日志没问题,但上线后还记录大量info级别信息,磁盘IO容易成为瓶颈。调整日志级别,只保留error和warning,必要时再临时调高。

在 Laravel 的 .env 文件中设置:

LOG_LEVEL=error

生产环境保持克制,才能让系统跑得更轻快。