Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] max_time_execute con ignore_user_abort

Estas en el tema de max_time_execute con ignore_user_abort en el foro de PHP en Foros del Web. Saludos. Estoy intentando hacer que ejecute un script de envio de archivos pesados de esta manera. He leido algunos post y solo me imagino que ...
  #1 (permalink)  
Antiguo 04/05/2016, 09:56
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
max_time_execute con ignore_user_abort

Saludos.
Estoy intentando hacer que ejecute un script de envio de archivos pesados
de esta manera.
He leido algunos post y solo me imagino que podria funcionar de esta manera.
Obviamente estoy omitiendo el upload_move_file Y el $body es la ruta
donde envio el archivo hasta otro servidor.
El problema es que no envia archivos pesados porque aparece max_time_execute 120 etc ... cuando son archivos grandes, archivos pequeños funciona bien.

La direccion es una privada porque son dos servidores, tambien no quisiera colocar en
el php ini como limite de tiempo de ejecucion 0 por lo que puede haber procesos que
se este demorando mucho y lo mejor es cerrarlos automaticamente, la unica excepcion
es el fichero donde envia archivos, no puedo colocar un tiempo por que aveces hay
archivos de muchas gigas.

Me podria por favor colaborar como hacer para que funcione aunque el cliente cierre el navegador siga ejecutando el envio ?
Código PHP:
Ver original
  1. $body = Array('file_'=>new CurlFile('C:/wamp/www/images/'.$file_name),
  2.                     "id_client"=>$id_clien,
  3.                     "id_opera"=>$id_opera);
  4.       $ch = curl_init("http://10.10.20.xxx/recibe_archivos.php");
  5.             curl_setopt($ch,CURLOPT_POSTFIELDS, $body);
  6.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  7.             $dat = curl_exec($ch);
  8.             curl_close($ch);
  9.             echo $dat;
  10.       while(1){ // ¿Falló la conexión?
  11.         if(connection_status() != CONNECTION_NORMAL){
  12.             $ch = curl_init("http://10.10.20.xxx/recibe_archivos.php");
  13.             curl_setopt($ch,CURLOPT_POSTFIELDS, $body);
  14.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  15.             $dat = curl_exec($ch);
  16.             curl_close($ch);
  17.             echo $dat;
  18.         }
  19.             // Dormir durante 10 segundos
  20.             sleep(10);
  21.       }      
  22.       die;

Última edición por andres18281; 04/05/2016 a las 09:58 Razón: codigo mal escrito
  #2 (permalink)  
Antiguo 04/05/2016, 10:04
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: max_time_execute con ignore_user_abort

¿Y por qué ejecutas dichos procesos desde la web?

No tiene sentido, sólo desperdicias recursos y tiempo.

Lo correcto es usar procesos del sistema, como si estuvieras en la linea de comandos: ahí no existen tales restricciones y no dependes de un navegador para invocar la ejecución del script en el servidor, ni tampoco tienes que esperar respuesta alguna, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 04/05/2016, 10:20
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: max_time_execute con ignore_user_abort

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Y por qué ejecutas dichos procesos desde la web?

No tiene sentido, sólo desperdicias recursos y tiempo.

Lo correcto es usar procesos del sistema, como si estuvieras en la linea de comandos: ahí no existen tales restricciones y no dependes de un navegador para invocar la ejecución del script en el servidor, ni tampoco tienes que esperar respuesta alguna, etc.
Hola.
Es necesario porque los usuarios de la web requieren subir archivos, descargar etc.
Es muy necesario que sea asi.
  #4 (permalink)  
Antiguo 04/05/2016, 13:47
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: max_time_execute con ignore_user_abort

Código HTML:
Ver original
  1. <br />
  2. Me genera mucho esto.
  3. <font size='1'><table class='xdebug-error xe-fatal-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
  4. <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Fatal error: Maximum execution time of 120 seconds exceeded in C:\wamp\www\controlador\archivos\cargando.php on line <i>2</i></th></tr>
  5. <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
  6. <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
  7. <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0000</td><td bgcolor='#eeeeec' align='right'>274576</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp\www\controlador\archivos\cargando.php' bgcolor='#eeeeec'>..\cargando.php<b>:</b>0</td></tr>
  8. </table></font>
  #5 (permalink)  
Antiguo 04/05/2016, 14:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: max_time_execute con ignore_user_abort

Pues 120 segundos no es nada trivial, por muy "necesario" que lo pienses estás haciendo sufrir a tus usuarios.

En serio, yo consideraría delegar dicho procedimiento a un cron-job, y usar sistemas de eventos o polling para notificar del estado de dichos procesos al usuario.

Tener que esperar más de 1 minuto para cualquier cosa es horrible: no lo hagas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 04/05/2016, 14:20
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: max_time_execute con ignore_user_abort

Cita:
Iniciado por pateketrueke Ver Mensaje
Pues 120 segundos no es nada trivial, por muy "necesario" que lo pienses estás haciendo sufrir a tus usuarios.

En serio, yo consideraría delegar dicho procedimiento a un cron-job, y usar sistemas de eventos o polling para notificar del estado de dichos procesos al usuario.

