Considéré par qui ?L'installation de WordPress a été considérée comme un outil de production qui ne nécessitait pas de développement. Les développements sont relativement mineurs et ne nécessitaient pas d'avoir à déboguer
Pour avancer, il faut que l'on ait le code problématique, la config de la plateforme et les logs.La nature du plantage ne me laisse que très peu d'espoir de reproduction après un changement d'environnement.
D'expérience, 99.9% des développeurs qui mettent en cause le moteur PHP plutôt que leur code se trompe.Cette fonction de bas niveau sans paramètre ne peut pas se planter sauf sur une défaillance système, pas sur un problème de développement.
Code : Tout sélectionner
Le générateur de widget à écrit <div id='widgets'> et lance widget_toc
function widget_toc ($args=array(), $instance=array() ) {
echo '<!-- Widget_toc begin -->';
$str_ob = ob_get_contents();
echo '<!-- Widget_toc begin : got output buffer (ob_get_content) -->';
...
}Code : Tout sélectionner
<div id='widgets' >
<!-- Widget_toc begin -->
<!-- Widget_toc begin : got output buffer (ob_get_content) -->
puis tout le code html correct du widget
puis les autres widgets suivants
</div>Code : Tout sélectionner
<div id='widgets' ...>
<!-- Widget_toc begin -->
puis les autres widgets suivants
</div>
Si tu ne veux pas parler d'erreur, parlons à défaut d'un comportement inattendu mais dans tous les cas, il y a bien un problème quelque part sinon tu ne serais pas là.Il n'y strictement rien qui puisse produire une erreur.
Ton code s'appuie sur du code de Wordpress, il t'appartient de bien vérifier que toutes les données que tu récupères en entrée soient conformes à ce que tu attends et il faut que tu remontes les appels de fonctions pour valider que l'architecture dans laquelle tu t'inscris fait bien les bons appels aux bons moments tels que tu l'as conçu.Maintenant, qu'il y ait une anomalie précédente qui ne génère pas d'erreur signalée à l'exécution ou conduisant à un crash, mais perturbant l'exécution de Php de sorte que l'appel de ob_get_contents() produise un effet inattendu, ça je suis tenté de le croire.
Mais ce code n'est pas le mien.
En informatique, rien n'est magique, il y a donc forcément eu une modification quelque part, que ce soit une mise à jour de wordpress (qui peut se faire automatiquement), d'un de ses plugin ou une mise à jour de la plateforme qui t'héberge...cela fonctionnait depuis quatre mois sans broncher. Et puis sans crier gare et aucune modification nouvelle, l'exécution se plante... sur la lecture alors qu'aucun code modifié n'a encore été exécuté.
A un moment il va peut être quand même falloir se remettre en question... et arrêter les "je sais que c'est impossible", "je sais que *mon* code est bon..."J'entreprends donc, puisqu'il est impossible de trouver de cas de plantage de cette fonction, le rapatriement de l'application sur ma plateforme de développement.
Mais je sais qu'il il n'y aucune chance que je trouve une erreur qui "implique" le plantage, et je suis quasi certain que les logs Apache-Php et surtout les traces que pourra produire XDebug ne donneront aucun lien entre une erreur et le plantage.
Si tu procède à un débogage méthodique en comprenant ce que tu fais, il n'y a pas de raison que le problème disparaisse sans savoir pourquoi...Par contre en éliminant des erreurs ou alertes non fatales (générées par le code de WordPress ou d'autres plugins précédents dans l'exécution), je pense qu'il est à peu près certain que le problème disparaîtra sans que jamais on ne découvre pourquoi, ni surtout que le délai pour le traiter soit maîtrisable.
D'où l'importance de bien valider en entrée les données reçues de l'extérieur et de comprendre le fonctionnement du code dans lequel tu t'insères.Ceci étant j'ai déjà connu plusieurs cas de plantages (pas en php mais en langage compilé) du à des données non (mal) contrôlées, et en fait de contenu invalide, générant des défaillances aléatoires générant en cascade des erreurs ultérieures à des emplacements imprévisibles (en général les données invalides entraînaient un débordement mémoire sans conséquence immédiate...).
Nous sommes parfaitement d'accord.Si tu ne veux pas parler d'erreur, parlons à défaut d'un comportement inattendu mais dans tous les cas, il y a bien un problème quelque part sinon tu ne serais pas là.
Si tu es en train de me dire qu'un utilisateur de WordPress, je ne le crois pas, doit vérifier le code quand s'il écrit : "Jean est allé à l'école", "Claude est allée à l'école", passe mais que "Jean-Michel est allé à l'école" est une erreur parce que le code ne sait pas traiter le noms composés... On ne peut pas être d'accord.Ton code s'appuie sur du code de Wordpress, il t'appartient de bien vérifier que toutes les données que tu récupères en entrée soient conformes à ce que tu attends et il faut que tu remontes les appels de fonctions pour valider que l'architecture dans laquelle tu t'inscris fait bien les bons appels aux bons moments tels que tu l'as conçu.
Sauf que, j'ai donné le code d'origine mais pas les test, avant d'écrire j'ai tout vérifié (du moins je crois) et si le buffer était vide ou non ouvert il retournerait une chaîne vide ou false. Ceci étant comme le commentaire qui précède fait bien partie de la page HTML générée il n'y a pas de question a se poser.En l’occurrence, avec les quelques lignes que tu nous as donné, tu fait un appel à ob_get_contents() mais tu ne sembles pas maitriser le moment où ob_start() est déclenché ni qu'il n'y aurais pas un ob*_flush() ou ob*_clean() ou équivalent qui viderait le buffer et t’empêcherait de l'exploiter.
Mais si, dans les données, le cas que je cite plus haut le produit fonctionnait depuis des années et puis un jour quelqu'un a créé un jeu de données "invraisemblable" pour l'homme de l'art... ou bien une combinaison théorique valide mais... mais oùEn informatique, rien n'est magique, il y a donc forcément eu une modification quelque part, que ce soit une mise à jour de wordpress (qui peut se faire automatiquement), d'un de ses plugin ou une mise à jour de la plateforme qui t'héberge...
Mais le plantage arrive avant que mon code ne s'exécute. A moins que l'exécution future ne lu fasse peur...A un moment il va peut être quand même falloir se remettre en question... et arrêter les "je sais que c'est impossible", "je sais que *mon* code est bon..."
Je ne dis pas que je ne vais rien trouver, mais qu'il n'y aura pas d' "implication" directe. Autrement dit ob_get_content() arrête la fonction parce qu'il y a eu un "accident" en amont. J'ai eu le cas ou la zone mémoire lue (une string) avait été écrasée par une instruction précédente, bien plus haut dans le code. C'est donc en éliminant des erreurs possibles ou certaines mais sans conséquences immédiates que le problème disparaîtra. Je te donne rendez-vous.Mais je sais qu'il il n'y aucune chance que je trouve une erreur qui "implique" le plantage, et je suis quasi certain que les logs Apache-Php et surtout les traces que pourra produire XDebug ne donneront aucun lien entre une erreur et le plantage.
Mais si, je saurais qu'il y a une relation de cause à effet (même reproductible) mais je n'aurai pas d'explication de la causalité : Si x alors y, est vrai mais pourquoi ?Si tu procède à un débogage méthodique en comprenant ce que tu fais, il n'y a pas de raison que le problème disparaisse sans savoir pourquoi...![]()
C'est vrai mais c'est un voeux pieux, avec 12000 modules et 1000000 de lignes de code...D'où l'importance de bien valider en entrée les données reçues de l'extérieur et de comprendre le fonctionnement du code dans lequel tu t'insères.
Désolé mais comme c'est l'instruction de base d'affectation à une variable du contenu du buffer qui plante et qui fait sortir de la procédure comme je l'indique, il est vérifié qu'aucune instruction de la fonction ne s'exécute après le ob_get_content(); qui s'avère terminal.As tu essayé d'afficher le buffer après l'appel à ob_get_contents ? à la fin de la fonction widget_toc ?
Code : Tout sélectionner
function appel() {
echo '<div ..>';
A();
B();
echo "</div>";
}
function a() {
echo "<!-- avant ob_get_content par a() -->";
ob_get_content();
echo "<!-- avant ob_get_content par a() -->";
.....
}
function b()
{echo "<!-- début de b() -->";
.... }Code : Tout sélectionner
<html précédent la fonction puis le tag précédent généré par appel() : <div...>
<!-- avant ob_get_content par a() -->
<!-- début de b() -->";
< HTML code généré ensuite par fonction suivante B >
etc...
</div>Désolé c'est à coté de la question et fauxIl suffirait d'un ob_get_clean() ou ob_end_clean() mal placé pour obtenir le "cas de plantage".
<?php
echo '-- BEFORE ob_get_contents() --<br/>';
$str = ob_get_contents();
echo '-- AFTER ob_get_contents() --<br/>';
echo $str;
Affiche :
-- BEFORE ob_get_contents() --
-- AFTER ob_get_contents() --
-- BEFORE ob_get_contents() --
Cet exemple illustre l'effet du ob_end_clean (il produit bien un affichage similaire au cas de plantage, on a la sortie qui précède le ob_get_contents mais pas la sortie qui suit) :
<?php
echo '-- BEFORE ob_get_contents() --<br/>';
$str = ob_get_contents();
echo '-- AFTER ob_get_contents() --<br/>';
ob_end_clean();
echo $str;
Affiche :
-- BEFORE ob_get_contents() --
Et cet exemple pour montrer que c'est bien le echo $str qui produit l'affichage :
<?php
echo '-- BEFORE ob_get_contents() --<br/>';
$str = ob_get_contents();
echo '-- AFTER ob_get_contents() --<br/>';
ob_end_clean();
N'affiche rien.<div><!-- avant ob_get_content par a() --><!-- avant ob_get_content par a() --><!-- début de b() --></div>
Je pense que tout le monde a compris qu'il y avait une erreur dans la mise en forme du message il fallait lire "après" dans le code que j'avais un tout petit peu mis en forme avec un copier coller alors que le code comprend des notes.En revanche ton exemple n'imprime pas ce que tu dis, il imprime ceci (le commentaire après ob_get_contents s'affiche aussi) :Code : Tout sélectionner
<div><!-- avant ob_get_content par a() --><!-- avant ob_get_content par a() --><!-- début de b() --></div>