Linux LAMP 下 PHP 性能调优实战指南
一 基线评估与瓶颈定位
- 明确目标:以并发能力、P95/P99 延迟、错误率为核心指标,建立可复现的压测场景(如 ab、wrk、JMeter),在调整前后对比数据。
- 全链路排查:从Linux 资源(CPU、内存、I/O、网络)、Apache/网络(连接数、KeepAlive、MPM 模式)、PHP(OPcache、FPM/进程、脚本效率)、MySQL(慢查询、索引、缓冲池)、缓存/CDN逐层定位瓶颈。
- 监控与日志:使用htop/glances、Prometheus+Grafana做系统与应用监控;定期分析Apache 访问/错误日志与MySQL 慢查询日志,定位长尾请求与异常 SQL。
二 PHP 运行时与 OPcache 配置
- 升级与精简:优先使用最新稳定版 PHP,仅启用必要扩展(如mysqli/pdo_mysql),减少模块加载开销。
- 启用并校准 OPcache(php.ini 示例):
- opcache.enable=1
- opcache.memory_consumption=128(按内存与应用规模调优)
- opcache.interned_strings_buffer=8
- opcache.max_accelerated_files=4000–10000(依据文件数调整)
- opcache.revalidate_freq=60(生产建议 60s;开发可 0 便于即时生效)
- FPM 进程池(如采用 PHP-FPM,/etc/php/*/fpm/pool.d/www.conf):
- pm=dynamic/ondemand
- pm.max_children=依据内存与单进程占用计算(见下文“容量估算”)
- pm.start_servers / pm.min_spare_servers / pm.max_spare_servers=平滑应对流量波动
- PHP 基础参数:按应用合理设置memory_limit、max_execution_time、upload_max_filesize、post_max_size,避免过大或过小导致失败与浪费。
三 Web 服务器与网络层优化
- Apache MPM 与连接:
- 选择更高效的 Event MPM(若模块/库线程安全);传统 Prefork 兼容性好但并发能力弱。
- 关键参数:StartServers、MinSpareServers、MaxSpareServers、MaxRequestWorkers/MaxClients、MaxConnectionsPerChild;结合内存与单进程占用设置上限,避免内存交换与频繁重建进程。
- 启用 KeepAlive 与 mod_deflate(Gzip),减少握手与传输体积;必要时使用 mod_cache 做页面/对象缓存。
- 内核与网络(/etc/sysctl.conf 示例):
- net.ipv4.tcp_syncookies=1
- net.core.rmem_max/wmem_max=16777216
- net.ipv4.tcp_rmem/tcp_wmem=4096 87380 16777216
- net.ipv4.ip_local_port_range=1024 65000
- 启用 BBR:net.ipv4.tcp_congestion_control=bbr
- 前端与传输:部署CDN加速静态资源,设置浏览器缓存头;在条件允许时启用HTTP/2提升多路复用效率。
四 数据库与缓存策略
- MySQL/MariaDB:
- 索引优化:为高频查询条件建立合适索引,避免全表扫描与隐式转换。
- 配置优化:将 innodb_buffer_pool_size 设为可用内存的50%–80%(典型起点),合理设置 max_connections;定期执行 OPTIMIZE TABLE、分析与修复表。
- 查询优化:避免 **SELECT ***,减少 N+1 查询,分页与批量操作代替逐条处理。
- 缓存体系:
- 引入 Redis/Memcached 做结果缓存/会话存储,显著降低数据库压力。
- 在更高层可叠加 Varnish 作为反向代理/HTTP 加速器,缓存可缓存的页面与接口结果。
五 代码与应用架构优化
- 代码级最佳实践:
- 减少数据库交互与循环内计算/函数调用,优先使用预处理语句与批量操作,避免 **SELECT ***。
- 减少文件 I/O 与不必要的全局变量,使用局部变量/依赖注入提升可维护性与性能。
- 生产环境关闭详细错误显示,统一日志记录与友好错误页。
- 架构与异步:
- 对耗时任务采用异步处理(如消息队列 RabbitMQ/Kafka),缩短请求链路。
- 选择合适框架(如 Laravel/Symfony)并遵循MVC 与框架内置优化;定期代码审查与性能回归测试。
- 性能剖析与容量估算:
- 使用 Xdebug/Blackfire 定位热点函数与慢路径,针对性优化。
- FPM 进程数估算思路:Max_children ≈ 可用内存 / 单进程峰值内存(含 OPcache、框架与业务栈),并预留安全余量;结合压测校准,避免内存耗尽或进程饥饿。