10
votes

ECHO messages pendant que le script php exécute toujours

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.


2 commentaires

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.


9 Réponses :


6
votes

Utilisez Flush code> pour envoyer immédiatement la sortie au navigateur, en rinçant Le tampon de sortie.

echo "foo";
flush();
echo "bar";
flush();


1 commentaires

Flush n'est pas garanti de travailler sur tous les navigateurs / plateformes / configurations



7
votes

Vous pouvez créer une table de mise en scène.

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).

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.


2 commentaires

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)?



0
votes

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.

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.

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 . 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.


2 commentaires

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.



0
votes

semble être comme si vous avez tampon de sortie activé.

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.


0 commentaires

3
votes

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.

du Flush Documentation Vous obtiendrez:

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.

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.


1 commentaires

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



0
votes

Vous pouvez utiliser la fonction Flush () pour envoyer tout le contenu du tampon au client. http://php.net/manu/fr/function.flush.php


0 commentaires

12
votes

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);
}
?>


0 commentaires

0
votes

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);
}


0 commentaires

1
votes

J'utilise le @OB_FLUSH () après chaque echo . Dans cet exemple php_eol crée une nouvelle ligne après $ string xxx


0 commentaires