是否可以在运行时将exec'输出存储到会话变量中以查看它的当前进度?
示例:
的index.php
<?php exec ("very large command to execute", $arrat, $_SESSION['output']); ?>
follow.php
<php echo $_SESSION['output']); ?>
所以,当我运行index.php时,我可以关闭页面并导航到follow.php并在每次刷新页面时按照命令的输出进行操作。
答案 0 :(得分:1)
不,因为exec
等待生成的进程在返回之前终止。但是应该可以使用proc_open
,因为该函数将生成的进程的输出作为流提供,而不是等待它终止。因此,在宽泛的条件下,您可以这样做:
proc_open
生成进程并将其输出重定向到管道。stream_select
来查看是否有要读取的输出;当有。时,用适当的流函数读取它。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