2011-09-27 16 views
8

Podría decir que mi pregunta está relacionada con PHP, pero lo que más me preocupa es la lógica de programación adecuada en situaciones donde la ejecución de funciones puede continuar indefinidamente.ejecución de la función de límite de tiempo en PHP o cualquier otra cosa

¿Cuál es la manera correcta de controlar el tiempo que lleva ejecutar algunas funciones y cómo detener esta ejecución y continuar con el resto del programa?

Bien, sé que, por ejemplo, hay una función set_time_limit() que devuelve un error fatal pero no quiero esto, quiero que mi código continúe después de x segundos, o tal vez después de que se exceda arroje una excepción, atraparlo y hacer algo más?

¿Está escribiendo algún tipo de solución de función "guardián" y cómo se hace?

Gracias por cualquier ayuda que pueda proporcionar, cualquier enlace, cualquier artículo que resuelva este problema de una manera que "debería" hacerse.

BR, Newman

+1

¿Cuál es el contexto, más específicamente? Supongo que la función contiene algún tipo de bucle. Si esto es correcto, mi primer instinto sería tomar una marca de tiempo con 'microtime()' antes de ingresar al ciclo y luego comparar esa marca de tiempo con una que se genere dentro del ciclo en cada iteración. Al alcanzar un cierto valor, puede lanzar una excepción o hacer cualquier otra cosa. Quizás he malinterpretado el contexto de lo que estás tratando de hacer. ¿Estás buscando algo que puedas aplicar más fácilmente a numerosas funciones? – Pete171

+0

sí, algo así.Mi problema es que una de mis funciones es tratar de hacer telnet a otro dispositivo y, en ocasiones, el tiempo de espera de telnet es demasiado largo. – newman555p

Respuesta

3

PHP no proporciona una manera general, el tiempo de espera para una función. Pero muchos componentes donde este problema es común le permiten definir un tiempo de espera.

Ejemplos:

  • El HTTP Stream Wrapper le permite especificar una opción timeout:

    file_get_contents('http://example.com', false, stream_context_create(
        array('http' => array('timeout' => 10 /* seconds */)) 
    )); 
    
  • DOP (base de datos de capa de abstracción) le permite establecer un tiempo de espera mediante el PDO::ATTR_TIMEOUT attribute (tenga en cuenta que este atributo puede significar cosas diferentes con diferentes controladores de base de datos):

    $pdo->setAttribute(PDO::ATTR_TIMEOUT, 10 /* seconds */); 
    
  • Se puede establecer un tiempo de espera de conexión cuando se utiliza FTP:

    $ftp = ftp_connect('example.com', 21, 10 /* seconds */) 
    

Del mismo modo todas las otras extensiones que tienen acceso a recursos remotos potencialmente proporcionará tales parámetros de tiempo de espera u opciones.

0

En PHP en particular, no creo que tenga una forma válida de controlar el tiempo de ejecución de sus funciones desde fuera de ellas. Como dijo, cosas como set_time_limit lanzarán un Fatar Error y matarán su script.

Sugeriría desordenar el tiempo de ejecución dentro de sus funciones, usando cosas como microtime() y lanzar una excepción si se excede el límite de tiempo; una excepción que podrá atrapar afuera y continuar actuando en consecuencia.

+0

OK, lo intentaré como thay. pero, ¿cómo se aborda este problema generalmente (no PHP)? – newman555p

+0

Creo que depende del idioma que estés usando. Algunos, como Earlang, permiten al programador adjuntar procesos, lo que les permite controlarse mutuamente. No sé si hay una técnica estándar para manejar este escenario, pero si la hay, por favor coméntame haciéndome saber el nombre :) – Deleteman

Cuestiones relacionadas