Устаревшие ошибки при установке груши - PullRequest
3 голосов
/ 11 мая 2010

Я пытаюсь установить PEAR на OS X, используя встроенную установку 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.

Есть ли хороший способ это исправить?

Ответы [ 4 ]

2 голосов
/ 12 июня 2011

Проблема в том, что PEAR не совместим с PHP 5.3, и когда вы пытаетесь запустить его под PHP 5.3, он работает, но вы получаете много предупреждений об устаревании.

Что еще хуже, поведение инструмента командной строки PEAR заключается в том, что когда PHP обнаруживает ошибки, то независимо от значения параметра INI «display_errors» или даже параметра «report_errors» все ошибки обнаруживаются и отображаются на стандартном выводе. (и с дополнительными пустыми строками для загрузки, так что это будет очень раздражающим).

Есть несколько способов исправить это, но все они включают редактирование кода груши прямо на вашем компьютере. в конечном итоге я отредактировал файл 'pearcmd.php', который устанавливает PEAR, и изменил команду print "..." в конце (в функции error_handler) на file_put_contents("php://stderr","..."); (где ... обозначает правильный текст в коде). Это приводит к тому, что все сообщения об ошибках выводятся в стандартный поток ошибок вместо стандартного вывода - как это должно было быть сделано в первую очередь, а затем вы можете просто добавить 2>/dev/null после команд груши, чтобы отключить сообщения об ошибках, если вы не хочу их видеть.

2 голосов
/ 11 октября 2010

@ kguest

Мне не удалось найти "php_ini" в списке конфигурации.

@ JW

Я решил проблему, изменив поведение встроенного обработчика ошибок командной строки PEAR: в файле /usr/share/pear/pearcmd.php внизу файла измените тело обработчика ошибок на:

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 при создании этого компонента, но они могли бы по крайней мере предоставить способ скрыть ошибки.

0 голосов
/ 12 мая 2010

К сожалению, разработчики пакетов PEAR иногда не заботятся об ошибках такого типа (я столкнулся с аналогичной проблемой , которая была решена как поддельная). Поэтому я не буду рассчитывать на исправление этих ошибок в ближайшее время.

Мое решение состоит в том, чтобы установить значение error_reporting в php.ini, чтобы показывать только реальные (фатальные) ошибки, и настроить это значение в вашем собственном приложении. Для лучшего поведения вы должны, конечно, сделать это в первую очередь. Как то так:

<?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 голосов
/ 11 мая 2010

Мне кажется, вам нужно изменить параметр конфигурации груши:

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

Вы можете подтвердить, что это установлено с помощью

$pear config-get php_ini

или

$pear config-show
...