2012-04-26 1 views
9

Je suis à un point dans mon API côté serveur PHP où je fais beaucoup de requêtes MySQL et je voudrais l'accélérer en ayant des threads multi-threads travaillant sur différentes requêtes et ensuite retourner les résultats.concurrence en PHP

Mais comment créer un autre thread en PHP? Je passe autour des paramètres POST, donc un simple shell_exec() pourrait fonctionner, mais semble un peu dangereux. Options J'envisage:

1) Faire une demande cURL en utilisant les paramètres que j'ai, processus JSON de la demande, puis revenir

2) Appeler un shell_exec() avec PHP CLI et d'une certaine manière (comment pourrais-je faire ce ??) traiter la réponse en PHP

quelles sont les meilleures options ici?

+0

Habituellement, c'est fait avec la file d'attente et le travailleur, qui le surveille – zerkms

+0

Comment cela se fait-il? – lollercoaster

+0

vous avez mis en place un logiciel de gestion de file d'attente (ie rabbitmq). Ensuite, votre script ajoute une tâche à la file d'attente et un agent d'arrière-plan l'exécute – zerkms

Répondre

4

Il n'y a pas de support de threading en PHP. Vous pouvez cependant utiliser l'extension pcntl pour générer et gérer des forks, mais il serait préférable d'avoir un second regard sur vos algorithmes si vous parveniez à la conclusion que les choses devraient être faites avec le threading. Une option permettant de traiter de manière asynchrone des opérations longues serait de les stocker dans une base de données et de les prendre dans la base de données, de calculer les résultats, puis de stocker les résultats dans la base de données. Ensuite, le script face à face les chercherait dans la base de données pour voir si elles sont terminées et quel est le résultat.

+1

Comment les sites web à grande échelle sont-ils construits en PHP si c'est le cas? – lollercoaster

+1

@lollercoaster: comment la "grande échelle" est-elle liée aux threads? – zerkms

+1

il me semble que les API/sites critiques avec de nombreuses interactions de base de données auraient besoin de la concurrence – lollercoaster

3

Consultez le pcntl extension. PHP ne supporte pas du tout le vrai thread, donc vous devrez implémenter des pseudo-threads avec fork() ing. Notez que fork() dans un processus est beaucoup plus "lourd" que dans un thread.

2

PHP n'a pas implémenté de threads (et ne le sera probablement jamais) car la plupart des bibliothèques PHP ne sont PAS sécurisées pour les threads. Cette variante est pcntl qui enveloppe la fonction C fork. J'ai created a handy wrapper pour ces fonctions qui me permettent de les gérer à un niveau supérieur.

$thread1 = new Thread(function($thread) { 
    sleep(4); 
    $thread->write("Hello\n"); 
}); 

$thread2 = new Thread(function($thread) { 
    sleep(5); 
    $thread->write("World\n"); 
}); 

$thread3 = new Thread(function($thread) { 
    sleep(6); 
}); 

print $thread1->read(); // time: 0 -> 4 
print $thread2->read(); // time: 4 -> 5 
$thread3->join(); // time 5 -> 6 

// More advanced handling: 
// Thread::selectUntilJoin(array($thread1, $thread2, $thread3), function() { ... }, function() { ... }); 
+0

"ce qui signifie que les fonctions ne peuvent pas être appelées à partir de threads différents" --- ce n'est pas une définition correcte pour le code TS – zerkms