PHP 升级到 8 后 Apache/httpd 无法加载 php-zts.so

PHP 升级到 8 后 Apache/httpd 无法加载 php-zts.so

升级到 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 使其线程安全的文章;我不想尝试。如果有其他方法或非线程设置可行。

相关内容