我在 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。以下是您的操作:
打开你的 php-fpm.conf 文件(我从源代码安装了我的 php,所以我的文件位于
/usr/local/php/etc/php-fpm.conf
我设置了我的--prefix
和--with-config-file-path
,但你可以使用find/-name "php-fpm.conf"
从 bash shell 找到你的位置)。添加您的扩展加载指令(最好在文件末尾)。你需要小心,因为格式有点不同。在你的 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):
- 使用以下选项编译 PHP
--with-config-file-scan-dir=/usr/local/php/etc/conf.d
。使其与--with-config-file-path
不同。 - 创建一个单独的文件来加载您的 PHP 扩展(您可以将其称为 phpext.ini)并将其保存在上面定义的位置,即
/usr/local/php/etc/conf.d
。在此文件中,定义您要加载的所有扩展,例如扩展名=apc.so
。您的扩展应该保存在/usr/lib/php5/20090626/
目录中,我想这应该是默认目录。确保您没有在主 php.ini 文件中定义扩展。 - 重启 PHP
现在一切正常,您将能够加载 Zend 扩展(因为它们必须在您的 php.ini 文件中定义,不能在 php-fpm.conf 中)。
干杯。
关于php - 每个 PHP-FPM Worker 是否单独加载 php.ini?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173959/