安装pear时不推荐使用的错误

时间:2010-05-10 23:42:39

标签: php pear

我正在尝试使用内置的PHP 5.3安装在OS X上安装PEAR。我这样做了:

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级别。

有没有好办法解决这个问题?

4 个答案:

答案 0 :(得分:2)

@kguest

我无法在配置列表中找到“php_ini”。

@JW

我通过更改PEAR命令行的内部错误处理程序的行为来解决问题: 在文件/usr/share/pear/pearcmd.php文件的底部,将error_handler的主体更改为:

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维护者在创建这个组件时会想到什么,但他们至少可以提供隐藏错误的方法。

答案 1 :(得分:2)

问题是PEAR与PHP 5.3不兼容,当你尝试在PHP 5.3下运行它时,它可以工作,但你会收到很多弃用警告。

更糟糕的是,PEAR命令行工具的行为是当PHP遇到错误时,无论“display_errors”INI设置的设置,甚至“report_errors”设置,所有错误都会被捕获并显示在标准输出上(并且需要额外的空行来启动,因此会更加烦人)。

有几种方法可以解决这个问题,但它们都涉及直接在您的计算机上编辑pear的代码。我最终做的是编辑PEAR安装的'pearcmd.php'文件,并将print "..."命令最后(在error_handler函数中)更改为file_put_contents("php://stderr","...");(其中{{ 1}}代表代码中的正确文本)。这会导致所有错误消息输出到标准错误流而不是标准输出 - 因为它应该首先完成,然后您可以在pear命令之后添加...以使错误消息静音如果你不想看到它们。

答案 2 :(得分:0)

在我看来,您需要更改梨配置设置:

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

您可以通过

确认此设置
$pear config-get php_ini

$pear config-show

答案 3 :(得分: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();

?>