PECL 命令產生一長串錯誤
目前在 CentOS 6.5 上執行 PHP 5.4。
我安裝了 webtatic php55w 軟體包,然後通過 PECL 安裝了 PEAR+PECL 以及 redis 和 mongo。
不久之後,我意識到 5.5 與我正在使用的框架不兼容,所以我 yum 刪除了 php55w 並在其位置安裝了 php54w。
現在 pecl 命令根本不起作用。每次我發出任何 pecl 命令時,它都會產生這個非常長的錯誤字元串(縮寫……重複了幾十次):
Warning: Invalid argument supplied for foreach() in Command.php on line 259 Warning: Invalid argument supplied for foreach() in /usr/share/pear/PEAR/Command.php on line 259 ...etc etc etc... Notice: Undefined index: honorsbaseinstall in Role.php on line 180 Notice: Undefined index: honorsbaseinstall in Role.php on line 180 ...etc etc etc... Notice: Undefined index: installable in Role.php on line 145 Notice: Undefined index: installable in Role.php on line 145 ...etc etc etc... Notice: Undefined index: phpfile in Role.php on line 212 Notice: Undefined index: phpfile in Role.php on line 212 ...etc etc etc... Notice: Undefined index: config_vars in Role.php on line 49 Notice: Undefined index: config_vars in Role.php on line 49 ...etc etc etc... Warning: Invalid argument supplied for foreach() in PEAR/Command.php on line 259 Warning: Invalid argument supplied for foreach() in /usr/share/pear/PEAR/Command.php on line 259 ...etc etc etc... XML Extension not found
我怎樣才能解決這個問題?
在 RedHat EL v6 上將我的 PHP 安裝更新到 5.5.14 後,我遇到了這個錯誤。我通過 Yum 包管理器安裝了 PHP,然後需要重新安裝一些我正在使用的 PHP 擴展。在尋找有關如何解決此問題的提示時,我遇到了這個問題,現在我發現了一個可行的解決方案,我想在這里分享我的發現。我在網上找到的其他建議包括擦除和重新安裝 PECL/PEAR,甚至我的 PHP 安裝都沒有解決這個問題。最後經過一些進一步的研究和審查 PECL/PEAR 的原始碼後,我找到了真正的原因。希望以下內容對其他人有所幫助:
如果您的 PHP 安裝預設沒有啟用 XML,您可能會在嘗試執行 PECL 時看到此錯誤,但通常通過 PHP 擴展模組將 XML 支持載入到您的 PHP 安裝中(如果
./configure --disable-xml
在建構 PHP 時指定了標誌,則可能會發生這種情況從原始碼,或者如果您通過各種包管理器安裝 PHP,其中 PHP 的建構配置為通過擴展模組載入 XML)。請注意 PECL 錯誤輸出的最後一行
XML Extension not found
- 出現此錯誤的原因是,當 PECL 嘗試使用其 XMLParser.php 類時,它失敗了,因為它無法訪問 XML 擴展(它使用extension_loaded('xml')
繞行檢查 XML 模組259 XMLParser.php 源),並且由於 XML 模組不可用,它無法解析其配置/設置文件並輸出上面看到的所有其他錯誤。出現此問題的原因是 PECL 的執行方式。PECL 命令本身只是一個 shell 腳本,它首先確定 PHP 在您的系統安裝中的安裝位置,然後在提供主 PECL PHP 腳本文件的路徑之前在命令行中使用許多標誌呼叫 PHP。PECL shell 腳本使用的問題標誌是
-n
選項,它告訴 PHP 忽略任何php.ini
文件(因此 PHP 不會載入您的php.ini
文件指定的任何附加副檔名,在這種情況下包括 XML)。可以
-n
通過執行以下兩個命令來查看標誌的影響:
- 首先嘗試
php -m
在命令行上執行- 然後將輸出與
php -n -m
當您執行第二個命令時,您不應該看到列出的 XML 副檔名,因為該
-n
標誌告訴 PHP 不要解析我們的php.ini
文件。如果您
vi
which pecl``在命令行上執行,您應該會看到 PECL 命令的內容(如上所述,它只是一個 shell 腳本),如果您檢查最後一行,您將看到如下內容:
exec $PHP -C -n -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d safe_mode=0 -d register_argc_argv="On" $INCDIR/peclcmd.php "$@"
您應該看到在和標誌
-n
之間列出的標誌。如果您編輯 PECL shell 腳本,省略該標誌,您現在應該能夠再次執行 PECL 而不會出現問題。-C``-q``-n
或者,您可以從原始碼重新編譯 PHP,確保將 XML 模組編譯為 PHP 二進製文件,而不是在執行時從 PHP 擴展模組載入。顯然,編輯 PECL shell 腳本以刪除
-n
標誌只會修復問題,直到重新安裝 PECL/PEAR,但希望 PECL/PEAR 的維護者可以使用此修復更新他們的 repo。然而,確保 PHP 是使用編譯的 XML 支持建構的,這是解決方案的長期修復,但可能並不適合每個人的情況。為了完整起見,如果您執行,
vi
which pear``您將看到一個與 PECL 使用的非常相似的 shell 腳本,但是-n
呼叫 PHP 的命令中缺少該標誌,因此 PEAR 命令不會遇到這些相同的問題。