parametros - Tiempo de espera una función en PHP
llamar funcion php desde otro php (6)
Antes de comenzar en el bucle, establezca una variable que recuerde el time()
. Al final de cada iteración, verifique si la time()
actual time()
es más de 60 segundos mayor. Si es así, break
. Por ejemplo:
<?php
$startTime=time();
foreach($arr as $key => $value){
some_function($key, $value); //This function does SSH and SFTP stuff
if (time()-$startTime>60) break; //change 60 to the max time, in seconds.
}
?>
¿Hay una manera de agotar una función? Tengo 10 minutos para realizar un trabajo. El trabajo incluye un bucle for, aquí hay un ejemplo:
<?php
foreach($arr as $key => $value){
some_function($key, $value); //This function does SSH and SFTP stuff
}
?>
$ arr tiene 15 elementos y some_function () a veces puede tardar más de 1 minuto. De hecho una vez que se ahorcó durante 5 minutos.
¿Hay alguna manera de que pueda agotar el tiempo de la función y seguir con el siguiente elemento en $ arr?
¡¡Gracias!!
Depende de su implementación. El 99% de las funciones en PHP están bloqueando. El procesamiento del significado no continuará hasta que la función actual se haya completado. Sin embargo, si la función contiene un bucle, puede agregar su propio código para interrumpirlo después de que se cumpla una determinada condición.
Algo como esto:
foreach ($array as $value) {
perform_task($value);
}
function perform_task($value) {
$start_time = time();
while(true) {
if ((time() - $start_time) > 300) {
return false; // timeout, function took longer than 300 seconds
}
// Other processing
}
}
Otro ejemplo donde NO es posible interrumpir el procesamiento:
foreach ($array as $value) {
perform_task($value);
}
function perform_task($value) {
// preg_replace is a blocking function
// There''s no way to break out of it after a certain amount of time.
return preg_replace(''/pattern/'', ''replace'', $value);
}
Echa un vistazo a set_time_limit . Ahora, la función en sí no es realmente lo que quieres, ya que solo toma en consideración el tiempo de ejecución, lo que significa que 5 segundos en la vida real podrían ser solo 0,2 segundos de ejecución. Pero la razón para mirar el enlace es para los comentarios. Hay un par de soluciones que los usuarios han publicado.
Lo que desea es utilizar la función pcntl_alarm, que activará una señal SIGALRM en el tiempo de espera. Por ejemplo:
// 10 minutes
pcntl_alarm( 600 );
pcntl_signal( ''SIGALRM'', function() { print( "I am done!/n" ); exit( 0 ); } );
Consulte aquí el manual de PHP para obtener más información sobre esto: http://php.net/manual/en/function.pcntl-alarm.php
PHP es un solo hilo ... tienes que usar la capacidad de tu sistema operativo para bifurcar otro proceso.
La única forma en que sé cómo hacer esto es con el comando exec para bifurcar otro proceso completo. Ponga las cosas que desee cronometradas en una secuencia de comandos separada, llame a exec a la secuencia de comandos, luego duerma inmediatamente durante 10 minutos. Si a los 10 minutos el proceso sigue ejecutándose, mátalo. (debe tener su PID haciendo que el comando ejecute el nuevo código php en segundo plano, obteniéndolo a través de la línea de comandos y devolviéndolo desde el comando exec).
Puedes intentar implementarlo usando ''curl''. Curl es, desde PHP, usado principalmente para hacer HTTP / FTP, pero soporta muchos más protocolos, incluyendo ssh / sftp. Nunca he hecho algo relacionado con ssh / sftp usando curl, así que no puedo dar ningún consejo adicional, pero debería poder encontrar información adicional aquí en o en otro lugar.
Hay una opción "CURLOPT_TIMEOUT" que puede usar para configurar el tiempo de espera para su solicitud (también hay una opción "CURLOPT_CONNECTTIMEOUT"). Incluso puede especificar los tiempos de espera en resolución de milisegundos (CURLOPT_TIMEOUT_MS / CURLOPT_CONNECTTIMEOUT_MS).
De todos modos: para un trabajo cronológico, recomendaría usar un "archivo de bloqueo" adicional que su script escribe cuando se inicia y elimina, cuando termina de ejecutarse. Puede verificar este archivo de bloqueo dentro de su secuencia de comandos, por lo que si cron activa su secuencia de comandos antes de que finalice la última ejecución, puede salir de la secuencia de comandos sin hacer nada más. Eso asegura que su script no se ejecutará varias veces en paralelo.
También puede encontrar más información sobre las opciones de CURL y sobre CURL en la documentación de PHP:
Debe asegurarse de que su libcurl y / o curl instalado para php sea compatible con SSH / SFTP, aunque:
etc.
Espero que ayude ...