2010-05-10 76 views
3

當我試圖在OS X上安裝PEAR,使用內置的PHP 5.3的安裝。我這樣做:過時的錯誤安裝梨

curl http://pear.php.net/go-pear > go-pear.php 
php go-pear.php 

回答一些提示後,我開始越來越噸的錯誤是這樣的:

Deprecated: Assigning the return value of new by reference is deprecated in /Users/username/bin/pear/temp/PEAR.php on line 563 
PHP Deprecated: Assigning the return value of new by reference is deprecated in /Users/username/bin/pear/temp/PEAR.php on line 566 

現在,我明白這些錯誤的意思。我只是想隱藏它們。所以在我的/private/etc/php.ini文件,我有以下幾點:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 

這在我自己的代碼隱藏那些同樣的錯誤。但是在PEAR中它不是。他們似乎正在改變error_reporting級別。

是否有解決這一問題的好辦法?

+0

恐怕解決這個問題的最好方法是向PEAR的維護者提交一個錯誤報告以修復他們的代碼。 – staticsan 2010-05-11 01:43:52

回答

0

在我看來,你需要改變一個梨配置設置:

$pear config-set php_ini /private/etc/php.ini 

您可以確認這是通過

$pear config-get php_ini 

$pear config-show 
0

的不幸的是,維護設置PEAR包有時並不真正在意這些類型的錯誤(我遇到過a similar problem,這被解決爲假)。所以我不會指望這些錯誤很快就會被修復。

我的解決辦法是在php.ini中設置error_reporting值,只顯示真正的(致命)的錯誤,並調整自己的應用程序這個值。爲了最好的行爲,你當然應該首先做到這一點。事情是這樣的:

<?php 
    // include required PEAR classes 
    require_once('PEAR.php'); 

    class Application() { 

     public static main() { 
      // get $errlevel value from some sort of configuration 
      error_reporting($errlevel); 
     } 

    } 

    $myApp = Application::main(); 

?> 
+0

我忽略了一些東西,如果您認爲某些PEAR類正在更改error_reporting值,請找出哪一個並在此處發佈。我還沒有遇到過這樣做的軟件包。 – 2010-05-12 17:03:27

2

@kguest

我無法找到 「php_ini」 中的配置列表中。

@JW

我改變PEAR命令行的內部錯誤處理程序的行爲解決了這個問題:在文件/usr/share/pear/pearcmd.php ,在該文件的底部,改變error_handler的body to:

if ($errno & error_reporting()) { 
    $errortype = array (
     E_ERROR => "Error", 
     E_WARNING => "Warning", 
     E_PARSE => "Parsing Error", 
     E_NOTICE => "Notice", 
     E_CORE_ERROR => "Core Error", 
     E_CORE_WARNING => "Core Warning", 
     E_COMPILE_ERROR => "Compile Error", 
     E_COMPILE_WARNING => "Compile Warning", 
     E_USER_ERROR => "User Error", 
     E_USER_WARNING => "User Warning", 
     E_USER_NOTICE => "User Notice" 
    ); 
    $prefix = $errortype[$errno]; 
    global $_PEAR_PHPDIR; 
    if (stristr($file, $_PEAR_PHPDIR)) { 
     $file = substr($file, strlen($_PEAR_PHPDIR) + 1); 
    } else { 
     $file = basename($file); 
    } 
    print "\n$prefix: $errmsg in $file on line $line\n"; 
} 

這將使PEAR命令與您的php.ini錯誤報告級別兼容。 (做peclcmd.php相同)

順便說一句,使用

$GLOBALS['config']->get('verbose') < 4 

於是,我就改變PEAR配置的詳細級別看空的配置描述符這個功能,但它什麼都不做(但是這條線在達到時會引起致命錯誤)。

我不知道PEAR維護者有什麼考慮時,他們創造了這個組件,但他們至少可以提供一種方法來隱藏錯誤。

2

的問題是,PEAR不與PHP 5兼容。3,當你嘗試在PHP 5.3下運行它時,它可以工作,但你會得到大量的棄用警告。更糟糕的是,PEAR命令行工具的行爲是,當PHP遇到錯誤時,不管「display_errors」INI設置的設置,甚至「report_errors」設置,所有錯誤都會被捕獲並顯示在標準輸出(並用額外的空行來引導,所以它會更煩人)。

有幾種方法可以解決這個問題,但它們都涉及到直接在你的機器上編輯pear的代碼。我最終做了什麼,編輯PEAR安裝的'pearcmd.php'文件,並在最後(在error_handler函數中)將print "..."命令更改爲file_put_contents("php://stderr","...");(其中...代表代碼中的正確文本)。這會導致所有錯誤消息輸出到標準錯誤流而不是標準輸出 - 因爲它應該先放在第一位,然後您可以在pear命令後面添加2>/dev/null以使錯誤消息消失,不想看到他們。