2010-05-10 11 views
3

J'essaye d'installer PEAR sur OS X, en utilisant l'installation PHP 5.3 intégrée. Je l'ai fait:Des erreurs obsolètes lors de l'installation de pear

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

Après avoir répondu à quelques invites, je commence à obtenir des tonnes d'erreurs comme ceci:

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 

Maintenant, je comprends ce que ces erreurs signifient. Je veux juste les cacher. Donc, dans mon dossier /private/etc/php.ini, je donne les résultats suivants:

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

Ce cache ces mêmes erreurs dans mon propre code. Mais dans PEAR, ce n'est pas le cas. Ils semblent changer le niveau error_reporting.

Y at-il un bon moyen de résoudre ce problème?

+0

Je crains que la meilleure façon de résoudre ce problème est de déposer un rapport de bogue pour que les mainteneurs de PEAR corrigent leur code. – staticsan

Répondre

0

Il me semble que vous devez modifier un paramètre de configuration de poire:

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

Vous pouvez confirmer cela est défini par

$pear config-get php_ini 

ou

$pear config-show 
0

Malheureusement, les mainteneurs de Les paquets PEAR ne se soucient pas vraiment de ce type d'erreurs (j'ai rencontré a similar problem, qui a été résolu en tant que faux). Donc, je ne compterais pas sur ces erreurs étant corrigé de sitôt.

Ma solution consiste à définir la valeur error_reporting dans php.ini pour afficher uniquement les erreurs réelles (fatales) et pour ajuster cette valeur dans votre propre application. Pour le meilleur comportement, vous devriez bien sûr le faire en premier. Quelque chose comme ceci:

<?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

J'ai oublié quelque chose, si vous pensez qu'une classe PEAR change la valeur error_reporting, s'il vous plait, trouvez laquelle et postez la ici. Je n'ai pas encore rencontré un paquet qui le fait. –

2

@kguest

Je ne pouvais pas trouver le "php_ini" dans la liste de configuration.

@JW

I a résolu le problème en modifiant le comportement du gestionnaire d'erreurs interne de la ligne de commande PEAR: dans le fichier /usr/share/pear/pearcmd.php, à la fin du fichier, transfert de la 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"; 
} 

Cela rendra la commande PEAR compatible avec votre niveau de rapport d'erreurs php.ini. (faire la même chose avec peclcmd.php)

Par ailleurs, cette fonction permet de lire un descripteur de configuration vide avec

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

J'ai donc essayé de changer le niveau de verbosité dans la configuration de PEAR, mais il ne fait rien (pourtant cette ligne soulève une ERREUR FATALE quand elle est atteinte). Je ne sais pas ce que les responsables de PEAR avaient en tête lorsqu'ils ont créé ce composant, mais ils pouvaient au moins fournir un moyen de masquer les erreurs.

2

Le problème est que PEAR n'est pas compatible avec PHP 5.3 et quand vous essayez de l'exécuter sous PHP 5.3, cela fonctionne mais vous obtenez beaucoup d'avertissements de dépréciation. Pour empirer les choses, le comportement de l'outil de ligne de commande PEAR est que lorsque PHP rencontre des erreurs, alors quel que soit le paramètre "display_errors" INI, ou même le paramètre "report_errors", toutes les erreurs sont interceptées et affichées sortie (et avec des lignes vides supplémentaires pour démarrer, donc ce sera plus ennuyeux).

Il y a plusieurs façons de résoudre ce problème, mais elles impliquent toutes l'édition du code de pear directement sur votre machine. ce que finalement j'ai fait, édite le fichier 'pearcmd.php' que PEAR installe, et change la commande print "..." à la fin (dans la fonction error_handler) à file_put_contents("php://stderr","..."); (où ... représente le texte correct dans le code). Cela provoque tous les messages d'erreur à sortir dans le flux d'erreur standard au lieu de la sortie standard - comme cela aurait dû être fait en premier lieu, et vous pouvez simplement ajouter 2>/dev/null après vos commandes pear pour faire taire les messages d'erreur si vous ne Je ne veux pas les voir.