web-dev-qa-db-fra.com

Des discussions en PHP?

Je crée une application web en utilisant zend, ici je crée une interface à partir de laquelle l'utilisateur-A peut envoyer des e-mails à plus d'un utilisateur et cela fonctionne très bien mais cela ralentit le temps d'exécution à cause de quel utilisateur-A attend trop la "réponse confirmée" (qui s'affichera après l'envoi des e-mails.)

Dans Java il y a des "Threads" par lesquels nous pouvons effectuer cette tâche (envoyer des emails) et cela ne ralentit pas l'application restante.

Existe-t-il une technique en PHP/Zend comme dans Java par laquelle nous pouvons diviser nos tâches, ce qui pourrait prendre beaucoup de temps, par exemple: envoyer des e-mails.

29
PHP Ferrari

EDIT (merci @Efazati, il semble y avoir un nouveau développement dans ce sens)

http://php.net/manual/en/book.pthreads.php
Attention: (à partir de ici en bas):

pthreads était, et est encore, une expérience avec de très bons résultats. Chacune de ses limitations ou fonctionnalités peut changer à tout moment; [...]

/ÉDITER

Pas de threads en PHP!

La solution de contournement consiste à stocker les travaux dans une file d'attente (par exemple, des lignes dans un tableau avec les e-mails) et à faire un cronjob appeler votre script php à un intervalle donné ( disons 2 minutes) et sonder pour les emplois. Lorsque les travaux présents en récupèrent quelques-uns (en fonction du délai d'installation de votre php) et envoient des e-mails.

L'idée principale de différer l'exécution:

  • le script principal ajoute des travaux dans la file d'attente
  • le script cron les envoie en minuscules tranches

Gotchas:

  • assurez-vous que vous n'envoyez pas d'e-mail sans supprimer de la file d'attente (le pire des cas serait si un utilisateur récupère du spam à 2 minutes d'intervalle ...)
  • assurez-vous de ne pas supprimer un travail sans l'exécuter au préalable ...
  • gérer les e-mails rebondissants à l'aide d'un algorithme de score
41
clyfe

Vous pouvez envisager d'utiliser plusieurs processus, comme avec fork . La communication entre eux ne serait pas aussi simple qu'avec les threads (mais alors, elle ne viendra pas avec tous ses pièges non plus), mais si vous envoyez simplement des e-mails, il pourrait ne pas être nécessaire de communiquer beaucoup, si à tout.

5
Doug Kavendek

Attention à faire des fourches sur un processus Apache. Vous pouvez obtenir certains comportements auxquels vous ne vous attendez pas. Si vous cherchez à faire n'importe quel type d'exécution asynchrone, cela devrait être via une sorte de mécanisme de mise en file d'attente. Gearman en est un. Zend Server Job Queue en est un autre. J'ai du code de démonstration sur Faites-vous la queue? Introduction à la file d'attente des jobs Zend Server . Cron peut être utilisé, mais vous aurez le problème de dépendre de votre planificateur cron pour exécuter des tâches alors que l'informatique asynchrone doit souvent être exécutée immédiatement. L'utilisation d'un système de mise en file d'attente vous permet de le faire sans filetage.

3
Kevin Schroeder

Il y a une extension Threading en cours de développement basée sur PThreads qui semble prometteuse https://github.com/krakjoe/pthreads

3
JasonDavis

Il y a pcntl , qui vous permet de créer des sous-processus, mais php ne fonctionne pas très bien pour ce type d'architecture. Vous feriez probablement mieux de créer un script de longue durée (un démon) et d'en générer plusieurs.

1
troelskn

PHP n'inclut pas le threading dans le langage, il existe des méthodes qui peuvent l'émuler mais elles ne sont pas infaillibles.

Cette recherche Google montre quelques solutions de contournement potentielles

0
Neil Aitken

À partir de PHP il n'y a pas de threads dedans. Cependant pour php, vous pouvez jeter un œil à ce chemin détourné http://www.alternateinterior.com/2007/05/ multi-threading-strategies-in-php.html

0
manugupt1

Vous pouvez utiliser un système de file d'attente pour l'envoi de vos e-mails et envoyer l'e-mail à partir d'un autre système qui prend en charge les threads. PHP n'est qu'un outil et vous devez l'outil le mieux adapté au travail.

0
Elzo Valugi