Est-il possible pour un serveur Web de répondre à une requête HTTP avec un stream de temps de sortie étendu?

Lorsque vous exécutez des scripts PHP dans la console, tout le texte de sortie standard de ce script apparaît dans la fenêtre de la console pendant l’exécution du script. Est-il possible qu’une fenêtre de navigateur reçoive de la même manière des rapports d’état dans le navigateur alors qu’un long script PHP est en cours d’exécution, au lieu de récupérer toutes les sorties à la fin du script?

Oui. Il suffit d’appeler périodiquement flush () et ob_flush (). Il est important d’écrire une sortie au moins toutes les 120 secondes pour garder la connexion au navigateur en vie.

Un exemple approximatif:

while(!$done) { //doWork(); echo number_format(100 * ($workDone/$workTotal)) . "% "; flush(); ob_flush(); } 

Edit: voici une preuve de concept arbitraire qui fonctionne dans mon env:

 print('hello'); print(str_repeat(".\n", 2048)); flush(); //this might be a safe way to only flush the buffer if necessary? if(ob_get_length()) ob_flush(); sleep(60); 

Oui, une chose dont vous devez vous soucier si vous avez un temps d’exécution particulièrement long est le délai d’expiration. Cela peut se produire en tant que délai d’expiration PHP ou en tant que délai d’attente du navigateur (généralement environ 2 minutes).

Cette documentation PHP sur la gestion des connexions contient de nombreuses informations sur la manière de conserver les connexions.