2011-07-07 20 views
11

Me pregunto si hay una manera de iniciar un hilo separado en php para enviar y enviar por correo electrónico. Tengo un pequeño servicio web que toma información de una aplicación de iPad y luego inserta datos en una base de datos y luego envía un correo electrónico. El problema es que a veces el correo electrónico tarda demasiado en enviarse y la solicitud del iPad expira. ¿Hay alguna manera de que pueda enviar el correo electrónico en un hilo separado? Básicamente, quiero decirle al iPad que todo fue exitoso antes de que el correo electrónico lo envíe.Correo electrónico en un hilo separado en php

un código de ejemplo:

... Process info and insert into DB 
echo "success"; //this should be returned to the iPad right away. 

//start new thread here or possibly fork??? 
$email->send(); 

Gracias!

+0

PHP no tiene multiprocesamiento nativo, pero mira: http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications – feeela

Respuesta

5

Como se señaló, PHP no tiene capacidades de subprocesamiento múltiple, pero tiene funcionalidad de multiprocesamiento. Puede crear y llamar a un segundo PHP que el primero llamaría para procesar el correo electrónico. Este script necesitaría poder ejecutarse en la línea de comando.

exec('nohup php emailscript.php >/dev/null 2>&1 &'); 

Es muy importante tener el nohup, y todo lo demás. Lo que está haciendo es poner el proceso en segundo plano y redirigir todo el resultado. De lo contrario, PHP esperará a que termine y devuelva algo. El nohup se asegurará de que el script no muera cuando el proceso de llamada principal finaliza.

Necesita de alguna manera pasar la información de correo electrónico a la secuencia de comandos. Puede colocar la información en una base de datos y pasarle una ID de registro, pasar la información como parámetros o una cantidad de otras opciones.

1

Creo que desea ejecutar un ob_flush() para enviar los datos al cliente y permitir que su script PHP continúe ejecutándose. Tenga en cuenta que debe haber terminado con el envío de cosas al cliente, ya que no puede enviar más después del ob_flush().

Cuestiones relacionadas