温馨提示×

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 ≤ 可用内存 / 单进程峰值内存。
  • 实操步骤:
    1. 观测单进程峰值:在 PHP-FPM 池配置中临时开启 slowlog,压测后用日志定位峰值内存(或借助监控/分析工具)。
    2. 预留系统与其他服务内存(如 1–2GB 给 OS、数据库、缓存等)。
    3. 示例:若可用内存 8GB,单进程峰值 80MB,则 max_children 上限约为 (8−2)×1024/80 ≈ 76;再结合并发目标与响应时间微调。
    4. 若并发较低且希望快速回收空闲进程,可考虑 ondemand 模式(按需拉起,节省常驻内存)。

五 数据与 Web 层优化及监控落地

  • 数据层与缓存:
    • 引入 Redis/Memcached 做页面/数据缓存,显著降低数据库压力;必要时使用 持久连接(如 PDO/MySQLi 的 persistent 选项)减少握手开销。
  • Web 服务器与传输:
    • Nginx:启用 Gzip、合理配置 worker_processes/worker_connections/keepalive_timeout,并让 Nginx 直接处理静态资源,PHP-FPM 仅处理动态请求。
    • Apache:启用 KeepAlivemod_expiresmod_deflate 等模块,减少慢速连接与重复传输。
  • 代码与架构:
    • 避免 eval、减少全局变量与深层嵌套循环;对大文件/大数据集使用 生成器分块处理;合理使用 unsetgc_collect_cycles 控制峰值内存。
  • 监控与诊断:
    • 打开 PHP-FPM 慢日志定位问题端点;使用 Blackfire、New Relic、XHProf 做性能剖析;结合 htop/vmstat/iostatphp-fpm status 持续观测队列、进程数与响应时延,按指标回调 FPM/OPcache/DB 配置。

0