升级到 PHP 8 后,我只能使用非线程 PHP,而不能使用线程(ZTS)PHP。
服务器是 CentOS 7,运行 Apache。服务器 API 是 Apache 2.0 Handler。我使用了Remi 的 RMP 存储库配置向导将 PHP 从 7.4 升级到 8.2.4。升级到 PHP 8 后,Apache 在启用线程的情况下运行,但只会加载非线程的 PHP 模块并失败。
我看到了两个 PHP 可执行文件:php 和 zts-php。我不能在服务器上找到线程安全的 libphp7-zts.so 模块。似乎安装了线程安全的 php,但 Apache 无法找到或加载它。
升级之前,PHP 以线程方式运行。Info.php 报告线程安全已启用并包含 /etc/php-zts.d 目录。升级后,PHP 无法加载。info.php 页面只显示白色。php -i
显示它包括 /etc/php.d 以获取其他 .ini 文件。apachectl -M
结果不包括 php。
我检查了 /etc/httpd/conf.modules.d/20-php.conf。它包含
Load Module php_module modules/libphp.so.
升级之前,Apache php.conf 文件有两个指令:
<IfModule prefork.c>
LoadModule php7_module modules/libphp7.so
</IfModule>
<IfModule !prefork.c>
LoadModule php7_module modules/libphp7-zts.so
</IfModule>
我更新了 conf 文件以跳过 IfModule 部分并直接使用LoadModule php_module modules/libphp.so
。之后,我收到 Apache 错误:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
然后我更新了 /etc/httpd/conf.modules.d/00-mpm.conf 文件以启用 prefork MPM 模块。
- 注释掉:
LoadModule mpm_event_module modules/mod_mpm_event.so
- 取消注释:
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
此后,info.php 加载。php 应用程序运行。
我是否未能在 yum 安装中包含某些内容?我安装了 php-cli 和其他程序(php-pdo、php-mysql、php-gd 等)来支持该应用程序。
我是否可以预期由于线程/非线程变化而导致性能下降?
我有 4 台服务器需要更新,分别用于生产和开发两个不同的应用程序。我在两台开发服务器上都遇到了同样的问题。我希望能够像以前一样以线程方式运行它们——只是因为改变是可怕的,而且这超出了我的正常工作范围。如果不行,我想了解这里发生了什么。我读过关于编译 PHP 使其线程安全的文章;我不想尝试。如果有其他方法或非线程设置可行。