Cron o Apache frenan la ejecucion de mi script php ?

Iniciado por Diabliyo, 15 Abril 2011, 17:20 PM

0 Miembros y 1 Visitante están viendo este tema.

Diabliyo

Que tal.

Tengo un servidor dedicado el cual se encarga de enviar a eso de las 3:00 a.m. (madrugada) un aproximado de 2,500 reportes via correo electronico a los trabajadores de varias plantas (empresas), estos reportes se envian a dichas horas para cuando estos lleguen en la ma~ana, tengan los datos actualizados del proceso que se finalizo el dia anterior.

Al principio se empezo enviando una taza de 500 reportes y todo funcionaba perfectamente, la taza se fue aumentando hasta llegar a 2,500 envios y es cuando empezo el problema :(, empece a recivir quejas de que no llegaba el reporte asi que empeze a investigar y les cuento:

El servidor dedicado diariamente ejecuta un script PHP mediante cron, y noto que ahora ya no se se ejecuta completamente, vaya, verifique si el problema era el código (verifique el LOG de apache) y no se muestra ningún error de sintaxis en el script, después mire si por alguna razón los tiempos de ejecución del script estaban mal configurados en el php.ini, teniendo estos valores:

Código (php) [Seleccionar]
// phpinfo()
max_execution_time = 86400  // para 24 horas
max_file_uploads = 20
max_input_time = 86400 // para 24 horas
memory_limit = 128M
post_max_size = 1024M // 1GB
upload_max_filesize = 2G


Y la forma de como ejecuto el scrtip en cron es asi:

curl -u user:password http://localhost/script.php?op=start

Cual creen que sea el problema ?...

el-brujo

tendrás que hacerlo por partes mejor para evitar problemas.

Aunque el max_execution_time es muy alto, quizás el apache mata el proceso si está tanto rato, no lo sé.

Los envíos masivos de e-mail son un problema...

Checkea que los e-mails estén en el la cola de salida de tu servidor de correo, es decir que el script del php acabe correctamente. ¿Qué servidor de correo usas?

El cron yo lo ejecutaría sin pasar por apache, sin usar wget, ni curl, directamente usando el binario de php que es mucho más rápido y consume menos recursos:

/usr/local/bin/php /path/script.php?op=start

Diabliyo

Cita de: el-brujo en 15 Abril 2011, 17:42 PM
tendrás que hacerlo por partes mejor para evitar problemas.

Aunque el max_execution_time es muy alto, quizás el apache mata el proceso si está tanto rato, no lo sé.

Los envíos masivos de e-mail son un problema...

Checkea que los e-mails estén en el la cola de salida de tu servidor de correo, es decir que el script del php acabe correctamente. ¿Qué servidor de correo usas?

El cron yo lo ejecutaría sin pasar por apache, sin usar wget, ni curl, directamente usando el binario de php que es mucho más rápido y consume menos recursos:

/usr/local/bin/php /path/script.php?op=start

Y como paso el user y password ??... ya que cuando ejecuto el script le puse user y pass por HTTP, por eso ejecuto asi:

curl -u user:pass http://localhost/script.php?op=start

Diabliyo

Utilizo GNU/Linux con postfix.
Y para el proceso de envío de mails lo hago desde un script en PHP en donde contabilizo el numero de mails que salen y estos datos los corroboro con la cantidad total que deben salir, y pues desde que creció la necesidad de enviar mas correos empecé a ver que no salían la cantidad total (2,500), que solo salen 1,500 o hasta 2,000, pero por alguna razón da error en la ejecución de mail() (en php) y desde ese momento, mi script finaliza dejando un log del numero de mails que se enviaron y a quienes fueron.

Sera que necesito poner un sleep() entre cada envío ?
Existe la posibilidad de que si envío a la cola de postfix una cantidad X (seria un volumen alto), en el segundo intento de meterle mas cosas a la cola, este de error ?

madpitbull_99

Creo que el problema está en el script PHP.

Has configurado el timeout también en el script PHP? Poniendo al principio del script:
set_time_limit(0);

Otra opción es enviar los emails de 1000 en 1000, así tienes más posibilidades de que funcione.

Para envió masivo de correos yo utilizaría PHP-Mailer. Échale un vistazo.

El problema puede estar en que PostFix no da abasto a tantos emails de golpe.

En la página oficial de PostFix hay un documento donde explican como optimizar algunas características:
Postfix Performance Tuning



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

Diabliyo

Cita de: madpitbull_99 en 29 Abril 2011, 14:05 PM
Creo que el problema está en el script PHP.

Has configurado el timeout también en el script PHP? Poniendo al principio del script:
set_time_limit(0);

No, fijate que ni siquiera menciono set_time_limit dentro del script PHP, ya que (creo yo) si especifico que el tiempo de ejecucion sera de 4 horas (en segundos claro) dentro del php.ini, no veo conveniente poner nuevamente el valor dentro de set_time_limit.... Pero no lo se... debo especificar el set_time_limit en el valor que uso ???.... Debo ponerlo en 0 ??...

Cita de: madpitbull_99 en 29 Abril 2011, 14:05 PMOtra opción es enviar los emails de 1000 en 1000, así tienes más posibilidades de que funcione.

No puedo enviar de 1,000 en 1,000... Ya que el sistema simplemente hace un query a la BDD de Usuarios, y segun el numero de usuarios dados de alta para envio de Reporte Diario, es el numero de mails que sacare por dia... Claro, podria implementar que solo salieran mil y despues finalizara el envio... El problema seria primero calcular el tiempo que tarda postfix en enviar los 1,000 mails, para que asi (mediante cron) volver a re-configurar el Cron para que este vuelva a reiniciarse....

El problema de enviar de 1,000 en 1,000, es que en realidad NO TODOS los usuarios de mi BDD estan recibiendo el reporte diario, debido a que es un servicio que se esta liberando paulatinamente, de modo que hay mas de 50,000 trabajadores :S... Imaginate cuantas lineas de cron tendria que programar, pero primero ver el lapso de tardanza de postfix en envio de 1,000 y hacer calculos :S.... Seria mas dificil, y ademas no se contemplarian nuevos trabajadores y la baja de trabajadores :S.

Cita de: madpitbull_99 en 29 Abril 2011, 14:05 PMPara envió masivo de correos yo utilizaría PHP-Mailer. Échale un vistazo.

PHP-Mailer tengo entendido brinda una libreria para el envio de mails... Pero en si mi Framework tiene la misma capacidad de PHP-Mailer y ademas otras cuestiones extras, como la incrustacion de imagenes dentro de un mail (sin que aparezcan adjuntados), la opcion de variar si se adjunta o se incrusta un dato, segun lo pida yo mediante argumentos en la funcion.

Gracias por el dato, pero prefiero quedarme con mi Framework, ya que lo conozco de pie a cabeza y cualquier fallo se donde arreglar :D.

Cita de: madpitbull_99 en 29 Abril 2011, 14:05 PMEl problema puede estar en que PostFix no da abasto a tantos emails de golpe.

En la página oficial de PostFix hay un documento donde explican como optimizar algunas características:
Postfix Performance Tuning

Creo que si podria ser postfix, dejame implemento algunas cositas que dice el tutorial (que no tenia) y hago una prueba de envio ahorita !

Saludos !