我在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时错误变得致命?
提前致谢。
答案 0 :(得分:8)
几个小时后,我设法找到了解决这个问题的方法。我想这对那些从源代码编译和安装带有FPM的PHP更有利(所有你认为人们可能与此无关)
基本上,它涉及使用你的php-fpm.conf来加载所有PHP扩展,而不是php.ini。这是你做的:
打开你的php-fpm.conf文件(我从源码安装了我的php,所以根据我设置/usr/local/php/etc/php-fpm.conf
和--prefix
的方式我在--with-config-file-path
处有我的,但是您可以使用bash shell中的find / -name "php-fpm.conf"
来查找您的位置。
添加扩展加载指令(理想情况下,在文件末尾)。你需要在这里小心,因为格式有点不同。在你的php.ini文件中,它就像这个extension=apc.so
,但是在你的php-fpm.conf文件中,它应该被定义为php_admin_value[extension]=apc.so
。
注意:确保在php.ini文件中定义了extension_dir
(保存扩展名的所有.so文件的位置)值。然后重启php-fpm。
我做了以上操作,没有更多错误,我的所有扩展程序都显示在phpinfo()
。
我希望这对某人有所帮助,它实际上让我发疯了。
干杯。
修改强>
经过进一步测试后,我发现这个问题实际上有点复杂了。它是由PHP加载php.ini两次引起的,因为我在编译时为--with-config-file-path
和--with-config-file-scan-dir
指定了相同的位置。
所以你想要做以下内容作为我上面指定的更好的选择(它也有效,但有一个限制,因为你将无法加载Zend扩展,例如IonCube Loader):
--with-config-file-scan-dir=/usr/local/php/etc/conf.d
编译PHP。使其与--with-config-file-path
。/usr/local/php/etc/conf.d
。在此文件中,定义要加载的所有扩展程序,例如extension=apc.so
。您的扩展名应保存在/usr/lib/php5/20090626/
目录中,该目录应该是我认为的默认目录。确保您没有在主php.ini文件中定义扩展名。现在一切都会正常工作,你可以加载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单独保留。