2009-07-24 11 views
12

Hola ¿existe la posibilidad de establecer límite de tiempo sólo para un comando o sólo a una función, por ejemplo:límite de tiempo de ejecución de una función o comando PHP

function doSomething() 
{ 
    //..code here.. 

    function1(); 

    //.. some code here.. 

} 

quiero fijar límite de tiempo sólo para function1.

No sale de set_time_limit pero creo que esto establece el límite de tiempo para la escritura en general. ¿Alguien alguna idea?

+0

¿Qué desea que suceda si el temporizador expira mientras la función 1 todavía está en ejecución? – tialaramex

Respuesta

18

set_time_limit() does ejecutar globalmente, pero se puede restablecer localmente.

Establezca el número de segundos que puede ejecutar un script. Si se alcanza esto, , la secuencia de comandos devuelve un error fatal. El límite predeterminado es 30 segundos o, si existe , el valor de max_execution_time definido en php.ini.

Cuando llama, set_time_limit() reinicia el contador de tiempo de espera de cero. En otras palabras, si el tiempo de espera es el valor predeterminado de 30 segundos, y 25 segundos en la ejecución del script una llamada tales como set_time_limit (20) se hace, la secuencia de comandos tendrá una duración de un total de 45 segundos antes de tiempo de espera.

yo no lo he probado, pero puede ser capaz de establecer de forma local, restablecer cuando salga de la

<?php 
set_time_limit(0); // global setting 

function doStuff() 
{ 
    set_time_limit(10); // limit this function 
    // stuff 
    set_time_limit(10); // give ourselves another 10 seconds if we want 
    // stuff 
    set_time_limit(0); // the rest of the file can run forever 
} 

// .... 
sleep(900); 
// .... 
doStuff(); // only has 10 secs to run 
// .... 
sleep(900); 
// .... 

set_time_limit() ... Cualquier tiempo dedicado a la actividad que tiene lugar fuera de la ejecución de la secuencia de comandos, como las llamadas al sistema que utilizan el sistema(), las operaciones de flujo, las consultas de la base de datos, etc. no se incluye al determinar el tiempo máximo que la secuencia de comandos se ha estado ejecutando. Esto no es cierto en Windows donde el tiempo medido es real.

+3

¡Muy bien! gracias! pero devuelve un error fatal si no se cumplieron los criterios de tiempo. ¿Hay alguna manera de evitar eso? – Granit

+0

No es posible detener el error fatal, ya que es el tiempo de espera. Si desea hacer otra cosa, tendrá que definir más a fondo lo que está haciendo y diseñar un sistema que funcione según sea necesario. Si realiza consultas de bases de datos que tardan demasiado, trataría de mejorar la consulta (y la base de datos subyacente) para agilizarlas, en lugar de intentar solucionarlo fuera del problema original. –

+0

Gracias por ayudarme a encontrar lo correcto. Creo que lo que estaba buscando era max_input_time ¿Sabe si también devuelve un error fatal si no se cumple el plazo? – Granit

9

Usted tendría que codificar que sí mismo si desea volver a function1 cuando el límite de tiempo se ha acabado.

function doStuff($seconds) 
{ 
    $finish=time()+$seconds; 

    $done=false; 
    $timeout=false; 

    while (!$done && !$timeout) 
    { 
     //do stuff here, set $done to true if you complete 

     //out of time? 
     $timeout=time() >= $finish; 

    } 

    return $done; //let caller know if we completed 
} 

Por supuesto, las "cosas" que lo haga necesario que se produzca iterativo para que pueda mantener el control sobre su tiempo transcurrido y dejar de fumar si es necesario.

Si quieres ejecución de tiempo de espera de una función arbitraria y tener un control devuelto a usted, que no es compatible. Si realmente necesita hacer esto, hágalo como un proceso separado. Luego puede cerrar el proceso si parece que lleva demasiado tiempo.

+0

Gracias por la respuesta pero mire este acenario función doStuff ($ seconds) { $ finish = time() + $ seconds; $ done = false; $ timeout = false; while (! $ Done &&! $ Timeout) // // hacer las cosas aquí, configurar $ hecho en verdadero si completa // ¿fuera de tiempo? $ result = anotherFunction(); esta función es una función de php estándar que no se puede modificar y que en mi caso lleva demasiado tiempo ejecutar. $ timeout = time()> = $ finish; } return $ done; // permite saber a la persona que llama si completamos } – Granit

+0

Gracias por la respuesta, pero mira este acenario function doStuff($seconds) { $finish=time()+$seconds; $done=false; $timeout=false; while (!$done && !$timeout) { //do stuff here, set $done to true if you complete //out of time? $result = anotherFunction(); this function is a standart php function which can not be modified and it takes too much to execute in my case. $timeout=time() >= $finish; } return $done; //let caller know if we completed } Granit

+4

No puedes tener una función arbitraria al salir después de un tiempo especificado. Si realmente necesita hacer esto, hágalo como un proceso separado. Luego puede cerrar el proceso si parece que lleva demasiado tiempo. –

0

no creo que esto sea posible, pero ¿por qué harías esto? Si alguna vez se interrumpe un guión, es posible que no desee que lo desee. Esto debería ser más como una protección de usted mismo (en caso de que cargue un bucle infinito o algo que le llevará horas), pero si su secuencia de comandos lleva mucho tiempo, debe darle el tiempo necesario o cambiar el script para que funcione más rápido (para algunos crons está bien tomar un tiempo, pero si un guión normal que se llama con bastante frecuencia requiere más tiempo que el límite de tiempo predeterminado, es posible que enfrente algunos problemas graves de rendimiento)

+0

Digamos que mis scripts obtienen datos de la base de datos y para cada fila intenta hacer algo con esa fila como doSomething (fila) pero a veces esto puede llevar mucho tiempo. Así que necesito algo como cuando este doSomething no termina en 5 minutos para continuar con la otra fila. Si de alguna manera pudiera hacer una función como: function doSomething() { // código aquí return results; } Pero si esta función no se puede completar en 5 minutos, ¡por ejemplo, falso! – Granit

+0

ah bien, en ese caso quédate con la respuesta de paul dixon – Flo

3

No, no es posible: max_execution_time se utiliza como una medida de seguridad, para evitar que los scripts defectuosos (como el bucle infinito) destruyan el servidor; pero no tiene la intención de funcionar por unidad de función.

Y el hecho de que se termina con un error grave no es definitivamente agradable para el usuario de todos modos ...

1

Utilizo exec para ejecutar shellscript que genera exportación desde una aplicación externa. Si el script se ejecuta demasiado, se alcanza max_execution_time y el usuario nunca sabrá qué sucedió. La limitación a dicha función me ayudaría a determinar si el final está cerca y enviar algún error fácil de usar.

6
$endtime=time()+10; 

while(time()!=$endtime){ 

    echo "."; 
} 
Cuestiones relacionadas