2009-04-11 12 views
40

Tengo dos preguntas relativas a la función sleep() en PHP:¿Cuenta el tiempo de espera para el límite de tiempo de ejecución?

  1. Cómo afecta el tiempo de apagado el plazo máximo de ejecución de mis scripts PHP? A veces, PHP muestra el mensaje "se excedió el tiempo máximo de ejecución de 30 segundos". ¿Aparecerá este mensaje si uso sleep(31)?

  2. ¿Existe algún riesgo al utilizar la función sleep()? ¿Cuesta mucho rendimiento de la CPU?

+0

Supongo que es cound ... y ¿por qué necesitarías un sueño() en tu PHP? Me pregunto ... por favor, diga más –

+0

La causa: solo puedo ejecutar cronjobs cada 5 minutos. Así que pensé que podría usar ... $ waittime = mt_rand (0, 290); suspensión ($ waittime); ... y ejecuta el código 4 veces simultáneamente. Entonces debería tener un cron en 4 puntos diferentes en el tiempo. – caw

+0

Comienzo algunas secuencias de comandos con tiempos de suspensión de más de 100 segundos. Ahora mi sitio web no se carga más. Probablemente el servidor solo puede ejecutar x scripts simultáneamente y hay x scripts durmiendo. ¿Podría eso ser cierto? – caw

Respuesta

77

Debe intentarlo, solo tenga un script que duerma durante más tiempo que el máximo de ejecución.

<?php 
    sleep(ini_get('max_execution_time') + 10); 
?> 

Spoiler: Under Linux, sleeping time is ignored, but under Windows, it counts as execution time.

+2

Puede aceptar su respuesta y hacer un servicio para la comunidad. –

+0

Me encanta ver respuestas extremadamente simples que ilustran mejor que un párrafo gigante. Me encanta el alerón también! –

+0

Creo que su respuesta es un buen ejemplo de por qué uno no debería simplemente probar un fragmento de código sino preguntar. – Adam

-5

a) Sí, se tiene en cuenta para el límite de tiempo (lo que el sueño (31) dará lugar a un error)

b) Se hace lo contrario de un costo de rendimiento de la CPU - permite que otras aplicaciones usen la CPU (cuando una aplicación duerme, el uso de la CPU de esa aplicación será cercano al 0%). Además de quitarle tiempo al usuario, realmente no puedo pensar en ningún riesgo de usar esto.

8

Solo afecta al tiempo de secuencia de comandos, no a las llamadas al sistema, como sleep(). Aparentemente hay un error que incluye Windows sleep(). El tiempo máximo de ejecución se trata de tiempo real, no de tiempo de CPU o algo así. Puede cambiarlo sin embargo:

  • max_execution_time directiva en su php.ini. Este es un escenario global;
  • Usando ini_set() con la directiva anterior. Esto lo cambiará solo para el script actualmente en ejecución solo para esa ejecución;
  • set_time_limit(): también un cambio local.

En cuanto a la diferencia entre los dos últimos, creo que max_execution_time es una cantidad fija. En ejecución:

ini_set('max_execution_time', 60); 

limitará la secuencia de comandos a 60 segundos. Si después de 20 segundos llama al:

set_time_limit(60); 

el guión ahora estará limitado a 20 + 60 = 80 segundos.

+1

?? Hay 6 respuestas que dicen más o menos lo mismo y la mía es downvoted? ¿Cómo funciona? ¿Qué pasa con lo de arriba? – cletus

+0

Probablemente porque ha cambiado su respuesta para que sea correcta después del voto a la baja. – Samuel

+3

No hay tiempo editado en la parte inferior, ¿cómo pudo haberlo cambiado? – Calvin

6

Desde el PHP sleep() page, hay una nota aportado por los usuarios:

Nota: La función set_time_limit() y la configuración de directiva max_execution_time solamente afecta al tiempo ejecución del script mismo. Cualquier tiempo dedicado a la actividad que sucede fuera de la ejecución del script tales como llamadas al sistema usando sistema(), la función sleep(), consultas de bases de datos, etc., no se incluye cuando se determina el tiempo máximo que la script se ha estado ejecutando.

+1

Solo para agregar, este comportamiento solo se muestra en * nix. En Windows, set_time_limit() gana todo el tiempo. –

0

Otros ya han cubierto los conceptos básicos de sleep() y el límite de tiempo de ejecución del script PHP, pero también debe tener en cuenta otro riesgo al usar períodos de sueño muy largos.

Normalmente, cuando un navegador envía una solicitud a un servidor y no recibe ningún dato del servidor, la conexión puede expirar. Este límite de tiempo depende de las configuraciones del navegador, pero he leído que IE7 tiene un valor predeterminado de solo 30 segundos, mientras que Firefox has a default value of 115 seconds - puede verificar su propia configuración en Firefox yendo a sobre: ​​config y filtrando para la red .http.keep-alive.timeout (el límite de tiempo se especifica en segundos).

Editar: Tenía las unidades para network.http.keep-alive.timeout y browser.urlbar.search.timeout mixed up. De hecho, es en segundos, no en décimas de segundo.

+0

Gracias, no sabía eso antes. Creo que el límite debe especificarse en 1/1 de segundo porque el valor en about: config es 30.;) – caw

+0

Ah, tienes razón. Es en segundos. Pero el valor predeterminado debería ser de 300 segundos, no de 30, por lo que tal vez su configuración haya sido modificada por una extensión del navegador. – Calvin

Cuestiones relacionadas