php popen()怎样处理超时情况

avatar
作者
筋斗云
阅读量:0

在 PHP 中,使用 popen() 函数打开一个进程并执行命令。但是,popen() 本身没有提供超时处理的功能。要实现超时处理,你可以使用 proc_open() 函数,因为它提供了更多的控制选项。

以下是一个使用 proc_open() 实现超时处理的示例:

function popen_timeout($command, $timeout) {     $process = proc_open($command, ['pipe', 'r'], $pipes);      if (is_resource($process)) {         // 设置超时         $timeout_seconds = ceil($timeout);         $start_time = time();          while (true) {             $current_time = time();             $elapsed_time = $current_time - $start_time;              if ($elapsed_time >= $timeout_seconds) {                 // 超时,关闭进程                 fclose($pipes[0]);                 fclose($pipes[1]);                 proc_close($process);                 return false;             }              $status = proc_poll($process);              if ($status === 0) {                 // 进程已经结束                 fclose($pipes[0]);                 fclose($pipes[1]);                 proc_close($process);                 return stream_get_contents($pipes[0]);             } elseif ($status === 1) {                 // 进程输出到标准错误                 fclose($pipes[0]);                 $output = stream_get_contents($pipes[1]);                 fclose($pipes[1]);                 proc_close($process);                 return $output;             }         }     } else {         return false;     } }  $command = "your_command_here"; $timeout = 5; // 设置超时时间(秒)  $result = popen_timeout($command, $timeout);  if ($result !== false) {     echo "Result: " . $result; } else {     echo "Timeout occurred."; } 

在这个示例中,我们定义了一个名为 popen_timeout 的函数,它接受一个命令和一个超时时间作为参数。函数使用 proc_open() 打开一个进程,并使用一个循环检查进程的状态。如果进程在指定的超时时间内完成,函数将返回进程的输出。如果进程超时,函数将关闭进程并返回 false

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!