使 PHP 中的函数超时

2022-08-30 15:38:56

有没有办法使函数超时?我有10分钟的时间来完成一项工作。该作业包含一个 for 循环,下面是一个示例:

<?php
foreach($arr as $key => $value){
   some_function($key, $value); //This function does SSH and SFTP stuff
}
?>

$arr有 15 个元素,some_function() 有时可能需要 1 分钟以上。事实上,一旦它被挂起了5分钟。

有没有办法使函数调用超时并继续使用$arr中的下一个元素?

谢谢!!


答案 1

这取决于您的实现。PHP中99%的函数被阻塞。这意味着在当前函数完成之前,处理不会继续。但是,如果函数包含循环,则可以添加自己的代码,以便在满足特定条件后中断循环。

像这样:

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
  }
}

另一个无法中断处理的示例:

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);
}

答案 2

您需要的是使用pcntl_alarm函数,该函数将在超时时触发 SIGALRM 信号。

例如:

// 10 minutes
pcntl_alarm( 600 );
pcntl_signal(SIGALRM, function() { print( "Timed-out!\n" ); exit( 0 ); });

有关这方面的更多信息,请参阅 PHP 手册:http://php.net/manual/en/function.pcntl-alarm.php


推荐