2011-11-17 65 views
2

我在Ubuntu Natty上從源代碼安裝了PHP 5.3.8。我還在配置期間啓用了FPM。每個PHP-FPM Worker是否單獨加載php.ini?

但是,我一直在安裝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時,錯誤會變得致命?

在此先感謝。

回答

8

幾個小時後,我設法找到一種方法來解決這個問題。我想這會更有利於編譯和安裝源代碼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公司裝載機的限制):

  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。在這個文件中,定義您要加載的所有擴展名,例如extension=apc.so。您的擴展應保存在/usr/lib/php5/20090626/目錄中,該目錄應該是我認爲的默認目錄。確保你沒有在主php.ini文件中定義你的擴展名。
  3. 重啓PHP

一切都將現在的工作很好,你將能夠加載Zend擴展庫(因爲它們必須在php.ini文件中定義,不能在php-fpm.conf) 。

乾杯。

+0

美麗!我總是想知道爲什麼php-fpm使用模塊加載警告混亂我的日誌.... – Olaseni

0

Ubuntu使用PHP的多個配置文件,通常每個擴展一個。如果您通過系統軟件管理(例如apt)安裝擴展,則不需要在php.ini文件中手動啓用擴展。

如果您刪除已添加到php.ini中的文件,這應該可以解決您的問題。

此外:PHP在每個活動進程中讀取所有ini文件一次。

+0

我安裝了所有的PHP和源碼的所有擴展,所以我必須手動啓用它們(我沒有使用apt-get)。他們都工作,並顯示在'phpinfo()',但我得到的錯誤。這是ZendGuardLoader.so,它加載時會導致致命錯誤(顯然是因爲它加載了兩次),其他錯誤只是給出錯誤,但擴展工作。 –

+0

從哪裏獲得源代碼,尤其是構建腳本? – hakre

+0

標準問題PHP:PHP源文件來自php.net,php擴展來自PECL。 –

0

檢查/etc/php5/conf.d中是否有任何geoip/apc sub-ini。 Ubuntu傾向於通過將他們的.ini插入conf.d目錄來加載外部驅動程序,並且僅保留主.ini文件。

+0

conf.d目錄中唯一的.ini文件是pdo.ini,它包含一行'extension = pdo.so'。在'/ etc/php5/cli/php.ini'中有另一個php.ini文件,但是從我的phpinfo()php.ini文件正在從'/ usr/local/php/etc/php.ini'文件中加載right .ini文件) –

相關問題