6
votes

JavaScript obtenir des progrès de php-script

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?


2 commentaires

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.


6 Réponses :


2
votes

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.


0 commentaires

2
votes
  1. Ajax Call Script PHP et retourne aux informations de retour que le script est exécuté.
  2. script principal crée verrou.file.
  3. Script appelé de cron vérifie si serrure.file existe et exécutez le bon script.
  4. Le script correct enregistre la progression actuelle dans Progress.txt.
  5. Ajax lit progressif.txt et lorsque des progrès sont 100%, des informations de retour indiquent que le traitement de script est terminé.

    Edité: Merci à Justin de faire de la manifestation du problème du délai d'attente;)


4 commentaires

Même si vous FORK () 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 ") 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.)



1
votes

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)

Il y a beaucoup de façons d'accomplir ceci:

  • nœud.js
  • une requête Ajax toutes les x secondes
  • Une page de rechargement de la page Meta / JavaScript
  • un iframe qui recharge régulièrement avec le statut dedans.

    bonne chance!


0 commentaires

2
votes

Vous ne devez jamais avoir un processus à long terme étant entièrement exécuté dans une session HTTP.

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.

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.

Voir: traiter avec de longues opérations côté serveur utilisant Ajax?


0 commentaires

0
votes

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 Cet article ). Je pense que c'est un moyen beaucoup plus agréable que d'écrire dans un fichier et de vérifier le contenu de cela.


0 commentaires

0
votes

sur votre processus.php : xxx

sur votre progres.php : xxx

Maintenant de votre côté client, apportez simplement une demande à votre Progress.php , recevez le numéro et donnez-le à votre barre de progression ...

DIDN Ne vérifiez que par moi-même, mais espère que cela fonctionne! :)


0 commentaires