溫馨提示×

php popen()怎樣處理超時情況

PHP
小樊
84
2024-10-13 12:22:29
欄目: 編程語言

在 PHP 中,使用 popen() 函數(shù)打開一個進程并執(zhí)行命令。但是,popen() 本身沒有提供超時處理的功能。要實現(xiàn)超時處理,你可以使用 proc_open() 函數(shù),因為它提供了更多的控制選項。

以下是一個使用 proc_open() 實現(xiàn)超時處理的示例:

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 的函數(shù),它接受一個命令和一個超時時間作為參數(shù)。函數(shù)使用 proc_open() 打開一個進程,并使用一個循環(huán)檢查進程的狀態(tài)。如果進程在指定的超時時間內完成,函數(shù)將返回進程的輸出。如果進程超時,函數(shù)將關閉進程并返回 false。

0