2011-09-27 25 views
11

Usando set_time_limit() o max_execution_time, no "realmente" límites (excepto en Windows) el tiempo de ejecución, ya que como se indica en el manual de PHP:tiempo de ejecución "real" límite

Nota:

La función set_time_limit() y la directiva de configuración max_execution_time solo afectan el tiempo de ejecución del script . Cualquier tiempo dedicado a la actividad que ocurra fuera de la ejecución del script como llamadas al sistema usando sistema(), operaciones de flujo, consultas de base de datos, etc. no se incluye al determinar el tiempo máximo que se ha ejecutado el script. Esto no es así en Windows donde el tiempo medido es real.

Una solución es proposed in PHP comments que tienen un límite de tiempo "real" ejecución como lo que estoy buscando, pero me pareció claro/confuso.

+2

El sistema que ejecuta el proceso establece un límite de tiempo de ejecución real. Puede matar el proceso si se alcanza el límite (también conocido como límite estricto). Entonces, es un límite real, normalmente basado en el tiempo de CPU, que es el tiempo real consumido por un proceso (no exactamente cuánto tiempo ya se ejecuta el proceso). – hakre

+5

La solución sugerida en [el comentario del que está hablando] (http://www.php.net/manual/en/function.set-time-limit.php#105569) me parece buena, siempre que tenga Funciones POSIX y pcntl disponibles. ¿Qué es exactamente lo que no entiendes? – DaveRandom

+0

Mirar más a fondo la sugerencia en los comentarios manuales de PHP fue útil :) Al principio no entendía cómo estaba funcionando (no estoy acostumbrado a manejar los hilos). –

Respuesta

3

Podría estar equivocado, pero por lo que tengo entendido, solicite una explicación del código de la solución "Comentarios de PHP".

El truco es engendrar un proceso secundario, usando la función pcntl_fork, que terminará el proceso original (principal) después de un tiempo de espera. La función pcntl_fork devuelve la identificación del proceso del proceso hijo recién creado dentro de un subproceso de ejecución del proceso padre y cero dentro del subproceso de ejecución del proceso hijo. Eso significa que el proceso principal ejecutará el código en si la instrucción y el proceso secundario ejecutarán el código en else. Y como podemos ver en el código, el proceso principal realizará bucle sin fin mientras que el proceso hijo esperará 5 segundos y luego matará a su padre. Entonces, básicamente, usted quiere hacer algo como esto:

$real_execution_time_limit = 60; // one minute 

if (pcntl_fork()) 
{ 
    // some long time code which should be 
    // terminated after $real_execution_time_limit seconds passed if it's not 
    // finished by that time 
} 
else 
{ 
    sleep($real_execution_time_limit); 
    posix_kill(posix_getppid(), SIGKILL); 
} 

Espero haberlo explicado bien. Avísame si tienes alguna pregunta con respecto a esta solución.

Cuestiones relacionadas