2010-04-06 38 views
29

Estoy creando una aplicación web usando zend, aquí creo una interfaz desde donde el usuario A puede enviar correos electrónicos a más de un usuario & funciona de manera excelente pero ralentiza el tiempo de ejecución debido a qué usuario -Esperar demasiado para la "respuesta reconocida" (que se mostrará después de enviar los correos electrónicos)Hilos en PHP

En Java hay "hilos" por los que podemos realizar esa tarea (enviar correos electrónicos) & no ralentiza la solicitud de descanso.

¿Hay alguna técnica en PHP/Zend como en Java por la cual podemos dividir nuestras tareas, lo que podría llevar mucho tiempo, por ejemplo, el envío de correos electrónicos.

Gracias ..

+0

¿Está utilizando un 'Transport'? Ver http://framework.zend.com/manual/en/zend.mail.multiple-emails.html – karim79

+0

Aquí hay una respuesta detallada para esta pregunta: http://stackoverflow.com/questions/209774/does-php -have-threading/14201579 # 14201579 –

Respuesta

41

EDITAR (gracias @Efazati, no parece ser el nuevo desarrollo en esta dirección)

http://php.net/manual/en/book.pthreads.php
Precaución: (de here en la parte inferior):

pthreads era, y es, una experimentar con muy buenos resultados. Cualquiera de sus limitaciones o características puede cambiar en cualquier momento; [...]

/EDIT

No hay hilos en PHP!

El solución es almacenar puestos de trabajo en una cola (por ejemplo filas de una tabla con los mensajes de correo electrónico) y tienen una tarea programada llame a su script PHP en un intervalo determinado (por ejemplo 2 minutos) y la encuesta de puestos de trabajo. Cuando hay trabajos disponibles, obtenga algunos (dependiendo del tiempo de espera de instalación de su php) y envíe correos electrónicos.

La idea principal de aplazar la ejecución:

  • script principal agrega trabajos en la cola
  • script cronológico los envía en pequeñas rebanadas

Gotchas:

  • hacen seguro No envíe un correo electrónico sin eliminarlo de la cola (el peor caso sería si un usuario rescata algo de correo no deseado con un intervalo de 2 minutos) ...)
  • asegurarse de que no elimine un trabajo sin ejecutar primero ...
  • mango rebotando de correo electrónico utilizando un algoritmo de puntuación
+1

+1. Así es como funcionan la mayoría de los sistemas de listas de correo que usan PHP. – snicker

+1

Algunas personas crean libs llamadas Thread.php basadas en pcntl que afirman "emular" hilos, y una gran cantidad de [FUD] (http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt) surge de esta desafortunada denominación. ../cc downvoters – clyfe

+1

¿qué tal esto? PHP: Thread - Manual -> http://php.net/manual/en/class.thread.php – Efazati

0

PHP no incluye el roscado como parte de la lengua, hay algunos métodos que pueden emular, pero no son infalibles.

This Google search muestra algunos posibles soluciones alternativas

5

Se podía ver en el uso de múltiples procesos, como por ejemplo con fork. La comunicación entre ellos no sería tan simple como con los hilos (pero tampoco vendrá con todos sus inconvenientes), pero si solo está enviando correos electrónicos, puede que no sea necesario comunicarse mucho, si todas.

1

Hay pcntl, lo que le permite crear subprocesos, pero php no funciona muy bien para este tipo de arquitectura. Probablemente sea mejor que cree un script de larga duración (un daemon) y genere varios de ellos.

0

Es posible que desee utilizar un sistema de cola para su envío de correo electrónico y enviar el correo electrónico desde otro sistema que admita subprocesos. PHP es solo una herramienta y debe ser la herramienta que mejor se adapte para el trabajo.

3

Cuidado con hacer horquillas en un proceso de Apache. Puede obtener algunos comportamientos que no está esperando. Si está buscando realizar algún tipo de ejecución asincrónica, debe hacerlo a través de algún tipo de mecanismo de cola. Gearman es uno. Zend Server Job Queue es otro. Tengo un código de demostración en Do you queue? Introduction to the Zend Server Job Queue. Se puede usar Cron, pero tendrá el problema de depender de su programador cron para ejecutar tareas, mientras que la informática asincrónica a menudo debe ejecutarse inmediatamente. El uso de un sistema de colas le permite hacer eso sin enhebrar.