繁体   English   中英

将php exec存储在会话变量中

[英]Store php exec in a session variable

可以在执行程序运行时将其输出存储到会话变量中以查看其当前进度吗?

例:

index.php

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

follow.php

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

因此,当我运行index.php时,我可以关闭页面并导航至follow.php,并在每次刷新页面时实时跟踪命令的输出。

不可以,因为exec等待生成的进程终止,然后返回。 但是应该可以使用proc_open因为该函数以流的形式提供生成的进程的输出,而不必等待它终止。 因此,用长话来说,您可以执行以下操作:

  1. 使用proc_open产生一个进程并将其输出重定向到管道。
  2. 在某种循环中使用stream_select来查看是否有要读取的输出。 如果有的话,使用适当的流函数读取它。
  3. 每当读取输出时,请调用session_start ,将其写入会话变量,然后调用session_write_close 这是标准的“会话锁定舞动” ,它允许您的脚本更新会话数据而无需始终锁定它们。

否, 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']);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM