php - 每个 PHP-FPM Worker 是否单独加载 php.ini?

标签 php

我在 Ubuntu Natty 上从源代码安装了 PHP 5.3.8。我还在配置期间启用了 FPM。

但是,我在安装 PHP 扩展时遇到了问题。当我将扩展添加到我的 php.ini 文件(例如 extension=apc.so)并重新启动 PHP(即 /etc/init.d/php-fpm restart) ,我收到如下错误:

Starting php-fpm PHP Warning:  Module 'apc' already loaded in Unknown on line 0
<br />
<b>Warning</b>:  Module 'apc' already loaded in <b>Unknown</b> on line <b>0</b><br />
PHP Warning:  Module 'geoip' already loaded in Unknown on line 0
<br />
<b>Warning</b>:  Module 'geoip' already loaded in <b>Unknown</b> on line <b>0</b><br />
PHP Warning:  Module 'imagick' already loaded in Unknown on line 0
<br />
<b>Warning</b>:  Module 'imagick' already loaded in <b>Unknown</b> on line <b>0</b><br />
PHP Warning:  Module 'memcache' already loaded in Unknown on line 0
<br />

我的 PHP-FPM conf 的设置是 pm.start_servers = 5,所以我有大约 5 个活跃的 PHP-FPM worker。当我重新启动 PHP 时,它们是否都在尝试加载 php.ini 文件(因此显示模块已经加载的消息)?!如果是,有没有一种方法可以防止错误停止,因为当我加载 Zend Loader 时错误变得致命?

提前致谢。

最佳答案

几个小时后,我设法找到了解决此问题的方法。我想这对那些使用 FPM 从源代码编译和安装 PHP 的人来说会更有好处(所有 apt-get 的人可能与此无关)

基本上,它涉及使用 php-fpm.conf 来加载所有 PHP 扩展,而不是 php.ini。以下是您的操作:

  1. 打开你的 php-fpm.conf 文件(我从源代码安装了我的 php,所以我的文件位于 /usr/local/php/etc/php-fpm.conf我设置了我的 --prefix--with-config-file-path,但你可以使用 find/-name "php-fpm.conf" 从 bash shell 找到你的位置)。

  2. 添加您的扩展加载指令(最好在文件末尾)。你需要小心,因为格式有点不同。在你的 php.ini 文件中它应该像这样 extension=apc.so,但是在你的 php-fpm.conf 文件中它应该像这样定义 php_admin_value[extension]=apc.so .

注意:确保您的 extension_dir(您保存扩展的所有 .so 文件的位置)值在您的 php.ini 文件中定义。然后重启php-fpm。

我执行了上述操作并且没有更多错误,并且我的所有扩展都显示在 phpinfo() 中。

我希望这对某人有所帮助,它实际上让我发疯了。

干杯。

编辑

经过进一步测试,我发现这个问题其实有点复杂。这是由 PHP 加载 php.ini 两次引起的,因为我为 --with-config-file-path--with-config-file-scan- 指定了相同的位置dir 在编译时。

因此,您可能希望执行以下操作,作为我上面指定的更好的替代方法(这也有效,但有一个限制,因为您将无法加载 Zend 扩展,例如 IonCube Loader):

  1. 使用以下选项编译 PHP --with-config-file-scan-dir=/usr/local/php/etc/conf.d。使其与 --with-config-file-path 不同。
  2. 创建一个单独的文件来加载您的 PHP 扩展(您可以将其称为 phpext.ini)并将其保存在上面定义的位置,即 /usr/local/php/etc/conf.d。在此文件中,定义您要加载的所有扩展,例如扩展名=apc.so。您的扩展应该保存在 /usr/lib/php5/20090626/ 目录中,我想这应该是默认目录。确保您没有在主 php.ini 文件中定义扩展。
  3. 重启 PHP

现在一切正常,您将能够加载 Zend 扩展(因为它们必须在您的 php.ini 文件中定义,不能在 php-fpm.conf 中)。

干杯。

关于php - 每个 PHP-FPM Worker 是否单独加载 php.ini?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173959/

相关文章:

javascript - 将 &lt;script&gt; 标签中的网站页面源数据存储到数据库 (php)

PHP:json 解码限制

php - mysql单查询join 3表并得到所有结果

php - PHP中mongodb聚合中的Substr

PHP 内爆不适用于大数组?

php - 无法在docker容器中安装soap

php - 需要将 json 值转换为来自 cookie 的变量

php - 使用 $GLOBAL 来防止 SELECT latest ID+1 和 INSERT 之间的重复键问题

javascript - 如何使用 jquery ajax 将 POST 数据发送到 PHP 函数

php - 我可以在请求的 javascript 中访问我的 ajax 请求的 href 吗?