L'exécution des fonctions en parallèle
J'ai une fonction qui doit aller autour de 20K lignes à partir d'un tableau, et d'appliquer un script externe pour chaque. C'est un processus lent, que le PHP est en attente pour le script à exécuter avant de continuer avec la ligne suivante.
Afin de rendre ce processus plus rapide que je pensais sur l'exécution de la fonction dans les différentes parties, dans le même temps. Ainsi, par exemple, des lignes 0 à 2000 comme une fonction de 2001 à 4000 sur un autre, et ainsi de suite. Comment puis-je faire cela proprement? J'ai pu faire différentes tâches cron, une pour chaque fonction avec différents paramètres: myFunction(0, 2000)
, puis une autre tâche cron avec myFunction(2001, 4000)
, etc. mais ça ne semble pas trop propre. Ce qui est une bonne façon de le faire?
OriginalL'auteur luqita | 2012-03-13
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez exécuter des tâches en parallèle en PHP, je voudrais envisager d'utiliser Gearman. Une autre approche serait d'utiliser pcntl_fork(), mais je préfère le réel travailleurs quand il est basé sur les tâches.
OriginalL'auteur Björn
Le seul temps d'attente vous souffrez entre l'obtention de données et de traitement de données. Le traitement des données est en réalité complètement le blocage de toute façon (il vous suffit simplement d'attendre qu'il). Vous ne sera probablement pas obtenir des avantages, passé augmentant le nombre de processus pour le nombre de cœurs que vous avez. Fondamentalement, je pense que cela signifie que le nombre de processus est petit, de sorte que la planification de l'exécution de 2-8 processus n'a pas l'air si affreux. Si vous êtes inquiet de ne pas être en mesure de traiter des données lors de la récupération de données, vous pourriez en théorie accéder à vos données à partir de la base de données dans de petits blocs, puis répartir la charge de traitement entre quelques processus, un pour chaque core.
Je pense que j'aligne plus avec la fourche de processus enfant approche pour exécuter le traitement de threads. Il en est une brillante démonstration dans les commentaires sur le pcntl_fork doc page montrant une mise en œuvre d'un travail de classe démon
http://php.net/manual/en/function.pcntl-fork.php
OriginalL'auteur Matt Esch
vous pouvez utiliser "PTHREADS"
très facile à installer et fonctionne très bien sur windows
télécharger à partir d'ici -> http://windows.php.net/downloads/pecl/releases/pthreads/2.0.4/
Extraire le fichier zip et de
déplacer le fichier 'php_pthreads.dll" pour php\ext\ répertoire.
déplacer le fichier 'pthreadVC2.dll" pour php\ répertoire.
puis ajoutez cette ligne dans votre php.ini fichier:
enregistrer le fichier.
que vous venez de faire 🙂
maintenant permet de voir un exemple de comment l'utiliser:
pour plus d'informations sur les PTHREADS lire php docs ici:
PHP DOCS PTHREADS
si vous r à l'aide de WAMP comme moi, alors vous devriez ajouter "pthreadVC2.dll" dans
\wamp\bin\apache\ApacheX.X.X\bin
et aussi modifier le " php.ini fichier (même chemin) et ajouter la même ligne que avant
extension=php_pthreads.dll
BONNE CHANCE!
OriginalL'auteur Danny Michaeli
Ont un coup d'oeil à pcntl_fork. Cela vous permet de vous frayer processus enfant qui peut alors faire le travail distinct que vous avez besoin.
OriginalL'auteur Jim
Ne sais pas si une solution adaptée à votre situation, mais vous pouvez rediriger la sortie d'appels système d'un fichier, donc PHP ne va pas attendre jusqu'à ce que le programme est terminé. Bien que cela peut surcharger votre serveur.
http://www.php.net/manual/en/function.exec.php - Si un programme est démarré avec cette fonction, afin qu'il continue de fonctionner en arrière-plan, la sortie du programme doit être redirigée vers un fichier ou d'un autre flux de sortie. Ne pas le faire va provoquer PHP pour accrocher jusqu'à l'exécution du programme se termine.
lien mis à jour @DaveCarruthers
OriginalL'auteur Michal