Autor Tema: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado  (Leído 12699 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado Jaru

  • The Communiter-
  • *
  • Mensajes: 13252
  • some text
tengo un problema.

Estoy haciendo un codigo que genera unas tablas en un archivo de excel desde datos de mysql.
resulta que genera todo perfecto excepto un query,
es un query que devuelve como 5000 registros que debe de incluir en archivo excel, cuando se ejecuta ese query en especial, el script no termina, no da error ni despliega nada en la pantalla. Cuando omito ese query, todo lo demas despliega de forma apropiada, entonces.

porque lo que da como resultado mi script, es una descarga del archivo de excel generado, cuando no termina simplemente no descarga nada.

como puedo hacer para manejar eso de los tiempos largos de ejecucion de mi código?

estoy generando una pagina excel usando phpexcel
« Última Modificación: noviembre 29, 2010, 01:23:31 pm por naruto »
N/A

Desconectado hkadejo

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 3345
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #1 : noviembre 29, 2010, 01:26:00 pm »
Mira nosotros en el trabajo cuando generamos reportes demasiado grandes (debido a que la data es muy extensa), los dejamos corriendo en un proceso independiente en el servidor...es decir la interfaz web solo sirve para que el usuario provoque la generacion del informe...y se le dice que su reporte llegara al correo, etc, etc.

Ese proceso independiente se encarga de manejar la cantidad enorme de datos y generar el archivo.

Desconectado darkness51

  • Sv Member
  • ***
  • Mensajes: 208
    • DWD&Solutions
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #2 : noviembre 29, 2010, 01:27:46 pm »
Has visto si el script alcanza el tiempo maximo de ejecución??

Saludos.
http://www.houseofsysadmin.com
http://www.dwdandsolutions.com

Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14587
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #3 : noviembre 29, 2010, 01:29:49 pm »
tengo un problema.

Estoy haciendo un codigo que genera unas tablas en un archivo de excel desde datos de mysql.
resulta que genera todo perfecto excepto un query,
es un query que devuelve como 5000 registros que debe de incluir en archivo excel, cuando se ejecuta ese query en especial, el script no termina, no da error ni despliega nada en la pantalla. Cuando omito ese query, todo lo demas despliega de forma apropiada, entonces.

porque lo que da como resultado mi script, es una descarga del archivo de excel generado, cuando no termina simplemente no descarga nada.

como puedo hacer para manejar eso de los tiempos largos de ejecucion de mi código?

estoy generando una pagina excel usando phpexcel
no es tu código naruto, edita tu php.ini y extendele el max execution time.
Código: [Seleccionar]
max_execution_time = 120
en el servidor web lo tengo como a 360secs porq el backup se tarda un veeeeeeeeeeeeeeeergo (archivos de 1 gig)

Desconectado Jaru

  • The Communiter-
  • *
  • Mensajes: 13252
  • some text
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #4 : noviembre 29, 2010, 01:40:04 pm »
Mira nosotros en el trabajo cuando generamos reportes demasiado grandes (debido a que la data es muy extensa), los dejamos corriendo en un proceso independiente en el servidor...es decir la interfaz web solo sirve para que el usuario provoque la generacion del informe...y se le dice que su reporte llegara al correo, etc, etc.

Ese proceso independiente se encarga de manejar la cantidad enorme de datos y generar el archivo.

como se hace eso?
N/A

Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14587
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #5 : noviembre 29, 2010, 01:46:40 pm »
como se hace eso?
me da la impresion que no es php, aunque podria estar equivocado...  :huh: (mas me huele a JSP, JSP con acceso a faceless services)
mira y el max execution time ya lo editaste?
« Última Modificación: noviembre 29, 2010, 01:48:21 pm por g00mba »

Desconectado hkadejo

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 3345
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #6 : noviembre 29, 2010, 01:51:24 pm »
no es tu código naruto, edita tu php.ini y extendele el max execution time.
Código: [Seleccionar]
max_execution_time = 120

Pero esto lo unico que hace es darle mas tiempo al servidor para que termine de generar el reporte...bueno en nuestro caso que un reporte se tarde mas de 2 minutos en generarse ya es motivo para que nos pongan un "caso" de mejorar esa opcion porque "no sirve".

Pero si tus usuarios son mas tolerantes y pacientes, esta es una opcion valida. Aunque deberias de hacer pruebas de stress con muchos usuarios concurrentes para ver si tu server no se viene abajo por la demanda de recurso.

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #7 : noviembre 29, 2010, 03:21:35 pm »
tengo un problema.

Estoy haciendo un codigo que genera unas tablas en un archivo de excel desde datos de mysql.
resulta que genera todo perfecto excepto un query,
es un query que devuelve como 5000 registros que debe de incluir en archivo excel, cuando se ejecuta ese query en especial, el script no termina, no da error ni despliega nada en la pantalla. Cuando omito ese query, todo lo demas despliega de forma apropiada, entonces.

porque lo que da como resultado mi script, es una descarga del archivo de excel generado, cuando no termina simplemente no descarga nada.

como puedo hacer para manejar eso de los tiempos largos de ejecucion de mi código?

estoy generando una pagina excel usando phpexcel

ok mira naruto. Yo he realizado operaciones como las que queres en .NET,  Como te explicaba en el messenger el problema que tenes es no solo el tiempo de ejecución en el servidor, sino el timeout del navegador del cliente.

Vos podes ponerle al script de PHP que tenga una expiración de 3 días o se ejecute de manera ininterrumpida. Sin embargo el navegador generalmente viene configurado con un tiempo de espera de 900 segundos. Por lo que si tu script tarda más de 900 segundos en responder, entonces el navegador va a cancelar la conexión.

¿Que podes hacer?

Ya te respondieron arriba, te explico:

1-Existe un PHP que se encarga de correr el phpexcel, vos lo que tenes que hacer es que al final del proceso te genere un archivo de verificacion o algo. Este proceso se corre en background. Una técnica fácil (sin hacer intercomunicacion entre procesos) es que crees el archivo en TMP y cuando finalice lo copie a una carpeta de usuario.

Aquí hay un ejemplo de como podes correr procesos en background. Lo que podes hacer es un script PHP que corra en modo consola que utilice excelphp y que de la salida a un archivo aparte.

http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

2-Existe un segundo PHP que verifica que el archivo sea creado. Esta página puede ser un PHP como el siguiente:

Código: [Seleccionar]
<?php
if(!file_exists($ruta_archivo_generado))  {
// Ruta al archivo generado es el nombre de archivo que el proceso 1 va a generar
// Se supone que este archivo no existe hasta que el proceso lo genere.
?>

<html>
  <head><title>Espere por favor</title>
    <meta http-equiv="refresh" content="5" />
  </head>
  <body>
    <p>Su archivo esta siendo generado... espere por favor.</p>
  </body>
</html>
<?php
} else { // Una vez el archivo ha sido generado redireccionamos el navegador a la direccion publica del mismo
    
header("Location: $ruta_archivo generado_server");
    exit();
}
?>


Nota: También podes usar el ejemplo que dan en la página, pero tendrías que grabar el PID en la sesión o algo por el estilo para verificar luego que se este corriendo.

Algo asi te podría funcionar.
« Última Modificación: noviembre 29, 2010, 03:26:55 pm por mxgxw »


Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #8 : noviembre 29, 2010, 03:28:19 pm »
Pero esto lo unico que hace es darle mas tiempo al servidor para que termine de generar el reporte...bueno en nuestro caso que un reporte se tarde mas de 2 minutos en generarse ya es motivo para que nos pongan un "caso" de mejorar esa opcion porque "no sirve".

Pero si tus usuarios son mas tolerantes y pacientes, esta es una opcion valida. Aunque deberias de hacer pruebas de stress con muchos usuarios concurrentes para ver si tu server no se viene abajo por la demanda de recurso.

Creeme que yo tengo un proceso que envia SMS a clientes subscriptores.. y en lo que das enviar puede tardar hasta 2 o 3 min en enviar todos los request, ya que no se pueden enviar en paquete sino uno por uno.

Así que lo que se utiliza es un proceso aparte que envia los mensajes. Si se reciben nuevos mensajes en lo que estas enviando simplemente se envian a los nuevos. Todo sin generar 1000 procesos diferentes.


Desconectado hkadejo

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 3345
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #9 : noviembre 29, 2010, 03:29:15 pm »
ok mira naruto. Yo he realizado operaciones como las que queres en .NET,  Como te explicaba en el messenger el problema que tenes es no solo el tiempo de ejecución en el servidor, sino el timeout del navegador del cliente.

Vos podes ponerle al script de PHP que tenga una expiración de 3 días o se ejecute de manera ininterrumpida. Sin embargo el navegador generalmente viene configurado con un tiempo de espera de 900 segundos. Por lo que si tu script tarda más de 900 segundos en responder, entonces el navegador va a cancelar la conexión.

¿Que podes hacer?

Ya te respondieron arriba, te explico:

1-Existe un PHP que se encarga de correr el phpexcel, vos lo que tenes que hacer es que al final del proceso te genere un archivo de verificacion o algo. Este proceso se corre en background. Una técnica fácil (sin hacer intercomunicacion entre procesos) es que crees el archivo en TMP y cuando finalice lo copie a una carpeta de usuario.

2-Existe un segundo PHP que verifica que el archivo sea creado. Esta página puede ser un PHP como el siguiente:

Código: [Seleccionar]
<?php
if(!file_exists($ruta_archivo_generado))  {
// Ruta al archivo generado es el nombre de archivo que el proceso 1 va a generar
// Se supone que este archivo no existe hasta que el proceso lo genere.
?>

<html>
  <head><title>Espere por favor</title>
    <meta http-equiv="refresh" content="5" />
  </head>
  <body>
    <p>Su archivo esta siendo generado... espere por favor.</p>
  </body>
</html>
<?php
} else { // Una vez el archivo ha sido generado redireccionamos el navegador a la direccion publica del mismo
    
header("Location: $ruta_archivo generado_server");
    exit();
}
?>


Algo asi te podría funcionar.

La idea es que en procesos que requieren mucho tiempo o mucha carga...lo hagas en background y luego le notifiques al usuario cuando el proceso halla terminado. Que gestor de base de datos usas??? tal vez la base tambien te facilite la creacion del archivo a traves de algun job o trigger se me ocurre.

Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14587
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #10 : noviembre 29, 2010, 03:38:54 pm »
Creeme que yo tengo un proceso que envia SMS a clientes subscriptores.. y en lo que das enviar puede tardar hasta 2 o 3 min en enviar todos los request, ya que no se pueden enviar en paquete sino uno por uno.

Así que lo que se utiliza es un proceso aparte que envia los mensajes. Si se reciben nuevos mensajes en lo que estas enviando simplemente se envian a los nuevos. Todo sin generar 1000 procesos diferentes.
entonces lo que haces, es como usar host virtuales en apache y uno se encarga del trabajo pesado de scripts?

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #11 : noviembre 29, 2010, 03:51:20 pm »
entonces lo que haces, es como usar host virtuales en apache y uno se encarga del trabajo pesado de scripts?

Realmente lo que pasa es esto. Una contraparte de nosotros genera mensajes de alerta y nosotros tenemos un gateway de envío de SMS.

El problema es que el gateway te envía solo un mensaje a la vez, así que tenes que hacer:

a) Una cola de mensajes y enviarlos
b) Un monton de scripts paralelos

