2012-06-29 21 views
5

Esta no es una de las preguntas habituales si se cuenta el tiempo de espera por tiempo de espera o cosas por el estilo. Bien, este es el problema: he establecido max_execution_time para PHP como 15 segundos e idealmente esto debería agotar el tiempo cuando cruza el límite establecido, pero no es así. Apache se ha reiniciado después del cambio al archivo php.ini y un ini_get ('max_execution_time') está bien. A veces, el script se ejecuta hasta 200 segundos, lo cual es una locura. No tengo comunicación de base de datos de ningún tipo. Todo lo que hace el script es buscar archivos en el sistema de archivos Unix y, en algunos casos, redirigirlos a otra página JSP. No hay sleep() en el script.PHP max_execution_time no timeout

que calcular el tiempo total de ejecución del script PHP como esto:

Al comienzo de la secuencia de comandos puse:

$_mtime = microtime(); 
$_mtime = explode(" ",$_mtime); 
$_mtime = $_mtime[1] + $_mtime[0]; 
$_gStartTime = $_mtime; 

y la hora de finalización ($ _ gEndTime) se calcula de manera similar.
El tiempo total se calcula de una función de desconexión que me he registrado:

register_shutdown_function('shutdown'); 
............. 
function shutdown() 
{ 
    .............. 
    .............. 
    $_total_time = $_gEndTime - $_gStartTime; 
    .............. 
    switch (connection_status()) 
    { 
    case CONNECTION_NORMAL: 
     .... 
     break; 
     .... 
    case CONNECTION_TIMEOUT: 
     .... 
     break; 
     ...... 
    } 
} 

Nota: no puedo usar $ _SERVER [ 'REQUEST_TIME'] porque mi versión de PHP es incompatible. Eso apesta, lo sé.

1) Bueno, mi primera pregunta, obviamente, es ¿por qué se ejecuta mi script PHP incluso después del límite establecido de tiempo de espera?
2) Apache tiene la directiva Timeout, que es de 300 segundos, pero el binario de PHP no lee la configuración de Apache y esto no debería ser un problema.
3) ¿Existe la posibilidad de que algo esté enviando PHP a un modo de suspensión?
4) ¿Estoy calculando el tiempo de ejecución de forma incorrecta? ¿Hay una mejor manera de hacer esto?


Estoy perplejo en este momento. Asistentes PHP - por favor ayuda.

Edit: Acabo de descubrir que las operaciones de flujo no son la causa con unos pocos registros. La demora es solo aleatoria dentro del script incluso cuando no se realizan operaciones de transmisión. El cambio de contexto puede ser la razón. Pero todavía no tengo una respuesta clara. Miré Real max_execution_time for PHP on linux pero no estoy seguro de querer probarlo. ¿Cualquier otra sugerencia?

+0

Creo que las operaciones del sistema de archivos tampoco se cuentan en los cálculos de límite de tiempo. – lonesomeday

+1

Ya sabes, puedes usar 'microtime (true)' para recuperar un 'float' de inmediato ... – deceze

+0

@lonesomeday: ¿Estás seguro de eso? –

Respuesta

7

max_execution_timeúnicos límites de secuencia de comandos en tiempo de ejecución en sí - tiempo de CPU de su script. si el contexto del sistema operativo cambió a otro proceso y pasó algún tiempo allí, no se contará también. Por lo tanto, medir el tiempo real y esperar un tiempo de espera después de 30 segundos no será cierto en ningún momento dado. Y, por supuesto, no tiene en cuenta ninguna system, exec o momentos de red, así

+2

De hecho .. Incluso la espera de consultas DB o el manejo de flujos de datos se quedan fuera de la ecuación – Johan

+0

true, se olvidó de mencionar db cosas;) ¡gracias! – poncha

+0

No tengo ningún sistema, sin embargo, las llamadas del ejecutivo no llamo a ningún código externo. ¿Las operaciones del sistema de archivos se cuentan dentro del límite max_execution_time? Diga, un fopen() –

0

Si necesita tiempo de espera después de un cierto período de tiempo (según comentarios) por qué no llamar

$startscript = microtime(); 

//do some stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 


    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

Se obtiene el jist. No es muy bonito, pero podría funcionar.

+0

Esto podría funcionar cuando sé dónde ocurrirán los retrasos. Pero en mi caso, las demoras son aleatorias. Entonces, por ejemplo: si se pasa el primer control y el microtiempo() - $ startscript es cualquier valor que sea <1500 y si el retraso ocurre justo antes de que se realice el segundo chequeo, vuelve a ser la misma historia. Gracias de cualquier manera...! –

Cuestiones relacionadas