Le commit 0a11c22556 sur ecrire/inc/actions.php ne fonctionne pas pour moi. En remplaçant le die() par ob_end_flush(), je n’ai plus le menu de rubriques.
La page spip.php?action=menu_rubriques&date=
Ne vient pas (ou alors pétée avec un message d’erreur au bout de du max exécution time.
C’est le problème que le die() résolvait, et qui ne fonctionne donc plus avec la nouvelle alternative.
=> Accessoirement, je ne sais pas comment on fait pour commenter directement une révision de Git. Sur git.spip.net, il n’y a pas un bouton qui permettrait de faire un ticket directement depuis une révision?
Je me demande pourquoi le problème ne se pose que chez toi a priori. Tu n’aurais pas un fichier qui echo quelque chose avant ? genre une ligne vide avant <?php dans un fichier d’option ?
Si ça ne marche pas, exit serait plus élégant que die (au sens où c’est le terme utilisé ailleurs dans SPIP)
mais si le problème vient du Fatal Error… ? qu’est-ce que ça corrige du coup de mettre un die ? Tu veux dire que le traitement est fini, mais quelque chose fait que le résultat ne part pas et conserve la transaction ouverte jusqu’au timeout ? Ce ne serait pas autre chose qui conserverait la transaction ouverte ? C’est assez étonnant qu’on ne reproduise pas ce souci.
Si tu penses que ça vient des spécificités du serveur, tu as des détails plus précis ? des pistes de pourquoi ?
Apparemment la boucle:
while (ob_get_level()) ob_end_flush();
ne sort jamais chez moi. Si j’ajoute un echo « A » dans la boucle, j’obtiens une infinité de A… (une fois atteint le max_execution_time)
Les AAA, c’est quand je modifie inc/actions.php. Là j’ai juste fait tourner ton script dans un fichier indépendant (donc sans aucun lien avec SPIP). Et non, rien d’autre après 2:2. Même pas un message d’erreur.
(Pour les adresses email, oui on peut fusionner: comme arno@rezo.net est un reroutage d’un compte gmail, je me faisais jeter mes emails à la liste.)
Voilà c’est ça. Tu as un ob_end_flush() qui retourne false, c’est à dire qu’il n’arrive pas à le faire, et du coup ob_get_level() reste à la même valeur.
@arno j’ai donc fusionné tes deux comptes, en laissant celui avec chez rezo que tout le monde connait, et j’ai modifié ce compte pour t’y remettre le pseudo et le nom technique « arno » (pour les ping)
déjà j’ai envoyé un patch pour éviter la boucle infinie sur la tentative de flush :
J’essaye de reproduire le problème mais même si j’active le zlib.output_compression, avec ou sans cache_cool je n’arrive pas à reproduire le defaut de flush.
J’ai bien la même configuration de buffer dans mon print_r(ob_list_handlers()); mais ça ne bloque jamais la sortie.
Tu utilises quelles versions de PHP et Apache, et est-ce que tu n’as pas un autre plugin qui ferait une action en fin de hit et retarderait la sortie ?
Est-ce que tu peux aussi essayer l’URL ecrire/?action=menu_rubriques&date= et voir si elle se comporte pareil ?
Est-ce que tu peux aussi essayer d’ajouter un
ob_implicit_flush(true);
avant le echo ?
On peut toujours mettre un ini_set dans ajax_retour, mais je crains que ce ne soit qu’un patch hyper local qui résolve pas le vrai soucis (et de facto il va sauter un jour ou l’autre parce que inexplicable)