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

时间:2011-11-17 20:38:09

标签: 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工作者处于活动状态。当我重新启动PHP时,他们都试图加载php.ini文件(因此模块已经加载的消息)?!如果它们是,有没有办法可以阻止它来阻止错误,因为当我加载Zend Loader时错误变得致命?

提前致谢。

3 个答案:

答案 0 :(得分:8)

几个小时后,我设法找到了解决这个问题的方法。我想这对那些从源代码编译和安装带有FPM的PHP更有利(所有你认为人们可能与此无关)

基本上,它涉及使用你的php-fpm.conf来加载所有PHP扩展,而不是php.ini。这是你做的:

  1. 打开你的php-fpm.conf文件(我从源码安装了我的php,所以根据我设置/usr/local/php/etc/php-fpm.conf--prefix的方式我在--with-config-file-path处有我的,但是您可以使用bash shell中的find / -name "php-fpm.conf"来查找您的位置。

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

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

    我做了以上操作,没有更多错误,我的所有扩展程序都显示在phpinfo()

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

    干杯。

    修改

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

    所以你想要做以下内容作为我上面指定的更好的选择(它也有效,但有一个限制,因为你将无法加载Zend扩展,例如IonCube Loader):

    1. 使用以下选项--with-config-file-scan-dir=/usr/local/php/etc/conf.d编译PHP。使其与--with-config-file-path
    2. 不同
    3. 创建一个单独的文件来加载PHP扩展(您可以将其命名为phpext.ini)并将其保存在上面定义的位置,即/usr/local/php/etc/conf.d。在此文件中,定义要加载的所有扩展程序,例如extension=apc.so。您的扩展名应保存在/usr/lib/php5/20090626/目录中,该目录应该是我认为的默认目录。确保您没有在主php.ini文件中定义扩展名。
    4. 重启PHP
    5. 现在一切都会正常工作,你可以加载Zend Extensions(因为它们必须在php.ini文件中定义,不能在php-fpm.conf中)。

      干杯。

答案 1 :(得分:0)

Ubuntu为PHP使用多个confiugration文件,每个扩展名通常一个。如果您通过系统软件管理(例如apt)安装扩展程序,则无需在php.ini文件中手动启用扩展程序。

如果您删除已添加到php.ini的文件,则应解决您的问题。

此外:PHP会在每个活动进程中读取所有ini文件。

答案 2 :(得分:0)

检查/etc/php5/conf.d中是否没有任何geoip / apc子ini。 Ubuntu倾向于通过将.ini插入conf.d目录来加载外部驱动程序,并将主.ini单独保留。