Je suis en train de construire un site Web en CakePHP qui traite les fichiers téléchargés via une API XML-RPC et via un frontal Web. Les fichiers doivent être analysés par ClamAV, les vignettes doivent être générées, etc. Autant de tâches gourmandes en ressources qui prennent un certain temps et pour lesquelles l'utilisateur ne devrait pas avoir à attendre. Je m'intéresse donc au traitement asynchrone avec PHP en général et CakePHP en particulier.
Je suis tombé sur le Plugin MultiTask pour CakePHP qui semble prometteur. Je suis également tombé sur diverses implémentations de files d'attente de messages telles que dropr et tige de haricot . Bien sûr, j'aurai également besoin d'une sorte de processus d'arrière-plan, probablement implémenté en utilisant une sorte de Cake Shell. J'ai vu MultiTask utiliser PHP_Fork pour implémenter un démon PHP multithread.
J'ai besoin de conseils sur la manière d'assembler toutes ces pièces de la meilleure façon possible.
- Est-ce une bonne idée d'avoir un démon de longue durée écrit en PHP ? À quoi dois-je faire attention ?
- Quels sont les avantages des implémentations externes de files de messages ? Le plugin MultiTask n'utilise pas de file d'attente de messages externe. Il roule le sien en utilisant une table MySQL pour stocker les tâches.
- Quelle file d'attente de messages dois-je utiliser ? dropr ? beanstalkd ? Quelque chose d'autre ?
- Comment dois-je implémenter le processeur dorsal ? Est-ce qu'un démon PHP qui bifurque est une bonne idée ou est-ce que je vais avoir des problèmes ?
Mon plan actuel est soit d'utiliser le plugin MultiTask, soit de le modifier pour utiliser beanstald au lieu de sa propre implémentation de table MySQL. Les tâches dans la file d'attente peuvent simplement consister en un nom de tâche et un tableau de paramètres. Le démon PHP surveille les tâches entrantes et les transmet à l'un de ses threads enfants. Celui-ci exécutera simplement la tâche CakePHP avec les paramètres donnés.
Un avis, un conseil, un commentaire, un problème ou une flamme à ce sujet ?