Php

PECL 命令產生一長串錯誤

  • January 26, 2018

目前在 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 命令不會遇到這些相同的問題。

引用自:https://serverfault.com/questions/589877