gpt4 book ai didi

PHP 进程执行超时

转载 作者:行者123 更新时间:2023-12-04 06:31:50 26 4
gpt4 key购买 nike

我有以下代码:

/**
* Executes a program and waits for it to finish, taking pipes into account.
* @param string $cmd Command line to execute, including any arguments.
* @param string $input Data for standard input.
* @param integer $timeout How much to wait from program in msecs (-1 to wait indefinitely).
* @return array Array of "stdout", "stderr" and "return".
*/
function execute($cmd,$stdin=null,$timeout=-1){
$proc=proc_open(
$cmd,
array(array('pipe','r'),array('pipe','w'),array('pipe','w')),
$pipes=null
);
fwrite($pipes[0],$stdin); fclose($pipes[0]);
$stdout=stream_get_contents($pipes[1]); fclose($pipes[1]);
$stderr=stream_get_contents($pipes[2]); fclose($pipes[2]);
$return=proc_close($proc);
return array(
'stdout' => $stdout,
'stderr' => $stderr,
'return' => $return
);
}

它有两个“问题”。
  • 代码是同步的;它会卡住,直到目标进程关闭。
  • 到目前为止,如果不发出不同类型的命令(例如 Linux 上的 $cmd > /dev/null & 和 Windows 上的 start /B $cmd),我还无法“卡住”它

  • 我根本不介意“卡住”。我只需要实现那个超时。

    注:解决方案是跨平台兼容的,这一点很重要。同样重要的是 $cmd不必更改 - 我正在运行一些复杂的命令,我担心可能会出现一些问题,但是,这取决于修复的类型 - 我很高兴听到这些,只是我更喜欢一个不同的选择。

    我找到了一些可能有帮助的资源:
  • Run perl file from PHP script but not wait for output on Windows Server
  • PHP set timeout for script with system call, set_time_limit not working
  • http://www.shapeshifter.se/2008/08/04/asynchronous-background-execution-with-php/
  • 最佳答案

    代码有几个错误。

    这实际上是有效的:

    function execute($cmd, $stdin = null, $timeout = -1)
    {
    $proc=proc_open(
    $cmd,
    array(array('pipe','r'), array('pipe','w'), array('pipe','w')),
    $pipes
    );
    var_dump($pipes);
    if (isset($stdin))
    {
    fwrite($pipes[0],$stdin);
    }
    fclose($pipes[0]);

    stream_set_timeout($pipes[1], 0);
    stream_set_timeout($pipes[2], 0);

    $stdout = '';

    $start = microtime();

    while ($data = fread($pipes[1], 4096))
    {
    $meta = stream_get_meta_data($pipes[1]);
    if (microtime()-$start>$timeout) break;
    if ($meta['timed_out']) continue;
    $stdout .= $data;
    }

    $stdout .= stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    $return = proc_close($proc);

    return array(
    'stdout' => $stdout,
    'stderr' => $stderr,
    'return' => $return
    );
    }

    关于PHP 进程执行超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5309900/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com