Realmente como la carga de mensajes aún no es muy grande lo que hacemos es hacer la cola de mensajes. Esta cola tarda unos 2-3min en terminar de enviar la lista.

EL algoritmo es mas o menos el siguiente:

-El primer request lee el mensaje y la lista de contactos. Lanza el proceso y crea un archivo .lck que sirve para identificar que esta trabajando el envio de mensajes. El proceso comienza a enviar los SMS uno por uno.

-Si viene un cliente y envia otra alerta, es agregada a la cola, si aun se estan enviando SMS entonces no se abre un nuevo proceso sino que se deja ejecutando el que esta. El proceso cuando termina de enviar mensajes revisa si hay mensajes nuevos, si los hay vuelve a repetir el envío y si no termina. Cuando el proceso termina se borra el archivo .lck.

La página en asp simplmente lanza el proceso.

Disclaimer: Yo se que para estas cosas existe la comunicacion entre procesos, pero se supone que la plataforma es portable y todas las soluciones de intercomunicacion de procesos portables implican añadir complejidad extra al programa que realmente NO NECESITA. Realmente el archivo .lck funciona bien, luego con mas carga de SMS si habrá que implementar algun sistema de IPC más formal.

Naruto quiere hacer algo similar, solo que quiere verificar el fin del proceso. Que la tiene fácil, porque en el momento que el archivo exista signiica que se dejo de ejecutar el otro proceso.

