Modèles pour PHP multi processus?
Modèle de conception qui existent pour la réalisation de l'exécution de certains processus PHP et la collecte des résultats dans un processus PHP?
De fond:
J'ai beaucoup de grands arbres (> 10000 entrées) en PHP et exécuter récursive des contrôles sur elle. Je veux réduire le temps écoulé temps d'exécution.
... écrire un C extension?
OriginalL'auteur powtac | 2010-01-20
Vous devez vous connecter pour publier un commentaire.
Si votre objectif est un minimum de temps, la solution est simple à décrire, mais pas si simple à mettre en œuvre.
Vous avez besoin de trouver un motif pour diviser le travail (Vous n'avez pas à fournir beaucoup d'informations dans le doute à cet égard).
Ensuite utiliser un processus maître que fourches enfants pour faire le travail. En règle générale, le nombre total de processus que vous utilisez doit être entre
n
et2n
, oùn
est le nombre de cœurs de la machine.En supposant que ces données seront stockées dans des fichiers vous pouvez envisager d'utiliser non bloquant IO, pour maximiser le débit. Ne pas le faire va faire la plupart de votre processus de passer du temps d'attente pour le disque. PHP a
stream_select()
qui pourraient vous aider. Notez que l'utilisation il n'est pas trivial.Si vous décidez de ne pas utiliser
select
- l'augmentation du nombre de processus pourrait aider.En ce qui concerne
pcntl
fonctions: j'ai écrit un démon avec eux (celui avec la fourche, la modification de l'id de session, l'utilisateur en cours d'exécution, etc...) et c'est l'un des plus fiables morceau de logiciel que j'ai écrit. Parce qu'il engendre des travailleurs pour chaque tâche, même si il y a un bug dans l'une de ces tâches, il n'a pas d'incidence sur les autres.Pour voir stream_select dans l'action de la caisse le code dans le drupal.org/project/httprl. J'ai l'intention de pousser cette bibliothèque pour github une fois que je reçois plus poli; quelque chose qui peut être exécuté en dehors de drupal. Vous pouvez l'utiliser comme un exemple de la façon complexe stream_select pouvez obtenir.
OriginalL'auteur Emil Ivanov
À partir de votre script php, vous pouvez lancer un autre script (à l'aide de
exec
) pour le traitement. Enregistrer les mises à jour de statut dans un fichier texte, qui pourrait ensuite être lu régulièrement par le parent fil.Remarque: pour éviter de php en attente pour le
exec
'd script pour terminer, de rediriger la sortie vers un fichier:Sinon, vous pouvez fourche d'un script à l'aide de la PCNTL fonctions. Il utilise un script php, qui lors de la fourche peut détecter si c'est le parent ou l'enfant et de fonctionner en conséquence. Il y a des fonctions pour envoyer/recevoir des signaux de communication entre le parent/enfant, ou vous demandez à l'enfant de se connecter à un fichier et le parent de lire à partir de ce fichier.
De la pcntl_fork la page de manuel de
Désolé, pas vraiment d'expérience de la pratique. La recherche par le biais de la SORTE, je suis surpris de voir comment beaucoup de gens catégoriquement dire il n'y a pas moyen de faire un fork de php
J'ai écrit un Perl emballage avant d'utiliser la FOURCHE (en Perl) pour exécuter un script PHP avec d'excellents résultats.
puis-je demander ce que vous cherchez n'est pas dans les réponses données?
Il n'y a pas beaucoup de contrôle sur les processus, et j'ai besoin d'une solution générique. pour les différents arbres et des objets et des parties du code. Le Message de la File d'attente de la solution s'adapte le plus.
OriginalL'auteur Adam Hopkinson
Ce pourrait être un bon moment pour envisager d'utiliser un message de la file d'attente, même si vous l'exécutez sur une seule machine.
Pas sûr de ce que vous avez besoin de l'étendue partagée et l'espace de noms, mais un message de la file d'attente, couplé avec de la mémoire partagée (par exemple, memcache) pourrait être une possibilité.
Le message que la solution qui correspond le mieux à cette grande échelle de l'application. Avec memcache nous pouvons le contrôle très bien quoi faire quand. Parce que tout est très OO il n'y a pas un gros problème avec l'espace de noms. J'ai juste à remplir les objets à partir de et dans memcache.
Avec memcache, je peux partager la charge aussi sur des machines différentes. Cela signifie que je peux l'échelle très bien dans l'avenir.
Aussi memcache stocke les objets PHP plaine, il n'y a pas besoin de serialize et unserialize.
OriginalL'auteur squeeks
Vous pourriez utiliser une structure de données efficace, comme un arbre. Je l'ai utilisé une fois en Java, mais pas en PHP. Vous pouvez essayer ce script: http://www.phpclasses.org/browse/file/708.html, c'est une implémentation de l'arbre.
Si elle n'est pas assez, vous pouvez utiliser Hadoop pour mettre en œuvre un plan/modèle de réduction, Michael l'a dit. Je ne voudrais pas de fourche processus PHP, il ne semble pas aider pour performace.
Personnellement, je voudrais utiliser PHP en tant que client et de tout mettre dans Hadoop. Ce tutoriel peut vous aider: http://www.lunchpauze.com/2007/10/writing-hadoop-mapreduce-program-in-php.html.
Une autre solution peut être d'utiliser une implémentation Java de Btree: http://jdbm.sourceforge.net/. JDBM est un objet de base de données à l'aide d'un Arbre+ données astructures. Ensuite, vous pouvez rechercher avec PHP en exposant les données avec un service web ou en y accédant directement avec Quercus
OriginalL'auteur rtacconi
La question semble un peu confus.
Voulez-vous dire le temps écoulé? Certainement l'utilisation de la droite de la structure des données permettra d'améliorer le débit, mais pour une donnée de la structure des données, la minmimum ordre de l'algorithme est absolu, et rien à voir avec la façon dont vous implémentez l'algorithme.
Modèles de conception sont quelque chose qui code est, non pas un modèle pour écrire des programmes, et des outils utiles pour la conception des programmes. Pour démarrer avec un modèle et faire votre code de l'ajustement, il est en lui-même un anti-modèle.
Personne ne peut répondre à cette question withuot savoir beaucoup plus au sujet de vos données et comment sont structurés, cependant le facteur clé pour l'efficacité de la structure de données que vous utilisez pour mettre en œuvre votre arbre. Si le temps écoulé est important, alors certainement regarder à l'exécution en parallèle, mais il peut aussi être utile d'envisager d'effectuer l'opération dans un autre outil - les bases de données sont hautement optimisé pour le traitement de grands ensembles de données, cependant, noter que l'évidence de la méthode pour la description d'un arbre dans une base de données relationnelle est très inefficace quand il s'agit d'isoler des sous-arbres et parcours de l'arbre.
En réponse à Adam, ce qui suggère de bifurquer vous avez répondu:
Où avez-vous entendu? Certainement une nouvelle branche à partir d'un programme CGI ou mod_php script appelé est une mauvaise idée, mais rien de mal à le faire à partir de la ligne de commande. Faire google pour de longues processus PHP (être averti il y a beaucoup de mauvaises informations là-bas). Quel est le code que vous écrivez va varier en fonction de l'OS sous-jacent - que vous n'avez pas déclaré.
Je soupçonne que vous pourriez résoudre une grande partie de vos problèmes de performances en identifier les parties de l'arbre doivent être vérifiés et seulement de la vérification de ces pièces ET le déclenchement de l'vérifie lorsque l'arbre est mis à jour, ou au moins le marquage des nœuds comme "sale".
Que vous pourriez trouver utiles suivantes:
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
http://en.wikipedia.org/wiki/Threaded_binary_tree
C.
OriginalL'auteur symcbean
À l'aide de web ou de la CLI?
Si vous utilisez le web, vous pourriez intégrons la partie Quercus Alors vous pouvez utiliser les avantages de JAVA multithreading.
Je ne sais pas vraiment quelle est la fiabilité de Quercus est bien. Je voudrais aussi suggérer d'utiliser une sorte de file d'attente de messages et refactoring du code, de sorte qu'il n'a pas besoin de la portée.
Peut-être vous pourriez reconstruire le code d'une Carte/modèle de réduction. Ensuite, vous pouvez exécuter le code PHP dans Hadoop, Alors vous pouvez le cluster traitement par le biais d'un couple de machines.
Je ne sais pas si c'est utile, mais je suis tombé sur un autre projet, appelé Gearman. Il est également utilisé pour cluster de processus PHP. Je suppose que vous pouvez combiner cela avec un script, si Hadoop n'est pas la façon dont vous voulez aller.
J'ai testé Quercus, il n'est pas si mauvais, mais il n'est pas compatible à 100% avec le code existant. Probablement à l'aide d'un cluster Hadoop est la solution la plus rapide.
Le Map/reduce est un très bon conseil!!!
OriginalL'auteur Michiel
pthreads
Il est assez nouveau (depuis 2012) extension PHP disponibles: pthreads. Il peut être installé via PECL.
Simple mise en Œuvre dans le Code PHP: extension de
Thread
Classe. Ajouter unrun()
méthode et d'exécuter lesstart()
méthode.Sorties
OriginalL'auteur powtac