L'exécution asynchrone en fonction en php
est-il possible de créer une certaine classe php qui permet d'exécuter des fonctions de façon asynchrone? Voici ce que j'ai fait jusqu'à présent:
class Worker extends Thread
{
protected $asyncFun;
protected $paramsArray;
public function run() {
$asyncFun(/*parameters go here*/)
}
public function setAsyncFunction($func, $paramsArr)
{
$this->asyncFun = $func;
$this->paramsArray = $paramsArr;
}
}
Voici comment je veux l'appeler:
$worker = new Worker();
$worker->setAsyncFunction(foo, ["a", "b"]);
$worker::start();
je voudrais lancer un nouveau script php avec exec
pouvez-vous mettre un peu de code?
mais il n'est pas dynamique de cette façon.
À partir du manuel PHP:
pouvez-vous mettre un peu de code?
exec('php script.php')
mais il n'est pas dynamique de cette façon.
À partir du manuel PHP:
Note: If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.
- Est votre définition de l'asynchrone?
OriginalL'auteur vlio20 | 2014-12-02
Vous devez vous connecter pour publier un commentaire.
Les versions récentes de pthreads soutien fermetures en tant que membres, du code très simple:
Cependant, c'est horrible, il est difficile d'imaginer une fonction qui est si affamé qu'il nécessite un thread propre.
Vous avez commencé sur le droit chemin avec l'idée que vous devez réutiliser le contexte et de créer un thread de travail, pthreads a tout cela construit dans.
Plus judicieux de code à l'aide intégrée dans les classes ressemble plus à:
Mais ce n'est toujours pas traiter avec une valeur de retour. Je vais supposer que vous voulez récupérer le résultat des appels effectués à l'aide de la
Pool
, dans ce cas, le code ressemble plus à:Comme vous pouvez le voir, un appel à
Background::getResult
entraînera dans le contexte de l'appel en attente jusqu'à ce qu'un résultat est disponible, il peut ou peut ne pas être souhaitable, mais en fait un bon exemple.OriginalL'auteur Joe Watkins
PHP est un langage synchrone. Presque tout ce que vous ferez à cause de PHP pour accrocher pendant qu'il termine, et qui comprend
exec
appels si vous voulez une réponse.Une mise en œuvre à l'aide de base de PHP éléments vont probablement vous obliger à faire quelques
exec
ou cURL appel, puis parcourir votre serveur pour la sortie plus tard dans votre script.Vous pouvez utiliser le PECL que Dagon mentionné (Gearman), mais personnellement, je pense que l'utilisation d'un gestionnaire de file d'attente comme beanstalkd est beaucoup plus facile à gérer.
Ici est le site pour beanstalkd.
Et ici est une bonne bibliothèque PHP pour beanstalkd (avec quelques exemples)
Il n'y a pas de multithreading, à un cours de PHP par défaut de l'installation, que je sache? Beanstalkd a aussi l'avantage de ne pas être tributaires de PHP et prend en charge plusieurs serveurs. Vous pourriez avoir les travailleurs qui prennent des emplois de la file d'attente dans beanstalkd qui sont écrits dans toutes les langues. Essentiellement, c'est plus rapide et plus diversifiée.
Qu'en est celui-ci: php.net/manual/en/class.thread.php
Le cadre d'une extension PECL: php.net/manual/en/pthreads.installation.php - Vous devez installer cette bibliothèque vous-même.
OK, et alors? Avez-vous des questions?
OriginalL'auteur Scopey