0

Is is possible to store an exec' output into a session variable while its running to see it's current progress?

example:

index.php

<?php exec ("very large command to execute", $arrat, $_SESSION['output']); ?>

follow.php

<php echo $_SESSION['output']); ?>

So, when i run index.php i could close the page and navigate to follow.php and follow the output of the command live everytime i refresh the page.

4

3 回答 3

1

不,exec将运行到完成,然后才会将结果存储在会话中。

您应该运行一个直接写入文件的子进程,然后在浏览器中读取该文件:

$path = tempnam(sys_get_temp_dir(), 'myscript');
$_SESSION['work_path'] = $path;

// Release session lock
session_write_close();

$process = proc_open(
    'my shell command',
    [
        0 => ['pipe', 'r'],
        1 => ['file', $path],
        2 => ['pipe', 'w'],
    ],
    $pipes
);

if (!is_resource($process)) {
    throw new Exception('Failed to start');
}

fclose($pipes[0]);
fclose($pipes[2]);
$return_value = proc_close($process);

然后,您follow.php可以只输出当前输出:

echo file_get_contents($_SESSION['work_path']);
于 2013-10-04T14:33:27.953 回答
1

不,因为exec在它返回之前等待生成的进程终止。但是应该可以这样做,proc_open因为该函数将生成的进程的输出作为流提供,并且不等待它终止。因此,从广义上讲,您可以这样做:

  1. 用于proc_open生成进程并将其输出重定向到管道。
  2. stream_select在某种循环中使用以查看是否有输出要读取;如果有,请使用适当的流函数读取它。
  3. 每当读取输出时,调用session_start,将其写入会话变量并调用session_write_close。这是标准的“会话锁舞”,它允许您的脚本更新会话数据,而无需一直锁定它们。
于 2013-10-04T14:30:04.807 回答
0

不,您不能以这种方式实现监视。

我建议您使用文件从 index.php 中填充状态,并从 follow.php 中的文件中读取状态。作为文件的替代品,您可以使用 Memcache

于 2013-10-04T14:33:03.947 回答