PHP在Apache下运行缓慢的核心是mod_php与prefork模式导致内存膨胀和进程僵化,应改用PHP-FPM+Event MPM架构,同步调优MaxRequestWorkers与pm.max_children,强制启用OPcache并配足内存,禁用.htaccess及非必要模块与日志。

PHP在Apache下运行缓慢,核心问题往往不在代码本身,而在于运行模式、模块协作和资源分配没对齐。直接调高memory_limit或max_execution_time治标不治本,得从底层架构入手。
换掉mod_php,改用PHP-FPM + Event MPM
mod_php把PHP解释器硬塞进每个Apache进程,内存膨胀快、无法动态伸缩;而PHP-FPM是独立进程管理器,配合Event MPM能真正实现轻量连接+重负载分离。
- 停用mod_php:
a2dismod php8.2(版本号按实际调整) - 启用代理模块:
a2enmod proxy_fcgi setenvif - 切换MPM:
a2dismod mpm_prefork && a2enmod mpm_event - 在虚拟主机配置中加转发规则:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/ - 重启服务:
systemctl restart apache2 php8.2-fpm
调准Apache并发与PHP-FPM进程池
两者必须匹配,否则请求会在中间“卡住”:Apache放行了300个并发,但PHP-FPM只准备了50个worker,剩下250个只能排队等——这就是504超时的根源。
- 查当前PHP进程内存占用:
ps aux --sort=-%mem | grep 'php-fpm' | head -3,看RSS列(如平均65MB) - 设
MaxRequestWorkers(在/etc/apache2/mods-available/mpm_event.conf):
公式:可用内存×0.8 ÷ 单进程内存 → 例如16GB空闲、65MB/进程 ≈ 200,设为200 - 同步调
php-fpm的www.conf:pm = dynamicpm.max_children = 200pm.start_servers = 4pm.min_spare_servers = 2pm.max_spare_servers = 10 - 确认
ServerLimit ≥ MaxRequestWorkers,避免重启被截断
必须开OPcache,且配够内存
不开OPcache,等于每次HTTP请求都重新解析、编译整个PHP文件——这是最常被忽略的性能黑洞,尤其对Laravel、WordPress这类框架项目。
立即学习“PHP免费学习笔记(深入)”;
- 检查是否启用:
php -i | grep "opcache.enable",输出应为on - 关键配置写入
php.ini:opcache.enable=1opcache.memory_consumption=256(单位MB,不低于128)opcache.max_accelerated_files=20000opcache.revalidate_freq=60opcache.validate_timestamps=1(开发环境可关,生产务必开) - 验证效果:
print_r(opcache_get_status()['opcache_statistics']);,命中率长期低于95%就要查路径或缓存大小
砍掉干扰项:禁用非必要模块与日志
每个Apache模块都增加请求处理链路,每条日志写入都在抢磁盘I/O——在高频计算或API场景下,它们会成倍放大延迟。
- 禁用无用模块:
a2dismod status autoindex info cgi cgid userdir - 降低日志级别:
LogLevel crit(原warn或error太重) - 注释掉
CustomLog和ErrorLog行,或临时指向/dev/null(仅限压测/调试) - 关闭
.htaccess解析:在Directory块中设AllowOverride None,避免每次请求都遍历目录找配置文件



















