2010-04-07 10 views
6

J'ai planifié un travail CRON à exécuter toutes les 4 heures pour recueillir des informations sur les comptes d'utilisateurs. Maintenant, je veux accélérer les choses et répartir le travail entre plusieurs processus et utiliser un processus pour mettre à jour la base de données MySQL avec les données extraites d'autres processus. En Java, je sais qu'il y a un pool de threads que je peux dédier quelques threads pour accomplir un peu de travail.PHP pool de threads?

Comment puis-je le faire en PHP?

Tout conseil est le bienvenu.

Remerciez

+0

Que fait le travail cron? Un script shell et/ou un script php et/ou une requête de page au serveur qui exécute un script php? – zaf

+0

Un script PHP qui utilise la bibliothèque curl pour analyser certaines données de comptes utilisateur. – embedded

Répondre

1

Comme d'autres l'ont dit, bifurquer processus est plus facile que les fils fraie avec PHP. Mais pourquoi pensez-vous qu'avoir un seul thread dédié pour écrire les résultats dans la base de données est une bonne idée? Bien que cela soit légèrement plus simple à faire avec des threads plutôt qu'avec des processus, il s'agit toujours d'un surcoût complexe qui ne semble pas ajouter de valeur à l'objectif global. En effet, il est beaucoup plus simple de démarrer plusieurs instances du script (avec un paramètre pour partitionner les données) à partir de cron plutôt que d'initier une fourche à partir du code PHP - et ne pas déranger avec un goulot d'étranglement pour l'enregistrement des données retour dans la base de données.

C.

+0

C'est une bonne option qui IMO est beaucoup mieux que les processus de forking. Avez-vous une idée de la façon de partitionner les données et combien d'instances dois-je exécuter pour ne pas surcharger le système? Je pense à 3 instances. – embedded

+0

Autant d'instances que vous le souhaitez. Si les données sont identifiées par un numéro de séquence ou un autre numéro, utilisez MOD pour obtenir tous les Nième cas, par ex. 'SELECT * FROM mytable OERE MOD (id, $ number_of_instances) = $ this_instance_id' (souvenez-vous de lancer une 0e instance) – symcbean

+0

merci je vais jeter un oeil sur l'option MOD. – embedded

6

PHP est probablement pas la langue la plus appropriée pour le multi-threading.

Vous voudrez peut-être jeter un coup d'œil à différentes solutions. Par exemple, Thrift vous permet d'avoir un frontal PHP avec un backend Java, où vous pouvez facilement implémenter le comportement désiré.

Si vous voulez continuer à le faire en PHP, vous pouvez jeter un oeil à:

http://www.php.net/pcntl

http://www.electrictoolbox.com/article/php/process-forking/

0

Chech ces postes - * http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html * http://www.electrictoolbox.com/article/php/process-forking/

Fondamentalement, vous devez partager des données entre les processus et comme je vois, vous aurez probablement besoin d'écrire dans un fichier premier. Récupérer en utilisant le processus principal (en faire un processus de type ajax-polling) et écrire en DB.

+0

que voulez-vous dire par un processus de type ajax-polling? Je pense que je vais prendre votre chemin et fourche certains processus pour faire la tâche et ajouter le résultat au fichier. Le processus principal va chercher tous les enregistrements disponibles pour le moment dans le fichier, efface le fichier et puis libère le verrou et les traitera. Je vais utiliser un verrou sur le fichier dédié pour empêcher l'accès mulpile au fichier. Que pensez-vous de ce comportement? – embedded

+0

Ce comportement est exactement ce qui me vient à l'esprit. dans votre cas, puisque c'est cron-job, il continuera à fonctionner à des intervalles spécifiques et rassemblera les données du fichier, puis écrira sur DB. Ajax-polling sera pour une approche webserver où vous utilisez javascript pour faire des requêtes ajax au lieu du travail cron. – pinaki

+0

Je pense que je vais implémenter ceci et l'utiliser quand je vois que mon exécution de travail cron prend plus de 4 heures. En termes d'hébergement Web, je dois m'assurer que la bibliothèque pcntl est activée? – embedded

0

Vous pouvez bifurquer de nouveaux processus en PHP trop: pcntl_fork()

BTW. Ce script dure plus de 4 heures? Sinon, je ne vois aucune raison de le compliquer avec la gestion des threads ou des processus. PHP et Threads (ces 2 mots) ne peuvent pas aller ensemble dans la même phrase.

+0

Cela peut être modifié dynamiquement. dépend du nombre d'utilisateurs utilisant mon service. Je vais utiliser ce mécanisme SEULEMENT lorsque l'exécution du script durera plus de 4 heures – embedded

2

PHP n'offre pas de support de thread. Vous pouvez essayer les mécanismes de forclusion pcntl ou le traitement asynchrone qui dans votre cas n'est pas utile.

Vous pouvez utiliser un mécanisme de distribution de charge de travail qui pourrait être ce que vous voulez en regardant Gearman (vous suggérons de le google).

Comme décrit par d'autres "c'est une machine à forger distribuée" qui peut offrir la distribution de charge de travail que vous recherchez afin "d'accélérer les choses".

salutations,

+0

Je vais y jeter un coup d'oeil. Les hébergeurs Web supportent-ils ce kit? – embedded

+0

C'est juste un lib que vous installez - serveur et client - vous démarrez le deamon et vous êtes prêt à accepter des demandes de traitement (fortement recommandé pour distribuer la charge de travail) - http://gearman.org/ - vérifiez également les présentations – Andreas

+0

I pense que c'est trop pour mes besoins. Je vais implémenter mon propre mécanisme. Merci – embedded

Questions connexes