2011-05-03 16 views
31

Sé que la CLI de PHP generalmente se utiliza debido a que no tiene límites de tiempo y es primaria porque no está utilizando subprocesos/procesos de Apache.Establecer max_execution_time en la CLI de PHP

Pero, ¿hay alguna forma de establecer explícitamente max_execution_time para algunos scripts que no quiero tener la libertad de "tiempo ilimitado" y solo quiero mantener esos scripts bajo control?

Si crees que esta pregunta puede responderse mejor en superuser.com y tienes permiso para moverla, hazlo. :)

Editar: He estado buscando en Google un poco y encontré el parámetro correcto:

php -d max_execution_time=5 script.php 
+0

Después de leer todas las respuestas, solo quiero agregar, que no es posible establecer 'max_execution_time' en ninguno de los archivos ini (' php.ini', 'php-cli.ini', etc.) para para cambiar el efecto cuando se ejecutan scripts CLI.Este comportamiento se describe aquí: http://php.net/manual/en/features.commandline.differences.php – jkulak

Respuesta

29

El documentation dice que cuando se ejecuta en modo línea de comandos, el valor predeterminado es 0 (sin límite). No dice que no se puede anularlo:

set_time_limit(10); // this way 
ini_set('max_execution_time', 10); // or this way 

Editar: acabo probado a mí mismo, y funciona como se esperaba.

F:\dev\www>c:php -f index.php 
PHP Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3 

Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3 
15

set_time_limit() funciona en scripts CLI.

<?php 
set_time_limit(1); //in seconds 
for (;;); 
?> 

después de un segundo regresa con el siguiente mensaje de error:

PHP Fatal error: Maximum execution time of 1 second exceeded in \ 
/home/stivlo/test.php on line 4 

Inicialmente Traté con el sueño() y el límite de tiempo no consigue aplicar. Como sugirió @Jon, usar un cálculo real, como un bucle infinito, funciona.

yo encontramos este interesante comentario en la página de sleep() PHP:

Nota: La función set_time_limit() y la directiva de configuración única max_execution_time afectar el tiempo de ejecución del script mismo. No se incluye cuando se determina el tiempo máximo que el script se ha estado ejecutando

Cualquier tiempo pasado en actividad que ocurra fuera de la ejecución del script como llamadas al sistema usando system(), la función sleep(), consultas de bases de datos, etc.
+10

No se puede probar con 'sleep'. Pruebe 'for (;;);' en su lugar. – Jon

+0

Tienes razón ... funciona, cambio mi respuesta ya que es engañosa. – stivlo

+1

Algo sobre -> para (;;); <- simplemente se ve bien :) –

0

Utilice la función set_time_limit.

+0

Funciona también en PHP CLI? –

+0

Sí lo hace, como demostró @Jon – stivlo

0

Tengo un problema similar. Pero en mi caso, tenía llamadas de bases de datos remotas que tomaban mucho tiempo y quería terminar el script después de un cierto período de tiempo. Como se señala en las otras respuestas, las llamadas externas (o sleep()) no cuentan contra la configuración de tiempo de espera configurado.

Así que mi enfoque fue averiguar los scripts pid, y luego el fondo de un comando kill -9 después de un sueño. Aquí hay un ejemplo básico:

$cmd = "(sleep 10 && kill -9 ".getmypid().") > /dev/null &"; 
exec($cmd); //issue a command to force kill this process in 10 seconds 

$i=0; 
while(1){ 
    echo $i++."\n"; 
    sleep(1); //simulating a query 
} 

Tenga en cuenta que es posible que el script termina muy bien, y una nueva y diferente, uno se pone en marcha con el mismo PID, que pondría fin a este comando kill. Eso es poco probable, pero debería considerarlo como una posibilidad si usa este enfoque.