Kimsufi : Commande php ob_implicit_flush ne fonctionne pas

Bonjour à toutes et à tous,

Je suis sur un hébergement web Kimsufi OVH avec le domaine suivant : plumebd.cluster029.hosting.ovh.net ou https://plumebot.com/.

Le problème est que la commande PHP ob_implicit_flush(true) ne fonctionne pas. J'ai testé plusieurs headers différents, comme indiqué ci-dessous :
- header("X-Accel-Buffering: no");
- header('Content-Encoding: none');
- header("Content-Type: text/plain");
Malgré ces différents tests, je n'ai constaté aucune amélioration.

L'appel au PHP est réussi et le dernier envoi est correct, affichant tous mes "echo". Cependant, le texte n'apparaît pas petit à petit comme cela devrait être le cas.

Bien évidemment, en local sur une machine de développement, tout fonctionne correctement. J'ai également testé différentes configurations de PHP sur OVH, mais cela n'a pas permis d'améliorer la situation.

Bonjour,
Je me permet de vous écrire car je rencontre un problème similaire sur un hébergement mutualisé un simple script sur un fichier serverSse.php (imprime la date heure courante), ainsi je récupère le flux par EventSource de javascript. le résultat est le suivant, j'ai un énorme décallage entre l'envoie et la réception (quasiement 1 minute de différence…):



serverSse.php:
date_default_timezone_set("Europe/Paris");
header("X-Accel-Buffering: no");
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
$counter = rand(1, 10); // a random counter
$i = 0;
while (1) {
_ $curDate = date(DATE_ISO8601);
echo "event: ping\n",
'data: {"time": "' . $curDate . '"}', "\n\n";
$counter–;
if (!$counter) {
$i++;
echo 'data: ' .$i.' -> '. $curDate, "\n\n";
$counter = rand(1, 10); // reset random counter_
_ }
while (ob_get_level() > 0) {
ob_end_flush();
}
flush();
if ( connection_aborted() ) break;
sleep(1);
}

client.html
const evtSource = new EventSource('/serverSse.php');
console.log(evtSource.withCredentials);
console.log(evtSource.readyState);
console.log(evtSource.url);
const eventList = document.querySelector('ul');

evtSource.onopen = function() {
console.log("Connection to server opened.");
};

evtSource.onmessage = function(e) {
const newElement = document.createElement("li");
let dth = new Date();
newElement.textContent = "Message envoyé blup : " + e.data+" et reçu le "+dth;
eventList.appendChild(newElement);
};

evtSource.onerror = function() {
console.log("EventSource failed.");
};_

Les tests en local fonctionnent avec un delta inférieur à la seconde (quasi immédiat). Sur l'hébergement c'est incompréhensible…

Merci d'avance pour votre retour d'expérience concernant le sujet que vous avez rédigé.

Bonjour, OVH désactive tous les services de flux sortant.<br />Pour contrer ça, je le simule ; j&#39;écris simplement les résultats de la réponse <br />en temps réel dans un fichier à côté du PHP. Côté client, je charge plusieurs fois par seconde ce fichier pour avoir le résultat de la réponse.<br /><br />Tu peux voir le résultat directement sur mon site https://plumebot.com/<br />Tu verras que le texte s&#39;écrit petit à petit avec cette technique.

Bonjour,

Merci à toi pour cette réponse j'ai poursuivi mes recherche et j'ai trouvé une piste intéressante… Je m'explique:
-> Je ne l'ai pas mentionné dans mon code du fichier serverSse.php mais j'effectue un ini_set("output_buffering",0);
-> Je contrôle la valeur de de ce paramètre dans ma boucle et ce dernier reste fixé à 4096…
J'ai ai déduit qu'il faut fournir un minimum de données pour que le retour se fasse…
Donc j'ai générer une chaine de caractère aléatoire pour compléter le buffer et là retour immédiat!!!



Si tu observes mon test j'ai un retour immédiat suite au gonflement du flux par l'ajout d'une chaine aléatoire…

J'ai transmis les éléments à OVH, mais l'utilisation de ini_set("output_buffering",0); ne fonctionne pas.
Bon c'est une solution de contournement (rustine) mais cela augmentera la bande passante sur l'envoie de petites données…

Merci encore pour ton retour.