délai côté php

This commit is contained in:
2026-01-17 23:48:35 +01:00
parent 2ca24a312b
commit a1606819a1
2 changed files with 42 additions and 19 deletions

View File

@@ -53,30 +53,34 @@
const citation = document.createElement('blockquote'); const citation = document.createElement('blockquote');
citation.innerText = formulaireData.get('question'); citation.innerText = formulaireData.get('question');
conversation.appendChild(citation); conversation.appendChild(citation);
formulaire.reset(); formulaire.reset();
const requete = await fetch(formulaire.action, {
method: formulaire.method,
body: formulaireData
});
const paragraphe = document.createElement('p'); const paragraphe = document.createElement('p');
paragraphe.setAttribute('aria-busy', 'true'); paragraphe.setAttribute('aria-busy', 'true');
conversation.appendChild(paragraphe); conversation.appendChild(paragraphe);
const reponse = await requete.text();
paragraphe.setAttribute('aria-busy', 'false'); const requete = await fetch(formulaire.action, {
Array.from(reponse).forEach((lettre, i) => { method: formulaire.method,
setTimeout(() => { body: formulaireData
if (lettre == "\n") paragraphe.innerHTML += "<br>";
else paragraphe.innerHTML += lettre;
}, i * 40);
}); });
setTimeout(() => { paragraphe.setAttribute('aria-busy', 'false');
conversation.innerHTML += "<p>😸 Voulez-vous que je réponde à une autre question ?</p>";
conversation.scrollTop = conversation.scrollHeight; const reader = requete.body.getReader();
bouton.disabled = false; const decoder = new TextDecoder("utf-8");
bouton.setAttribute("aria-busy", false);
}, reponse.length * 40); while (true) {
const { value, done } = await reader.read();
if (done) break;
const lettre = decoder.decode(value, { stream: true });
if (lettre == "\n") paragraphe.innerHTML += "<br>";
else paragraphe.innerHTML += lettre;
await new Promise(r => setTimeout(r, 0)); // micro pause pour rendre l'UI responsive
}
conversation.innerHTML += "<p>😸 Voulez-vous que je réponde à une autre question ?</p>";
conversation.scrollTop = conversation.scrollHeight;
bouton.disabled = false;
bouton.setAttribute("aria-busy", false);
}); });
</script> </script>
</body> </body>

View File

@@ -1 +1,20 @@
<?php echo `python markov.py`; ?> <?php
header('Content-Type: text/plain; charset=utf-8');
header('Cache-Control: no-cache'); // pour éviter le buffering du navigateur
header('X-Accel-Buffering: no'); // si nginx, pour désactiver le buffering
$reponse = `python markov.py`;
// désactiver le buffering PHP
@ini_set('output_buffering', 'off');
@ini_set('zlib.output_compression', 'off');
while (ob_get_level()) ob_end_flush();
flush();
// envoyer chaque lettre avec un délai
$len = strlen($reponse);
for ($i = 0; $i < $len; $i++) {
echo $reponse[$i];
flush(); // forcer l'envoi immédiat
usleep(40000); // 40ms = 40000 microsecondes
}