阅读量: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
。