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