J'ai un script PHP qui utilise CURL et prend environ 10-15 minutes pour exécuter. Ce qu'il fait, il analyse environ 1000 pages à la recherche de correspondances spécifiques et dans tout le script, j'ai echo'édié des messages de diagnostic, comme "Aller à la page suivante", "a trouvé une correspondance", "Erreur de chargement de la page" ... Way ça marche maintenant (et la façon dont il est normal) est-il exécuté pour une tentative de 10 minutes et ne crache que tous mes messages personnalisés. J'aimerais pouvoir afficher ces messages comme ils se produisent, pas lorsque le script est effectué en cours d'exécution. Je pensais que quelque chose comme Ajax le ferait, mais je ne suis pas sûr de savoir comment cela fonctionnerait. Tous les conseils sont très appréciés. Merci. p>
9 Réponses :
Utilisez Flush code>
pour envoyer immédiatement la sortie au navigateur, en rinçant Le tampon de sortie.
echo "foo"; flush(); echo "bar"; flush();
Flush n'est pas garanti de travailler sur tous les navigateurs / plateformes / configurations
Vous pouvez créer une table de mise en scène. P>
Le script PHP pourrait, au lieu de faire écho au message, rangez-les dans une table de base de données (éventuellement table de mémoire pour la performance). P>
Vous pouvez ensuite interroger périodiquement un script PHP séparé à l'aide d'Ajax, qui interrogeait la table et renvoie des nouveaux messages au client. P>
D'accord. Flush ne fonctionnera pas 100% du temps. Ajax est nécessaire.
N'y a-t-il pas une solution à sens push (au lieu d'interrogation)?
Fondamentalement, votre script écrit votre sortie HTML dans un fichier journal temporaire. Utilisez ensuite Ajax pour mettre à jour périodiquement le navigateur de l'utilisateur final avec le fichier journal temporaire. JQuery fera un travail rapide de cela. P>
Ajax est la seule façon garantie de l'obtenir pour travailler sur tous les navigateurs. Voici une citation de la page Flush de PHP. P>
flush () peut ne pas être capable de remplacer Le schéma tampon de votre web serveur et il n'a aucun effet sur Columineuse côté client dans le navigateur em> strong>. Cela n'affectant pas non plus l'espace des utilisateurs de PHP Mécanisme de tampon de sortie. Ça signifie vous devrez appeler ob_flush () et rincer () pour rincer la sortie OB tampons si vous utilisez celles-ci. P> blockQuote>
Et s'il y aura 1000 utilisateurs accédant à la page en même temps avec différents paramètres? Vous devrez écrire 1000 fichiers, je ne vois pas cela comme une option.
Vous pouvez facilement créer des fichiers temporaires dans PHP. C'est fondamentalement la même chose que les 1 000 utilisateurs insérés dans une base de données MySQL. Heck, utiliser, mysql. Il suffit de stocker un journal quelque part et de l'attacher à cette session si plus d'une personne l'utilise. J'ai l'impression que c'est un script backend à utiliser par une seule personne.
semble être comme si vous avez tampon de sortie activé. p>
appeler ob_end_flush () imprimera ce qui est actuellement dans la mémoire tampon et éteignez le tampon pour le reste de l'exécution du script. P>
En fait, vous recherchez quelque chose comme Flush et OB_FLUSH , cependant, cependant, il y a beaucoup de facteurs susceptibles d'empêcher votre production d'être flush'd comme cela se produit. P>
du Flush Documentation Vous obtiendrez: P>
Plusieurs serveurs, en particulier sur Win32, vous feront toujours tamponner la sortie de votre script jusqu'à ce qu'il se termine avant de transmettre les résultats sur le navigateur. P>
Les modules de serveur pour Apache comme Mod_GZIP peuvent faire la mémoire tampon de leur propre qui provoquera une flush () pour ne pas entraîner que les données soient envoyées immédiatement au client. P> blockQuote>
Vous avez fait un bon point jusqu'à ce que le script soit fait, je travaille sur elle sur la plate-forme Win32, alors je vais le mettre à UNIX
Vous pouvez utiliser la fonction Flush () pour envoyer tout le contenu du tampon au client. http://php.net/manu/fr/function.flush.php p>
Donc, c'est un ancien poste, mais j'ai trouvé une solution pour cela. Comme je dois aussi faire la même chose, sortie lorsque le script est toujours en marche. Pas de réponse d'ici aidé. Tout d'abord, j'utilise Win32 Server (Production) et XAMPP comme local pour les tests. Cet exemple est juste une preuve de concept et peut être modifié comme vous s'il vous plaît.
<?php ob_implicit_flush(true); for($i=1; $i<=10; $i++){ echo "$i ...<br>"; for($k = 0; $k < 40000; $k++) echo ' '; sleep(1); } ?>
Vous pouvez utiliser les deux flush code> et
ob_flush code>, rappelez-vous à régler l'en-tête Type de contenu:
<?php
header( 'Content-type: text/html; charset=utf-8' );
for( $i = 0 ; $i < 10 ; $i++ ){
echo $i . '<br>';
flush();
ob_flush();
sleep(1);
}
J'utilise le @OB_FLUSH () code> après chaque
echo code>. Dans cet exemple
php_eol code> crée une nouvelle ligne après
$ string code>
Similaire à Cette question .
Un autre cas simple serait d'exécuter le script de la ligne de commande, de cette façon, vous obtiendrez votre écho en temps réel.