应使用php-fpm而非mod_php;因php-fpm支持opcache复用、连接池及高效自动加载,显著提升thinkphp性能,而mod_php每次请求重复加载框架导致内存高、启动慢。

Apache用mod_php还是php-fpm?
ThinkPHP项目卡在Apache上,八成是PHP执行模式选错了。mod_php(即libphp.so)把PHP嵌进Apache进程里,每个请求都得加载一遍ThinkPHP框架和Composer自动加载器,内存占用高、启动慢;而php-fpm是独立进程池,能复用已加载的OPcache、类映射和连接池,对ThinkPHP这种依赖自动加载和配置解析的框架更友好。
实操建议:
- 确认当前模式:
apachectl -M | grep php如果看到php7_module或php8_module,说明还在用mod_php - 停用mod_php:
a2dismod php7.4(按实际版本调整) - 启用proxy_fcgi + sethandler:
a2enmod proxy_fcgi,并在虚拟主机中加SetHandler "proxy:fcgi://127.0.0.1:9000" - 确保php-fpm服务运行:
systemctl status php7.4-fpm,监听地址需与Apache配置一致
.htaccess重写规则导致路由变慢
ThinkPHP默认靠.htaccess把所有请求转发给index.php,但Apache每次请求都要读取、解析该文件,尤其在目录层级深或开启AllowOverride All时,开销明显。更糟的是,某些规则会触发多次内部重定向,让一个URL被反复匹配。
常见错误现象:首页打开快,二级路由(如/admin/user/list)响应延迟明显,AccessLog里出现多条同一请求记录。
实操建议:
- 把
.htaccess内容直接挪到Apache虚拟主机配置里,关闭AllowOverride:AllowOverride None - 用原生
RewriteRule替代ThinkPHP自带的.htaccess模板,例如:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
注意:[L]必须加上,否则可能触发二次匹配;不要写RewriteRule ^(.*)$ index.php/$1——ThinkPHP 6+已不依赖PATH_INFO。
OPcache没开或配置过保守
ThinkPHP大量使用反射、注解和动态类加载,没有OPcache缓存字节码,每次请求都要重新编译PHP文件,性能直接打五折。更隐蔽的问题是,OPcache默认opcache.max_accelerated_files只有4000,而一个中型ThinkPHP项目+vendor轻松破万,超出部分直接绕过缓存。
实操建议:
- 确认启用:
php -i | grep "opcache.enable"输出应为on - 关键参数调优(写在
php.ini或opcache.ini):
opcache.memory_consumption=128opcache.max_accelerated_files=20000opcache.validate_timestamps=0(生产环境关掉文件变更检测)opcache.revalidate_freq=0opcache.fast_shutdown=1
改完重启php-fpm,别只reload——OPcache内存段需要完全重建。
Apache MPM Prefork vs Event对PHP并发的影响
Prefork是Apache默认MPM,每个请求独占一个进程,内存开销大;Event模式支持异步处理,配合php-fpm能更好撑住并发。但ThinkPHP若用了session_start()且没配session.save_handler=redis,在Event下可能因文件锁阻塞请求。
性能影响明显场景:压测时QPS上不去,ab -n 1000 -c 100跑完发现平均响应时间翻倍,top看httpd进程数卡在几十个不动。
实操建议:
- 先查当前MPM:
apache2ctl -V | grep MPM - 切到Event前,务必检查Session存储:
session.save_handler不能是files,推荐redis或memcached - 修改
/etc/apache2/mods-available/mpm_event.conf,调高MaxRequestWorkers(原MaxClients),例如设为256 - 禁用Prefork:
a2dismod mpm_prefork,启用Event:a2enmod mpm_event
最易被忽略的一点:ThinkPHP的think\facade\Cache默认走File驱动,哪怕你用了Redis做Session,缓存仍可能卡在磁盘IO上——上线前一定检查config/cache.php里的default驱动是否指向了真正的高性能后端。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











