如何在CentOS7上编译无Thread Safe的PHP5.6.36适配Apache2.4.33?
解决CentOS 7上编译非Thread Safe的PHP 5.6.36搭配Apache 2.4.33的问题
我之前也踩过这个坑,核心原因是Apache 2.4默认启用了多线程MPM模式(worker/event),而PHP以mod_php模块形式运行时,只要Apache用多线程MPM,就必须编译为ZTS(Thread Safe)版本才能兼容。你之前用Apache 2.2时默认是prefork MPM(纯进程模式,无线程),所以能正常编译非TS版本。要解决这个问题,步骤如下:
1. 确认并切换Apache的MPM为prefork
首先检查当前Apache使用的MPM模式:
httpd -V | grep -i mpm
如果输出是Server MPM: worker或event,就需要切换到prefork:
- 编辑Apache的MPM配置文件:
/etc/httpd/conf.modules.d/00-mpm.conf - 注释掉多线程MPM的加载行,启用prefork:
#LoadModule mpm_event_module modules/mod_mpm_event.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so LoadModule mpm_prefork_module modules/mod_mpm_prefork.so - 重启Apache生效:
systemctl restart httpd - 再次运行
httpd -V | grep -i mpm确认MPM已切换为prefork。
2. 重新编译PHP 5.6.36(无需额外禁用ZTS的参数)
你之前尝试的--disable-posix-threads和--disable-maintainer-zts都不是正确的参数:前者根本不是PHP configure的有效选项,后者是给PHP维护者用的调试参数,不影响最终的TS状态。
正确的编译逻辑是:当你用--with-apxs2参数编译PHP时,它会自动检测Apache的MPM模式——如果是prefork,就默认编译为非ZTS版本。
举个典型的编译参数示例(根据你的需求添加扩展):
cd php-5.6.36 ./configure \ --prefix=/usr/local/php56 \ --with-apxs2=/usr/bin/apxs \ --enable-mbstring \ --enable-zip \ --with-pdo-mysql \ --with-mysqli \ --with-gd \ --with-curl \ # 这里添加你需要的其他扩展参数,不要加任何和zts/threads相关的参数 make && make install
3. 验证非TS是否生效
编译安装完成后,验证PHP的Thread Safety状态:
- 命令行运行:
如果输出中没有/usr/local/php56/bin/php -v(ZTS)字样,说明是非TS版本; - 或者创建一个phpinfo页面,查看
Thread Safety项,显示Disabled即为成功。
关键提醒
如果你必须使用Apache的多线程MPM(worker/event),那PHP无法以mod_php模块形式运行非TS版本,这种情况下你只能切换到PHP-FPM(FastCGI模式)。但根据你的需求,要以模块形式运行,切换到prefork MPM是唯一可行的方案。
内容的提问来源于stack exchange,提问作者GugaJEDI
相关产品推荐
相关产品推荐

