PHP在Ubuntu上的优化技巧
小樊
41
2025-11-14 21:58:22
Ubuntu 上 PHP 性能优化实用指南
一 基础准备与版本选择
- 使用较新的 **PHP 版本(如 8.2)**可获得显著的性能改进与优化,建议通过 ppa:ondrej/php 安装所需版本与扩展:sudo add-apt-repository ppa:ondrej/php && sudo apt update && sudo apt install php8.2 php8.2-cli php8.2-fpm php8.2-{bz2,curl,mbstring,intl}。部署前先在测试环境验证兼容性。
- 选择 PHP-FPM 作为 SAPI(替代 mod_php),更利于并发与资源控制;Web 层建议 Nginx + PHP-FPM,在高并发下通常优于 Apache + mod_php。
二 字节码缓存 OPcache 必配
- 安装并启用 OPcache:sudo apt install php-opcache;在对应 php.ini(如 /etc/php/8.2/fpm/php.ini 或 CLI 的 php.ini)中开启并调优:
- zend_extension=opcache.so
- opcache.enable=1
- opcache.enable_cli=1(仅开发/调试建议开启,生产按需)
- opcache.memory_consumption=128M
- opcache.interned_strings_buffer=8
- opcache.max_accelerated_files=10000
- opcache.validate_timestamps=1(开发)或 60(生产)
- opcache.revalidate_freq=60
- opcache.fast_shutdown=1
- 变更后重启服务:sudo systemctl restart php8.2-fpm(或 apache2)。OPcache 能显著减少脚本重复编译开销,是性价比最高的优化项。
三 PHP-FPM 进程与请求调优
- 编辑 /etc/php/{version}/fpm/pool.d/www.conf,常用模式为 dynamic,按服务器内存与负载计算并设置:
- pm = dynamic
- pm.max_children = 依据内存与单进程占用计算(见下节公式)
- pm.start_servers = 5
- pm.min_spare_servers = 5
- pm.max_spare_servers = 35
- pm.max_requests = 500(规避内存泄漏累积)
- request_terminate_timeout = 30s(避免长请求拖垮)
- slowlog = /var/log/php**{version}**-fpm.slow.log
- request_slowlog_timeout = 10s
- 启用状态页便于观测:pm.status_path = /status,配合 Nginx 访问限制做健康检查与容量评估。变更后重启 PHP-FPM 生效。
四 计算 max_children 与内存预算
- 核心公式:max_children ≤ 可用内存 / 单进程峰值内存。
- 实操步骤:
- 观测单进程峰值:在 PHP-FPM 池配置中临时开启 slowlog,压测后用日志定位峰值内存(或借助监控/分析工具)。
- 预留系统与其他服务内存(如 1–2GB 给 OS、数据库、缓存等)。
- 示例:若可用内存 8GB,单进程峰值 80MB,则 max_children 上限约为 (8−2)×1024/80 ≈ 76;再结合并发目标与响应时间微调。
- 若并发较低且希望快速回收空闲进程,可考虑 ondemand 模式(按需拉起,节省常驻内存)。
五 数据与 Web 层优化及监控落地
- 数据层与缓存:
- 引入 Redis/Memcached 做页面/数据缓存,显著降低数据库压力;必要时使用 持久连接(如 PDO/MySQLi 的 persistent 选项)减少握手开销。
- Web 服务器与传输:
- Nginx:启用 Gzip、合理配置 worker_processes/worker_connections/keepalive_timeout,并让 Nginx 直接处理静态资源,PHP-FPM 仅处理动态请求。
- Apache:启用 KeepAlive、mod_expires、mod_deflate 等模块,减少慢速连接与重复传输。
- 代码与架构:
- 避免 eval、减少全局变量与深层嵌套循环;对大文件/大数据集使用 生成器 与 分块处理;合理使用 unset 与 gc_collect_cycles 控制峰值内存。
- 监控与诊断:
- 打开 PHP-FPM 慢日志定位问题端点;使用 Blackfire、New Relic、XHProf 做性能剖析;结合 htop/vmstat/iostat 与 php-fpm status 持续观测队列、进程数与响应时延,按指标回调 FPM/OPcache/DB 配置。