从加载慢的后台说起
公司项目用的是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生产环境保持克制,才能让系统跑得更轻快。