【问题标题】:Deprecated errors when installing pear安装 pear 时不推荐使用的错误
【发布时间】:2011-06-12 07:41:58
【问题描述】:

我正在尝试在 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 级别。

有什么好办法解决这个问题吗?

【问题讨论】:

  • 恐怕解决这个问题的最好方法是向 PEAR 的维护者提交错误报告以修复他们的代码。

标签: php pear


【解决方案1】:

@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 配置中的详细级别,但它什么也没做(但此行在达到时会引发 FATAL ERROR)。

我不知道 PEAR 维护者在创建这个组件时的想法,但他们至少可以提供一种隐藏错误的方法。

【讨论】:

    【解决方案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","...");(其中 ... 代表正确的文本在代码中)。这会导致所有错误消息都输出到标准错误流而不是标准输出 - 因为它应该首先完成,然后您可以在 pear 命令之后添加 2&gt;/dev/null 以使错误消息静音,如果您不想看到他们。

    【讨论】:

      【解决方案3】:

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

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

      您可以确认这是通过

      $pear config-get php_ini
      

      $pear config-show
      

      【讨论】:

        【解决方案4】:

        不幸的是,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();
        
        ?> 
        

        【讨论】:

        • 我忽略了一些事情,如果您认为某些 PEAR 类正在更改 error_reporting 值,请找出是哪一个并在此处发布。我还没有遇到过这样的包。
        猜你喜欢
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 2014-02-24
        • 1970-01-01
        • 2016-04-20
        相关资源
        最近更新 更多