Tener que esperar más de 1 minuto para cualquier cosa es horrible: no lo hagas.
Yo agradezco el interes que esta tomando, pero creo que no ha comprendido la situacion.
No se porque ha dicho que tiene que esperar un minuto para cualquier cosa, realmente
no lo se.
Cuando se utiliza un script para un proceso, entre mas largo sea, siempre tomara tiempo por lo que si usara 500 segundos por ejemplo, los 120 segundos maximos que proporsiona php le va a ser insuficiente.
Ahora bien, aterrizando la situacion mia. Hay usuarios remotos, clientes que usa una plataforma virtual para enviar sus archivos, hay archivos que pesan poco y la tranferencia de archivo que usa curl o upload_move_file no toma mucho tiempo enviando 1 o 2 megas,
pero hay archivos que pesan gigas y subir datos puede tomar mas tiempo para el envio desde el servidor web a un servidor de datos, entonces ahi el max_execution_time debe adaptarse segun el tiempo que requiera tomarse para usar el script para poder tranferir los datos.

Gracias.

Última edición por andres18281; 04/05/2016 a las 14:21 Razón: ortografia
  #7 (permalink)  
Antiguo 04/05/2016, 14:40
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: max_time_execute con ignore_user_abort

He entendido perfectamente tu situación, no te confundas.

El problema es que aunque no lo quieras haces esperar a tus usuarios, y la idea de usar un servidor web es que dichos procesos sean rápidos, aún así transmitas GBs lo debes hacer mediante HTTP y no a través de conexiones CURL que están fuera del proceso principal: ese es el problema.

Si necesitas "copiar" archivos muy pesados entre servidores debes usar mejores técnicas que un servidor web, un script en PHP y 2 minutos máximo de tiempo de espera.

¿Ya entiendes cual es el problema real detrás de lo que expones?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 04/05/2016, 16:07
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: max_time_execute con ignore_user_abort

Cita:
Iniciado por pateketrueke Ver Mensaje
He entendido perfectamente tu situación, no te confundas.

El problema es que aunque no lo quieras haces esperar a tus usuarios, y la idea de usar un servidor web es que dichos procesos sean rápidos, aún así transmitas GBs lo debes hacer mediante HTTP y no a través de conexiones CURL que están fuera del proceso principal: ese es el problema.

Si necesitas "copiar" archivos muy pesados entre servidores debes usar mejores técnicas que un servidor web, un script en PHP y 2 minutos máximo de tiempo de espera.

¿Ya entiendes cual es el problema real detrás de lo que expones?
El proceso es el siguiente, por http envia un archivo al servidor web, cuando ha enviado el archivo por medio de curl de la libreria de php, envia ese archivo a otro servidor.
El hecho es que se esta colgando en tiempo de ejecucion cuando hace el proceso de enviar el archivo que se ha cargado en el servidor web al de datos.
Envia perfectamente archivos pequeños de unas pocas megas, el problema es cuando envia archivos grandes.
aunque le he colocado
ini_set('max_input_time', 0); o el ini_set('max_execution_time', 0); aun asi, si pasan 130 segundos en el proceso, simplemente falla como el warning de arriba.
Se supone que al colocar max_input_time a 0 simplemente en ese script dura el tiempo que sea necesario por lo que es ilimitado el tiempo para la ejecucion.
No es recomendable cambiar el limite de ejecucion en el php.ini por si hay algun mal bucle en otro archivos, no genere bucles infinitos (segun recomendaciones).
Ese es el caso y te agradezco nuevamente tu interes pateketrueke, es un tema que estan en muchos foros sin ninguna respuesta y si se resuelve este post, ayudara a muchos programadores que pasen por esta situacion.
  #9 (permalink)  
Antiguo 04/05/2016, 19:16
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: max_time_execute con ignore_user_abort

Cita:
El proceso es el siguiente, por http envia un archivo al servidor web
Eso está bien, así funcionan las cosas: el problema no está en subir el archivo al servidor principal.

Me imagino que será un formulario simple de upload ¿o no?

Cita:
cuando ha enviado el archivo por medio de curl de la libreria de php, envia ese archivo a otro servidor.
Ese es el problema.

Podrías resolverlo de otra forma: sólo notifica al servidor de destino que descargue dicho archivo de una URL que tu proveerás de tu servidor principal: la clave es que el archivo sea público para poder descargarse por HTTP.

Mientras sigas enviando el archivo del servidor principal al de destino mediante CURL jamás podrás "resolver" tus problemas de timeout.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 05/05/2016, 05:51
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: max_time_execute con ignore_user_abort

Saludos

Estoy observando que el problema no es tanto max_input_time, cuando se suben archivos por http, el directorio tmp es quien recibe los archivos, si verifico con if(is_file($_FILES['sdsd']['tmp_name]) verifica que si existe, pero por alguna razon, los archivos grandes, CurlFile no permite cargarlo para subirlo, pero archivos pequeños si lo permite.
En el htaccess tengo
php_value post_max_size -1
php_value upload_max_filesize 4G
php_value memory_limit 128M
php_value max_execution_time 0
php_value max_input_time 4G
php_value session.gc_maxlifetime 1200

por si es problema de configuracion global entonces tome esta configuracion pero aun sigo con el problema.
El error para archivos grandes es 404 aunque repido, con el if(is_file()) detecta que si esta el archivo que se ha subido.



Ademas de colocar esas lineas de arriba, si usan servidor ISS deben de ubicar en configuracion de servidor en panel de control
y buscar esta linea
Listo, si, era un problema de ubicacion de la ruta donde estaba tomando la configuracion.

Para futuro si alguien tiene problemas con ISS y tranferencia de archivos, simplemente
debe cambiar una linea en configuracion de web server que esta en
panel de control, configuracion, web service
y buscan esta liinea
system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1000000" />
</requestFiltering>
</security>
<system.webServer>
Solo deben de añadirle el tamaño para que permita recibir archivos pesados.
Esto es solo si usan ISS.

Saludos y gracias a todos

Última edición por andres18281; 05/05/2016 a las 10:34

Etiquetas: Ninguno
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 05:49.