1. 启用并优化操作码缓存(OpCache)
操作码缓存是提升PHP性能的核心手段,通过缓存编译后的操作码,避免重复解析和编译,显著降低CPU开销。LNMP环境中,推荐使用PHP官方扩展OpCache(PHP 5.5+内置),配置时需关注以下参数:
opcache.enable=1:开启缓存功能;opcache.memory_consumption=128:分配128MB共享内存(根据服务器内存调整,建议每100个并发请求分配10-20MB);opcache.max_accelerated_files=4000:设置可缓存的文件数量(需覆盖项目中所有PHP文件,可通过find /path/to/project -name "*.php" | wc -l统计);opcache.revalidate_freq=60:每60秒检查文件修改时间(开发环境设为0,生产环境设为60以上以平衡性能与代码更新及时性)。2. 调整PHP-FPM进程管理参数
PHP-FPM的进程管理直接影响并发处理能力,需根据服务器资源(CPU核心数、内存)合理配置:
dynamic(动态调整进程数),适合大多数场景;若服务器长期负载稳定,可使用static(固定进程数)以减少进程创建/销毁的开销;pm.max_children:最大子进程数,计算公式为服务器内存(MB)/ 单个PHP进程内存(MB,如128MB),建议不超过CPU核心数的2倍(如4核CPU设为8);pm.start_servers:启动时的进程数,设为pm.max_children的1/4-1/2(如pm.max_children=50则设为10-25);pm.min_spare_servers/pm.max_spare_servers:最小/最大空闲进程数,避免频繁创建/销毁进程(如设为5-35);pm.max_requests:每个子进程处理的最大请求数(如500),防止内存泄漏(达到阈值后重启进程)。3. 优化Nginx与PHP-FPM通信
Nginx通过FastCGI与PHP-FPM交互,合理的缓冲区和超时设置能减少网络开销:
fastcgi_buffers(缓冲区数量和大小)和fastcgi_buffer_size(缓冲区大小),建议设置为fastcgi_buffers 8 16k; fastcgi_buffer_size 32k;(根据响应大小调整,避免缓冲区过小导致频繁读写);fastcgi_read_timeout(读取PHP-FPM响应的超时时间)设为30-60秒(避免长时间等待导致请求堆积);request_terminate_timeout(PHP-FPM处理请求的超时时间)设为30秒(防止脚本卡死占用进程)。4. 使用高性能缓存系统(Redis/Memcached)
对于频繁访问的数据库查询结果、会话数据或热点数据,使用Redis(支持持久化、高并发)或Memcached(轻量级、内存效率高)缓存,减少直接访问数据库的次数:
pecl install redis(Redis)或pecl install memcached(Memcached);$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $cacheKey = 'user_profile_123'; if ($data = $redis->get($cacheKey)) { // 使用缓存数据 } else { // 从数据库获取数据 $data = $db->query("SELECT * FROM users WHERE id = 123")->fetch(); $redis->setex($cacheKey, 3600, $data); // 缓存1小时 } 5. 优化PHP代码质量
代码层面的优化能从根本上提升执行效率:
IN语句批量查询;function add(int $a, int $b): int),能提升性能并减少类型错误;ob_start()开启输出缓冲,减少echo/print的调用次数(如模板渲染时)。6. 配置合理的PHP参数
调整PHP配置以适应应用需求,避免资源浪费或不足:
memory_limit:根据应用需求设置(如普通CMS设为128-256MB,大型应用设为512MB),避免单个脚本占用过多内存;max_execution_time:设置脚本最大执行时间(如普通页面设为30秒,后台任务设为300秒),防止脚本卡死;upload_max_filesize/post_max_size:根据上传需求设置(如允许上传10MB文件,则设为10M),避免上传失败。7. 利用页面缓存减少动态生成开销
对于内容更新不频繁的页面(如首页、文章页),使用Nginx的proxy_cache或PHP框架的模板缓存(如Laravel的Blade缓存),将动态生成的页面保存为静态文件,后续请求直接返回静态文件:
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m inactive=60m; server { location / { proxy_cache my_cache; proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟 proxy_cache_use_stale error timeout updating; try_files $uri $uri/ /index.php?$query_string; } } 8. 使用性能分析工具定位瓶颈
通过工具定位代码中的性能瓶颈(如慢查询、高CPU占用函数),针对性优化:
xdebug.mode=profile);