Petit rappel:
set_error_handler ("monGestionnaireErreur");
function monGestionnaireErreur ($errno, $errstr, $errfile, $errline, $errcontext){
// ici traitement perso des erreurs
}
Depuis PHP5, le dernier élément passé à la fonction callback, errcontext produit un tableau récursif infini qui génère, au mieux un *RECURSION* lors de l'utilisation de print_r() ou, au pire et c'est mon cas, une consommation explosive de la mémoire si on utilise une fonction personnelle récursive pour afficher le contenu d'un tableau.Le symbole actif fautif est GLOBALS.
Un peu comme dans le cas où on demande à un array de se mordre la queue:
$monTab = array();
// on rajoute à $monTab une référence à lui même.
$monTab[] = &$monTab;
print_r($monTab);
C'est lors du passage d'un site de PHP4 à PHP5 que je m'en suis aperçu. Prise de tête garantie.Pour tester chez vous:
// gestionnaire perso
function GestionnaireErreur ($errno, $errstr, $errfile, $errline, $errcontext{
echo '<pre>'. $errno.' '.$errstr.' '.$errfile.' '.$errline."\n";
print_r(array_keys($errcontext));
print_r($errcontext);
echo '</pre>';
}
// changement de gestionnaire d'erreur
$ancienHandler = set_error_handler ("GestionnaireErreur");
// erreur intentionnelle
date();
Solution boîteuse:
unset($errcontext['GLOBALS']);
Ais-je raté un épisode de la série "upgrade PHP4 -> PHP5" ?