Tenemos otra aplicacion que corre en backgrund que calcula poblaciones y tarda su toque. Obviamente se tiene que ejecutar en background porque sino se traba el cliente.
« Última Modificación: noviembre 29, 2010, 03:55:15 pm por mxgxw »


Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14587
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #12 : noviembre 29, 2010, 04:02:21 pm »
mira masfasdgaswxzcxasg, pero en tu caso, no te hubiera salido mas facil hacer los envios en batch? digo has hecho un vergo de trabajo para asegurarte que se manden como un solo proceso... no era mas facil dividirlo?

Desconectado Jaru

  • The Communiter-
  • *
  • Mensajes: 13252
  • some text
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #13 : noviembre 29, 2010, 04:05:59 pm »
Lo corri directamente desde la consola del linux y pues me corrio bien, generó el archivo y todo perfecto.

PERO:

fijense que probe este código que me dio mxgxw
http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/
Código: (php) [Seleccionar]
<?php
function run_in_background($Command$Priority 0)
   {
       if(
$Priority)
           
$PID shell_exec("nohup nice -n $Priority $Command 2> /dev/null & echo $!");
       else
           
$PID shell_exec("nohup $Command 2> /dev/null & echo $!");
       return(
$PID);
   }
   function 
is_process_running($PID)
   {
       
exec("ps $PID"$ProcessState);
       return(
count($ProcessState) >= 2);
   }
?>

y lo uso asi:
Código: [Seleccionar]
//execute code
echo "Running code..";
$ps = run_in_background("php ap_reports.php", 1);

se queda trabajando el browser y termina, cuando voy a ver el archivo, se ha quedado como a la mitad de la generacion del mismo, no lo completa.
« Última Modificación: noviembre 29, 2010, 04:07:52 pm por naruto »
N/A

Desconectado Jaru

  • The Communiter-
  • *
  • Mensajes: 13252
  • some text
Re: [PHP AYUDA] tiempo de ejecucion corta el despliegue del resultado
« Respuesta #14 : noviembre 30, 2010, 09:32:10 am »
vaya, probando de todo hice un shell script para ver si algo estaba fregando
mi shell script esta asi:

Código: [Seleccionar]
# script to run php file
clear
echo "running..."
php ap_reports.php& > /dev/null
exit 0

si corro este script desde la consola, todo perfecto, genera el archivo, pero si lo corro desde PHP con "shell_exec" no termina de generar mi archivo, se queda en un 30%

que podrá ser
N/A