PHP Chasse qui fonctionne... même dans Nginx
Est-il possible d'écho à chaque fois que la boucle est exécutée? Par exemple:
foreach(range(1,9) as $n){
echo $n."\n";
sleep(1);
}
Au lieu de l'impression de tout quand la boucle est terminée, je voudrais le voir impression de chaque résultat par le temps.
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple pour éliminer nginx tampon est en émettant un en-tête:
Ceci élimine à la fois
proxy_buffering
et (si vous avez nginx >= 1.5.6),fastcgi_buffering
. Le fastcgi bits est essentiel si vous utilisez php-fpm. L'en-tête est également beaucoup plus pratique de le faire sur une base comme-nécessaire.Docs sur X-Accel-mise en mémoire Tampon
Docs sur fastcgi_buffering
set_time_limit(0)
, envoyer uniquement cet en-tête, pas de type de contenu d'en-tête, suivi par mon echo avais HTML (ou require_once()), suivi parob_flush()
, puisflush()
. J'ai pu ensuite faire mon travail de longue haleine (un e-commerce de la tâche), puis sortie dans le reste de l'HTML, une fois terminé pour fermer la page, ce qui ajoute un peu de Javascript qui redirige la page immédiatement à leur ordre de réception.SOLUTION FINALE
C'est ce que j'ai trouvé:
Flush ne fonctionnerait pas sous Apache mod_gzip ou Nginx est gzip, parce que, logiquement, il est gzipping le contenu, et pour ce faire il doit le contenu du tampon de gzip il. Toute sorte de serveur web gzipping aurait une incidence sur de cette. En bref, sur le côté serveur, il faut désactiver gzip et la diminution de la fastcgi taille de la mémoire tampon. Donc:
En php.ini:
. output_buffering = Off
. zlib.output_compression = Off
De nginx.conf:
. gzip off;
. proxy_buffering off;
Ont aussi ces lignes à la main, spécialement si vous n'avez pas accès au php.ini:
@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();
set_time_limit(0);
Dernier, si vous l'avez, coment le code ci-dessous:
ob_start('ob_gzhandler');
ob_flush();
De test PHP code:
Connexes:
php chasse ne fonctionne pas
Comment éliminer de sortie après chaque `echo` appel?
PHP rinçage de sortie dès que vous appelez echo
str_repeat(' ', 4096)."\n";
pour être sûr que le contenu est envoyé.Solution facile nginx sur le serveur:
http
,server
oulocation
contextes. De sorte que vous pouvez être très sélectif lorsqu'il s'applique.Je ne voulais pas avoir à éteindre gzip pour l'ensemble du serveur ou un répertoire entier, juste pour quelques scripts, dans quelques cas particuliers.
Tous vous avez besoin est cela avant tout est écho ed:
Alors faire la chasse comme d'habitude:
Nginx semble, pour reprendre le codage ayant été désactivé et n'est pas gzip.
header('X-Accel-Buffering: no');
était nécessaire trop.header('Content-Encoding: none;');
a fonctionné pour moi. Pas besoin deob_end_flush()
ouflush()
, assurez-vous que la sortie est assez grand en utilisantecho str_repeat(' ', 1024*64);
Vous devez rincer le php de la mémoire tampon du navigateur
Voir: http://php.net/manual/en/function.flush.php
if(ob_get_level() > 0) ob_flush();
ob_get_level
sera de retour 0, il n'y a pas besoin de faire @-hacks.while (ob_get_level() > 0) ob_end_clean()
Vous pouvez accomplir cela en vidant la mémoire tampon de sortie dans le milieu de la boucle.
Exemple:
Noter que votre php.ini paramètres peuvent influer sur si cela va fonctionner ou pas, si vous avez de compression zlib allumé
J'ai trouvé que vous pouvez définir:
dans votre script php pour désactiver nginx gzipping sans avoir à modifier la
nginx.conf
J'ai eu un gzip problème venant de mon php-fpm moteur.
ce code est le seul à travailler pour moi :
C'est ma fonction de test : il vérifie max_execution_time :
myEchoFlush_init()
est bien passé, sauf que j'avais supprimer l'en-tête de il.