在 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
。