Foros del Web » Programando para Internet » PHP »

Trabajar peticiones en background

Estas en el tema de Trabajar peticiones en background en el foro de PHP en Foros del Web. Buenas, No os ha pasado que tenéis un site y cuando algun proceso del site tiene que enviar un correo al usuario este se queda ...
  #1 (permalink)  
Antiguo 16/07/2013, 05:12
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Trabajar peticiones en background

Buenas,

No os ha pasado que tenéis un site y cuando algun proceso del site tiene que enviar un correo al usuario este se queda pensando unos segundos (tiempo en el que se conecta al servidor de correo y envia el mensaje), durante ese tiempo que igual puede ser entre 2 o 10 seg. tu muestras el típico preloader haciendo ver al usuario que estás procesando su solicitud.

Me gustaría saber si es posible evitar esa sensación, mostrar al usuario el mensaje de que se ha procesado su petición, y que automáticamente se creara otro hilo en background que se encargue de enviar el correo, sin que el usuario note ninguna demora o tenga que esperar a que el correo se haya enviado para ver la siguiente pantalla del site.

Existe alguna forma de hacer este proceso trasparente para el usuario?
Encolar tareas de php? crear nuevos hilos de ejecución?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 16/07/2013, 07:24
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Trabajar peticiones en background

Cita:
Iniciado por neodani Ver Mensaje
Buenas,

No os ha pasado que tenéis un site y cuando algun proceso del site tiene que enviar un correo al usuario este se queda pensando unos segundos (tiempo en el que se conecta al servidor de correo y envia el mensaje), durante ese tiempo que igual puede ser entre 2 o 10 seg. tu muestras el típico preloader haciendo ver al usuario que estás procesando su solicitud.

Me gustaría saber si es posible evitar esa sensación, mostrar al usuario el mensaje de que se ha procesado su petición, y que automáticamente se creara otro hilo en background que se encargue de enviar el correo, sin que el usuario note ninguna demora o tenga que esperar a que el correo se haya enviado para ver la siguiente pantalla del site.

Existe alguna forma de hacer este proceso trasparente para el usuario?
Encolar tareas de php? crear nuevos hilos de ejecución?

Muchas gracias de antemano!
lo que describes ocurre porque trabajas de manera sincrónica, lo que pretendes se consigue trabajando de manera asincrónica = AJAX. necesitas la técnica AJAX.

saludos :)
  #3 (permalink)  
Antiguo 16/07/2013, 07:35
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Trabajar peticiones en background

Tu podrias agendar una "tarea programada" (cronoJob) cada 1 o 2 min que ejecute un script de envio de correos y cuando el usuario le da a "enviar" carga el PHP que "encola" en la DB el envio de ese correo o correos que luego el script ejecutado cada 1 o 2 min puede cojer.

Pros : SI tienes 2 o mas "hilos" corriendo en paralelo... uno o varios de ellos enviando correos.

Cons: no podrias avisarle al usuario cuando el correo se envio o si fallo hasta que no recargue la pagina.

Por eso... la solucion es AJAX como te dicen bien arriba
__________________
Salu2!
  #4 (permalink)  
Antiguo 16/07/2013, 08:18
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Trabajar peticiones en background

Gracias por vuestras respuestas, la cosa es que ya utilizo Ajax...
Cuando el usuario invita a un amigo se lanza esta petición Ajax que envía los datos del formulario al script que se encarga de validar la solicitud y de enviar el correspondiente mail al usuario, tipo tienes un nuevo amigo, etc.

El problema que veo es que hasta que no envía el correo no hace el success la petición y por tanto no muestra los mensajes siguientes al usuario que acaba de realizar la acción.

Hasta que no termina de procesar el script invite_friend.php (y por tanto enviar el correo) no muestra la respuesta al usuario.

¿Se os ocurre alguna forma de mejorar eso? porque con solo con Ajax sigo sin ver la solución.

Código Javascript:
Ver original
  1. $.ajax({
  2.     url: '/ajax/invite_friend.php',
  3.     data: datos_formulario,
  4.     type: 'POST',
  5.     dataType: 'json',          
  6.     success: function(datos){
  7.         $('.blockSubmit_formAmigos').unblock();
  8.         $("#amigo").attr('readonly', false);
  9.         $("#amigo").attr('value', '');
  10.        
  11.         if (datos.error_code==0){ // No son amigos, se envia la petición
  12.             $('#respuesta').html(datos.mensaje);
  13.             $('.invitacion_amigo_ok p').html(datos.mensaje);                       
  14.             setTimeout (function (){ $(".invitacion_amigo_ok").fadeIn (800);}, 500);
  15.             setTimeout (function (){ $(".invitacion_amigo_ok").fadeOut (800)}, 4000);
  16.             setTimeout (function (){ $(".blockSubmit_formAmigos button").fadeIn (800);}, 5000);
  17.             peticionAmigos('invitaciones_enviadas');       
  18.     }
  19. });

Muchas gracias de antemano!
  #5 (permalink)  
Antiguo 03/08/2013, 16:31
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Trabajar peticiones en background

Buenas noches,

He estado investigando durante este tiempo y he encontré esta librería que tiene buena pinta, qué os parece?

http://bosqueviejo.net/2011/12/01/dj...ound-para-php/

https://github.com/tobi/delayed_job

Conocéis alguna otra similar?

Muchas gracias

Etiquetas: background, peticiones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:22.