Traitement asynchrone ou les files d'attente en PHP (CakePHP)
Je suis en construction d'un site web dans CakePHP qui traite les fichiers téléchargés bien que XML-RPC de l'API et si une interface web. Les fichiers doivent être analysés par ClamAV, les vignettes doivent être générés, et cetera. Toutes les ressources d'un travail intensif qui prend un certain temps pour que l'utilisateur ne devrait pas avoir à attendre. Donc, je suis à la recherche dans le traitement asynchrone avec PHP en général et CakePHP en particulier.
Je suis tombé sur le Multitâche plugin pour CakePHP qui s'annonce prometteur. Je suis également venu à travers les différents messages de la file d'attente implémentations comme dropr et beanstalkd. Bien sûr, j'aurai aussi besoin d'une sorte de processus d'arrière-plan, probablement mis en œuvre à l'aide d'un Gâteau à la Coquille d'une certaine sorte. J'ai vu effectuer plusieurs tâches à l'aide de PHP_Fork à mettre en œuvre une multithread PHP démon.
J'ai besoin de quelques conseils sur la façon de s'adapter à toutes ces pièces ensemble de la meilleure façon.
- Est-ce une bonne idée d'avoir une longue démon écrit en PHP? Que dois-je faire attention?
- Quel est l'avantage de message externe de la file d'attente des implémentations? Le Multitâche plugin n'utilise pas un message externe de la file d'attente. Il roule, il est propre à l'aide d'une table MySQL pour stocker les tâches.
- Ce message de la file d'attente dois-je utiliser? dropr? beanstalkd? Quelque chose d'autre?
- Comment dois-je mettre en œuvre le backend processeur? Est un fork de PHP démon une bonne idée ou juste des ennuis?
Mon plan actuel est d'utiliser le Multitâche plugin ou de le modifier pour utiliser beanstald place de sa propre table MySQL mise en œuvre. Emplois dans la file d'attente peut simplement consister en un nom de tâche et un tableau de paramètres. Le PHP démon de regarder pour les travaux entrants et de les transmettre à l'un de ses threads. Le serait-il suffit d'exécuter l'CakePHP Tâche avec les paramètres donnés.
Opinions, des conseils, des commentaires, des pièges ou des flammes sur cette?
- Il y a aussi quelques informations sur Asynch. le traitement de @ file d'attente différée-exécution-en-cakephp/.
Vous devez vous connecter pour publier un commentaire.
J'ai eu d'excellents résultats avec BeanstalkD et un back-end en PHP pour récupérer les emplois et d'agir sur eux. J'ai enveloppé le cadre d'un emploi d'exécution dans un bash script pour continuer à fonctionner même s'il est sorti (sauf si je fais un"
exit(UNIQNUM);
', lorsque le script vérifie et vous réellement quitter). De cette façon, le redémarrage de script PHP efface toute la mémoire qui peut avoir été utilisé, et vous pouvez commencer à zéro tous les 25/50/100 de tâches qu'il exécute.Quelques-uns des avantages de l'utilisation, c'est que vous pouvez fixer des priorités et des délais dans un BeanstalkD emploi "exécuter ce à une priorité plus faible, mais ne pas démarrer pendant 10 secondes". J'ai également mis en file d'attente d'un nombre d'emplois à temps (exécuter ce maintenant, en 5 secondes et de nouveau après 30 secondes).
Avec la configuration du réseau (et en cours d'exécution sur une adresse IP accessible pour le reste de votre réseau), vous pouvez également exécuter une beanstalkd démon sur un serveur, et l'ont interrogé à partir d'un certain nombre d'autres machines, donc si il y a un grand nombre de tâches, le travail peut être réparti entre les serveurs. Si un ensemble de tâches doit être exécuté sur une machine en particulier, j'ai créé un "tube" qui est celle de la machine hôte, qui doit être unique au sein de notre cluster, si ce n'est à l'échelle mondiale (utile pour les uploads de fichier). J'ai trouvé cela a fonctionné parfaitement pour le redimensionnement d'image, souvent revenir le fini des images plus petites pour le système de fichiers avant la page web elle-même qui ferait référence à référer à l'URL il serait d'arriver à.
En fait, je suis sur le point de commencer à écrire une série d'articles sur ce sujet pour mon blog (y compris certaines techniques pour le code que j'ai déjà poussé plusieurs millions de demandes en direct par) - Mon URL est liée à partir de mon profil de l'utilisateur ici, sur Stackoverflow.
(J'ai écrit un série d'articles sur le sujet de Beanstalkd et la file d'attente de travaux)
Si vous utilisez un message de la file d'attente comme beanstalkd, vous pouvez démarrer autant de processus que vous le souhaitez (même sur le même serveur). Chaque processus de travail va en prendre un travail à partir de la file d'attente et de la traiter. Vous pouvez ajouter plus de travailleurs et plus de serveurs si vous avez besoin de plus de capacité.
La bonne chose à propos de l'utilisation d'un seul thread travailleur, c'est que vous n'avez pas à traiter avec la synchronisation à l'intérieur d'un processus. Le jobqueue sera assurez-vous qu'aucun travail seront traitées deux fois.
Pourrait également être utile de vérifier Amazon SQS pour être utilisé en conjonction avec EC2?
Ce sujet Gearman? Un bon soutien et d'intégration en php et fonctionnalités comme la tâche parallèle, mise à l'échelle, de la surveillance et ainsi de suite...