色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

exec php 超時

傅智翔1年前6瀏覽0評論
在進行 PHP 開發的過程中,exec 函數是非常常用的一個方法,它可以用來執行命令行命令,并返回結果。但是,當執行時間過長時,就會遇到超時問題。本文將介紹 exec 函數的超時問題,并給出解決方案。 首先,我們來看一下一個簡單的 exec 函數的使用示例:
exec('command', $output, $return_var);
其中,command 是要執行的命令,$output 是一個引用變量,用來保存命令執行后輸出的結果,$return_var 是一個引用變量,用來保存命令的退出狀態碼。這個函數非常方便,可以用來執行各種命令。 但是,當 command 命令執行時間過長時,就會出現超時問題。比如,我們要執行一個需要 10 秒鐘才能完成的命令,那么如果在 exec 函數中設置的超時時間是 5 秒鐘,那么就會在 5 秒鐘后自動終止命令的執行,并返回錯誤信息。 那么,如何解決 exec 函數的超時問題呢?我們可以使用 proc_open 函數來代替 exec 函數。proc_open 函數可以打開一個進程,并獲取該進程的輸入輸出流,從而可以控制進程的執行。下面是一個使用 proc_open 函數的示例代碼:
$descriptorspec = array(
0 =>array("pipe", "r"),  // stdin is a pipe that the child will read from
1 =>array("pipe", "w"),  // stdout is a pipe that the child will write to
2 =>array("pipe", "w")   // stderr is a pipe that the child will write to
);
$process = proc_open('command', $descriptorspec, $pipes);
if (is_resource($process)) {
stream_set_blocking($pipes[1], 0);  // set stdout non-blocking
stream_set_blocking($pipes[2], 0);  // set stderr non-blocking
$stdout = '';
$stderr = '';
$start_time = time();
while (true) {
usleep(1000);
$stdout .= stream_get_contents($pipes[1]);
$stderr .= stream_get_contents($pipes[2]);
$status = proc_get_status($process);
if (!$status['running']) {
break;
}
if ((time() - $start_time) >$timeout) {
proc_terminate($process);
return array(false, 'Command timeout');
}
}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
return array(true, $stdout);
}
在這個代碼中,$descriptorspec 數組定義了 STDIN、STDOUT 和 STDERR 的輸入輸出方向,$process 變量是一個進程資源句柄,可以用來查詢進程狀態和控制進程執行。在主循環中,每隔 1 毫秒鐘讀取一次 STDOUT 和 STDERR 的輸出,并判斷進程是否仍在運行,并且是否超時。如果進程超時,就終止進程執行并返回錯誤信息。否則,就返回進程的輸出結果。 總的來說,雖然使用 proc_open 函數來代替 exec 函數比較麻煩,但是它可以避免 exec 函數的超時問題,更加靈活地控制進程的執行。因此,在編寫 PHP 代碼時,需要根據實際情況選擇合適的方法來執行命令。