CentOS上Laravel项目性能调优全方案
server {
listen 80;
server_name your-domain.com;
root /path/to/laravel/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
/etc/php-fpm.d/www.conf,调整进程管理参数以匹配服务器资源(如4GB内存可设置pm.max_children=20),避免进程过多导致内存耗尽:user = nginx;
group = nginx;
listen = /var/run/php-fpm/php-fpm.sock;
listen.owner = nginx;
listen.group = nginx;
pm = dynamic;
pm.max_children = 20;
pm.start_servers = 5;
pm.min_spare_servers = 5;
pm.max_spare_servers = 10;
OPcache是PHP字节码缓存扩展,可显著减少脚本编译时间。安装并配置:
sudo yum install php-opcache
编辑/etc/php.ini,添加以下配置:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
重启PHP-FPM使配置生效:sudo systemctl restart php-fpm。
php artisan route:cache生成路由缓存(开发环境禁用)。php artisan config:cache(开发环境禁用)。.env文件,设置APP_DEBUG=false,避免调试信息输出影响性能。$users = User::with('profile')->get(); // 仅执行2次查询
Schema::table('orders', function (Blueprint $table) {
$table->index('user_id');
});
Cache::remember缓存结果,例如:$data = Cache::remember('active_users', 3600, function () {
return User::where('active', true)->get();
});
将邮件发送、图片处理等耗时任务放入队列异步执行,提升响应速度。
php artisan make:job SendWelcomeEmail --queue=emails
handle方法中编写具体逻辑(如发送邮件):public function handle()
{
Mail::to($this->user->email)->send(new WelcomeEmail($this->user));
}
dispatch方法,例如:SendWelcomeEmail::dispatch($user)->onQueue('emails');
.env中设置QUEUE_CONNECTION=redis),并通过Supervisor管理进程:sudo yum install supervisor
创建Supervisor配置文件/etc/supervisor/conf.d/laravel-worker.conf:[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/laravel/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=nginx
numprocs=4
redirect_stderr=true
stdout_logfile=/path/to/laravel/storage/logs/worker.log
启动Supervisor:sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl start laravel-worker:*。生产环境推荐使用Redis或Memcached替代默认的文件缓存(.env中设置CACHE_DRIVER=redis),配置Redis连接:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Cache::tags(['users', 'profiles'])->put('user:1', $user, 3600);
Cache::tags(['users'])->flush(); // 清除所有用户相关缓存
在应用启动时预加载常用数据(如热门商品、分类信息)到缓存,减少首次请求的数据库查询。
修改composer.json,开启类映射优化和 dist 安装:
"config": {
"optimize-autoloader": true,
"preferred-install": "dist"
}
执行composer dump-autoload -o生成优化的类映射文件。
将复杂的业务逻辑(如数据统计、条件判断)移至控制器或模型,保持视图简洁(如使用Blade的@include引入子视图,避免在视图中写循环和查询)。
对于不需要立即加载的关联数据(如文章的评论),使用load方法延迟加载,例如:
$post = Post::find(1);
$post->load('comments'); // 只有在访问$post->comments时才会执行查询
.env中LOG_LEVEL=error),避免日志文件过大。logrotate)定期清理旧日志。保持Laravel框架和依赖包为最新版本,获取性能改进和安全修复:
composer update