Foros del Web » Programando para Internet » PHP »

Evitar timeout script php

Estas en el tema de Evitar timeout script php en el foro de PHP en Foros del Web. Hola buenas, Tengo un problema con un script php que manda correos electrónicos a X (varía) personas de una base de datos. El tema es ...
  #1 (permalink)  
Antiguo 25/02/2012, 13:36
 
Fecha de Ingreso: marzo-2009
Mensajes: 39
Antigüedad: 15 años, 1 mes
Puntos: 1
Evitar timeout script php

Hola buenas,
Tengo un problema con un script php que manda correos electrónicos a X (varía) personas de una base de datos.

El tema es que si son menos de, pongamos 25 no hay problema y se ejecuta completamente, pero si hay que enviar a más ya me sale el error Internal 500, y en el log aparece:
Código:
[warn] mod_fcgid: read data timeout in 260 seconds
[error] [client **.75.160.**] Premature end of script headers: php5.cgi
Las soluciones set_time_limit y max_execution_time no sirven en este caso.

Había pensado guardar primero los e-mails que hay que mandar en una tabla y posteriormente ir mandando a ráfagas, pero no se muy bien como hacerlo. Solo se me ocurren maneras muy liadas.

Que sugerís?

Graicas!
  #2 (permalink)  
Antiguo 25/02/2012, 13:47
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Evitar timeout script php

Si el set_time_limit no te sirven, podrías programar un cronjob para que ejecute el script continuamente, y éste deberá recordar la última dirección en que se quedó para continuar.
  #3 (permalink)  
Antiguo 25/02/2012, 14:07
 
Fecha de Ingreso: marzo-2009
Mensajes: 39
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Evitar timeout script php

Cita:
Iniciado por ocp001a Ver Mensaje
Si el set_time_limit no te sirven, podrías programar un cronjob para que ejecute el script continuamente, y éste deberá recordar la última dirección en que se quedó para continuar.

Hola,

De hecho este script es llamado desde CRON.
Entonces la idea seria mandar por ejemplo los 15 primeros (que sé seguro que da tiempo) y luego programar desde el script php un cronjob para que ejecute los 15 siguientes y así hasta que ya no queden más.

Para recordar el ultimo que se envió podría pasarlo como parámetro por url quizás?
[email protected]

Algo así verdad?

Tengo que mirar como programar el cron desde php para que los añada y lo elimine después.
  #4 (permalink)  
Antiguo 25/02/2012, 14:31
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Evitar timeout script php

Pues sí, pero parametrizar cuando son muchas direcciones no sería práctico, sería mejor que el script escriba en una tabla o en un archivo (es un dato muy pequeño) el número de registro o email en que se quedó, así en el cronjob sólo lo programas para que se ejecute cada x minutos durante las horas que requiera el envío de todos los mensajes
  #5 (permalink)  
Antiguo 26/02/2012, 12:31
 
Fecha de Ingreso: marzo-2009
Mensajes: 39
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Evitar timeout script php

Aún tengo algunas dudas sobre esto.

Supongamos que para evitar el timeout el numero maximo de e-mails a enviar es 15.
Pongamos que hay 30 e-mails pues se ejecutaría 2 veces. Que hay 60, pues 4 veces, etc.

Supongo que lo más correcto sería que el script editara la tabla del cron para añadir las entradas necesarias (dependiendo del número de e-mails totales) no?

Aunque después para eliminar dichas entradas sin alterar la otra parte de la tabla cron no se si seria peligroso.
  #6 (permalink)  
Antiguo 26/02/2012, 13:14
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Evitar timeout script php

No creo que sea necesaria tanta complicación.

Si programas el cron para que ejecute el script digamos cada 5 min durante una hora determinada, y tu script guarda en algún lugar la última dirección donde se quedó, no necesitas modificar el cron ni pasar parámetros.

Es más, puedes hacer que tu script trate tantos email como le sea posible, con la condición de que si logra mandar el email escriba el email que logró mandar, sin tener que andar calculando cuántos logró mandar. Algo así como esto:


Código PHP:
Ver original
  1. //... Instrucciones varias
  2. //... Instrucciones para crear el email
  3. if($email->send)//o la instruccion que uses para enviar el email
  4.     file_put_contents('ultimoemail.txt','$diremail')//guardas donde se quedó, ya sea el email o el id

Así, cuando ejecutes el script éste puede ver en donde se quedó, y si faltan email por enviar, enviarlos, y si no faltan terminar la ejecución, todo esto sin tener que calcular cuántos puede mandar antes de que el tiempo de ejecución expire.
  #7 (permalink)  
Antiguo 26/02/2012, 13:47
 
Fecha de Ingreso: marzo-2009
Mensajes: 39
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Evitar timeout script php

Entiendo si.

Otra opción también sería añadir una columna a la taba de la BBDD para marcar los mandados.

Gracias, ya veo por donde tirar.

Etiquetas: tabla, timeout
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:43.