Je dois fournir une interaction entre JS sur la page HTML et PHP-Script.
- Utilisez Ajax.
D'accord. Mais le problème est que le script php exécutant depuis longtemps et je dois connaître l'état de ce traitement de script (par exemple 60% complet)
Que devrais-je faire? Créez 2 scripts php (client et serveur) et do Ajax-Demande à Client.php qui fera des demandes à Server.php via Sockets ou Smth?
Y a-t-il des solutions plus élégantes? P>
6 Réponses :
Et si vous aviez le script faisant le traitement, écrivez son statut dans un fichier une fois dans un certain temps. Faites un deuxième script qui lira le fichier et renvoyer le statut de l'original. P>
Edité: Merci à Justin de faire de la manifestation du problème du délai d'attente;) p>
Même si vous FORK () CODE> Dans le script principal pour le traitement en arrière-plan, votre serveur HTTP peut toujours abandonner la demande s'il est longue. Il y a des moyens autour de cela, mais la meilleure solution consiste à déplacer le processus de consommation de temps complètement en dehors du domaine de la responsabilité du serveur Web.
Bien sûr, mais le script principal au lieu de l'opération de traitement ne peut créer qu'un fichier de verrouillage, puis un autre script exécuté à partir de cron lorsque le fichier de verrouillage existe peut exécuter le processus principal. Les scripts appelés de cli habituely n'ont aucun délai :)
Vous devriez probablement mettre à jour la réponse pour inclure cela. La façon dont il est actuellement libellé ( "" Script principal écrire la progression dans Progress.txt Fichier " i>) ne précise pas que" le script principal "est exécuté par cron et à la recherche d'un signal pour commencer le traitement .
Comment peut-on mesurer l'état de progression dans cette méthode? (comme combien de pourcentage est traité par serveur, etc.)
Si vous voulez être vraiment fantaisie, écrivez la sortie du script PHP sur stdout et capturer-la via un tuyau. Cela nécessiterait d'exécuter le script PHP à l'aide de EXED () ou PROC_OPEN () (http://php.net/manual/fr/function.proc-open.php) et pipe la sortie dans un fichier (ou si vous voulez être Extra-extra fantaisie, utilisez node.js pour écouter ces données) P>
Il y a beaucoup de façons d'accomplir ceci: p>
bonne chance! p>
Vous ne devez jamais avoir un processus à long terme étant entièrement exécuté dans une session HTTP. P>
Une approche simple et commune de ce problème est la queue de message. Fondamentalement, vous avez votre file d'attente UI sur la demande dans une table de base de données, puis disposez de processus de démon (s) externe (s) la file d'attente. P>
Pour fournir des commentaires, demandez au démon de mettre à jour périodiquement la table avec le statut de la ligne qui fonctionne actuellement. Ensuite, votre code JavaScript peut effectuer des demandes Ajax à un script qui récupère l'état de cet élément de travail de la base de données et l'affiche à l'utilisateur. P>
Voir: traiter avec de longues opérations côté serveur utilisant Ajax? P>
Vous pouvez utiliser la mémoire tampon de sortie de PHP (voir Ob_Flush ) à Rincer le contenu à certains points de votre script et adaptez votre JavaScript afin qu'il utilise le contenu rincé. Je crois que le prêt-à-faire dans votre appel Ajax ne sera pas défini sur 4 sur des flushes, c'est là que vous devrez vous gérer vous-même (voir
sur votre sur votre Maintenant de votre côté client, apportez simplement une demande à votre DIDN Ne vérifiez que par moi-même, mais espère que cela fonctionne! :) p> p> processus.php code>:
progres.php code>: p>
Progress.php code>, recevez le numéro et donnez-le à votre barre de progression ... P>
Eh bien, utiliser le fichier peut aider mais ce n'est toujours pas mon rêve. Et si cela, j'ai besoin d'obtenir des informations du script PHP très souvent. Ce ne serait pas trop cher pour le système de fichiers?
La lecture d'un fichier est ridiculement facile pour les ordinateurs.