2012-01-18 12 views

Respuesta

30

Mirando a la corriente source:

/* {{{ proto bool set_time_limit(int seconds) 
    Sets the maximum time a script can run */ 
PHP_FUNCTION(set_time_limit) 
{ 
    zend_long new_timeout; 
    char *new_timeout_str; 
    int new_timeout_strlen; 
    zend_string *key; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &new_timeout) == FAILURE) { 
     return; 
    } 

    new_timeout_strlen = zend_spprintf(&new_timeout_str, 0, ZEND_LONG_FMT, new_timeout); 

    key = zend_string_init("max_execution_time", sizeof("max_execution_time")-1, 0); 
    if (zend_alter_ini_entry_chars_ex(key, new_timeout_str, new_timeout_strlen, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC) == SUCCESS) { 
     RETVAL_TRUE; 
    } else { 
     RETVAL_FALSE; 
    } 
    zend_string_release(key); 
    efree(new_timeout_str); 
} 
/* }}} */ 

set_time_limit() es de hecho sólo un envoltorio alrededor de la conveniencia de llamadas de acuerdo ini_set(). Ni siquiera parece realizar el reinicio anunciado del temporizador. (Pero yo supongo que el "temporizador" en realidad no es una entidad separada, pero el valor ini sí se utiliza como tal.)

13

No, no hay.

echo ini_get('max_execution_time'); // 30 
set_time_limit(100); 
echo ini_get('max_execution_time'); // 100 

En cuanto restablecimiento del temporizador, que se pone a cero en ambos casos:

ini_set('max_execution_time', 10); 

for ($i=0; $i<50000000; $i++) { 

} 

ini_set('max_execution_time', 10); // timer is reset, just as it would be with set_time_limit 

for ($i=0; $i<50000000; $i++) { 

} 

echo 'done'; 
+1

Esta línea parece útil a veces. set_time_limit (max (ini_get ('max_execution_time'), $ new_timout)); – DarkSide

+0

@DarkSide - Falla si $ new_timout es -0 – stefgosselin

+0

@stefgosselin - si, ese es un caso especial con el que tiene que lidiar. – DarkSide

2

De acuerdo con el manual de PHP, set_time_limit() se restablecerá el temporizador de ejecución cuando se le llama. No creo que ini_set() tenga el mismo efecto secundario, que sería la diferencia entre los dos.

Consulte http://php.net/manual/en/function.set-time-limit.php para obtener más información.

Actualización: desde que examiné varias partes del código fuente de php (incluido el referido por la respuesta de mario), es mi conclusión que ini_set() y set_time_limit() son precisamente equivalentes.

ini_set() efectivamente restablece el temporizador (aunque todavía no sé cómo funciona la función de reinicio, tendría que buscar la función que mata al script cuando el temporizador termina para figurar ese fuera).

+0

No veo evidencia de la falta de reinicio del temporizador cuando se establece mediante 'ini_set' (YMMV, aumentar/disminuir el bucle si es necesario): http://codepad.viper-7.com/iTsOTR – webbiedave

+0

Bueno, yo solo estaba pasando por el manual y no realizó ninguna prueba: intentaré confirmar sus resultados y actualizar mi respuesta en consecuencia. –

26

Una pequeña diferencia a tener en cuenta es la forma en que se comportan en caso de fallo:

  • set_time_limit() no devuelve nada por lo que no puede usarlo para detectar si tuvo éxito. Además, se va a lanzar una advertencia:

    Advertencia: set_time_limit(): No se puede establecer límite de tiempo en modo seguro

  • ini_set() vuelve FALSE en caso de fallo y no incumple las advertencias.

En la práctica, no debería ser un gran problema ya que modo seguro supuestamente la única situación que puede causar una falla y la función ya está en desuso.

Aparte de eso, la función es solo un envoltorio para el cambio de propiedad.

2

Ambos modos "set_time_limit (5)" y "ini_set ('max_execution_time', '5')" reset vez, un práctico y claro ejemplo:

//----------------------------------------------------------- 
//test "max_execution_time": 

ini_set('max_execution_time', 5); 

for ($i=0; $i<3; $i++) { 
    sleep(1); 
} 

ini_set('max_execution_time', 5); 

for ($i=0; $i<3; $i++) { 
    sleep(1); 
} 

echo '<br/>'; 
echo 'done with max_execution_time'; 


//----------------------------------------------------------- 
//test "set_time_limit": 

set_time_limit(5); 

for ($i=0; $i<3; $i++) { 
    sleep(1); 
} 

set_time_limit(5); 

for ($i=0; $i<3; $i++) { 
    sleep(1); 
} 

echo '<br/>'; 
echo 'done with set_time_limit'; 

Todos "para" completar con éxito, esto indica que la hora se restableció en todos los casos, Saludos

Ese código solo es verdadero en Windows. Tiempo de sueño en php linux no consumen tiempo de ejecución por ejemplo en Linux:

<?php 
    set_time_limit(2); 
    for($i=0; $i<10; $i++) 
    { 
    echo ("$i \n"); 
    sleep(1); 
    } 

` mostrará

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

pero el mismo código en Windows con la configuración por defecto mostrará

1 | 2

+0

Ciertamente, la diferencia es * no * que uno de ellos no funciona xD –

+0

creo que esto debería aceptarse respuesta –