Question

Tout d'abord,

la mise en place:

J'ai un script qui exécute plusieurs tâches après qu'un utilisateur clique sur le bouton « télécharger » qui envoie le script les données qu'il a besoin. Maintenant, cette partie est actuellement obligatoire, nous n'avons pas l'option à ce stade de découper le téléchargement et tirer une source en direct.

Cette section intentionnellement de longue haleine pour faire un point. Passer à l'avance si vous détestez que

En ce moment, les données sont analysées à partir d'une source vraiment géniale utilisant l'expression rationnelle, puis décomposé en un tableau. Il vérifie ensuite la DB pour toutes les données déjà présentes dans la plage de dates de données téléchargées. Si les plages de dates données ne sont pas déjà dans la base de données, il insère les données et les sorties succès à l'utilisateur (il y a aussi des contrôles de sécurité, la validation des sources de données et validation de téléchargement de base) ... Si les données existent, le script obtient alors les données déjà présentes dans la base de données, trouve les différences entre les deux ensembles, supprime les anciennes données qui ne correspond pas, ajoute les nouvelles données, et envoie ensuite un e-mail à chaque personne concernée par ces changements (un e-mail par personne avec tous les changements pertinents dans ledit courrier électronique, ce qui est un tout autre étape). Les adresses e-mail sont tirés au moyen d'une recherche LDAP comme notre DB a leur e-mail de travail, mais le LDAP a leur e-mail personnel qui assure qu'ils obtiennent l'e-mail avant de venir le lendemain et se pris au dépourvu. Enfin, les données-Uploader est dit « Des modifications ont été apportées, des e-mails ont été envoyés. » ce qui est vraiment tout ce qu'ils se soucient.

Maintenant, j'ajouterons peut-être une API Google Agenda publie les données (quand il y a des données horaires) Google Calendrier de l'utilisateur. Je le faire via leur calendrier de travail, mais je pensais que je rentrais à mes pieds humides avec l'API de Google avant de traiter la mise en place d'un système de WebDav pour Exchange.

</backstory>

La question pratique

À ce stade, l'intégration pré-Google, le script prend au plus une seconde et demi à courir. Il est assez impressionnant, du moins je le pense (le serveur, pas mon codage). Mais le bit Google, dans les tests, est sloooow. Nous pouvons sans doute corriger cela, mais il soulève la grande question ...

Quelle est la meilleure façon de décharger une partie du travail après que l'utilisateur a obtenu confirmation que la DB a été mis à jour? Ceci est la partie qu'il est le plus concerné par et la partie la plus critique. notifications par courrier électronique et Google Calendar Updates ne sont là que pour le bénéfice des personnes touchées par le téléchargement, et s'il y a un problème avec ces notifications, il va en entendre parler (et je vais en entendre parler) quel que soit le script dit le premier.

est-il un moyen, par exemple, pour exécuter une tâche cron qui est déclenchée par la dernière exécution d'un script? PHP peut créer cronjobs avec la capacité de exec()? Y at-il une certaine façon normalisée de gérer les travaux post-exécution qui doit se faire?

Tous les conseils sur ce qui est vraiment apprécié. Je me sens comme les scripts ness ballonnement reflète mon stade de développement et la nécessité pour moi de savoir enfin comment faire de division du travail dans les applications Web.

Mais je reçois aussi inquiet que cela ne se fait pas, comme le besoin de l'utilisateur de savoir quand toutes les tâches sont terminées, etc. Donc, cela soulève:

La question des meilleures pratiques / plus-subjective

Au fond, est-il une idée que les barres de progression, déchargement en temps réel, et d'autres façons de garder l'utilisateur attaché au script sont --Quand combinée à l'optimisation du code, de course-- mieux, plus-préféré méthode alors simplement: « nous en avons terminé avec votre part, si vous avez besoin de nous, nous serons en informer les utilisateurs » etc etc.

Y a-t-il des choses BIG à éviter (sauf évidemment pas donner à l'utilisateur des commentaires du tout)?

Merci pour la lecture. La partie de codage est crucial, alors ne vous sentez pas obligé de couvrir la deuxième partie ou à oublier de couvrir la partie codante!

Était-ce utile?

La solution

Il y a un certain nombre de façons d'aller à ce sujet. Vous pouvez exec (), comme le dit ci-dessus, mais vous pourriez potentiellement courir dans une situation DoS s'il y a trop de clics soumettent. l'extension pcntl est sans doute mieux à la gestion des processus comme celui-ci. Consultez ce poste pour voir une discussion (il y a 3 parties).

Vous pouvez utiliser Javascript pour envoyer un deuxième message ajax qui court après le script de travail approprié. En utilisant ignore_user_abort () et envoyer un Content-Length, le navigateur peut se déconnecter tôt, mais votre processus apache continuera à fonctionner et traiter vos données. est Upside aucun potentiel de forkbomb, est-il Downside ouvrira des processus plus apache.

Une autre option est d'utiliser un cron en arrière-plan qui ressemble à une table file d'attente de processus pour les choses à faire « plus tard » - vous vous en tenez des éléments dans ce tableau à l'extrémité avant, retirez-les sur le back-end lors du traitement (voir Zend_Queue ).

Une autre est d'utiliser un cadre de travail plus distribué comme gearmand -. Qui peut traiter des articles sur d'autres machines

Tout dépend de vos capacités et besoins globaux.

Autres conseils

Une tâche cron est bon pour cela. Si tout ce que vous voulez faire quand un données utilisateur télécharge est à dire « Hey utilisateur, merci pour les données! » alors ce sera très bien.

Si vous préférez une approche plus immédiate, vous pouvez utiliser exec() pour démarrer un processus d'arrière-plan. Dans un environnement Linux, il ressemblerait à quelque chose comme ceci:

exec("php /path/to/your/worker/script.php >/dev/null &");

La partie & dit "me courir dans le backgound." La partie >/dev/null redirige la sortie d'un trou noir. En ce qui concerne toutes les erreurs de manipulation et d'informer les parties concernées -. Cela est jusqu'à la conception de votre script de travail

Pour une approche multi-plateforme plus souple, consultez cette PHP manuel de la poste

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top