将php exec存储在会话变量中

时间:2013-10-04 14:24:29

标签: php session terminal command exec

是否可以在运行时将exec'输出存储到会话变量中以查看它的当前进度?

示例:

的index.php

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

follow.php

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

所以,当我运行index.php时,我可以关闭页面并导航到follow.php并在每次刷新页面时按照命令的输出进行操作。

3 个答案:

答案 0 :(得分:1)

不,因为exec等待生成的进程在返回之前终止。但是应该可以使用proc_open,因为该函数将生成的进程的输出作为流提供,而不是等待它终止。因此,在宽泛的条件下,您可以这样做:

  1. 使用proc_open生成进程并将其输出重定向到管道。
  2. 在某种循环中使用stream_select来查看是否有要读取的输出;当有。时,用适当的流函数读取它。
  3. 每当读取输出时,请调用session_start,将其写入会话变量并调用session_write_close。这是standard "session lock dance",它允许您的脚本更新会话数据,而无需一直锁定它们。

答案 1 :(得分: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']);

答案 2 :(得分:0)

不,你不能以这种方式实施观看。

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