将php exec存储在会话变量中
运行时是否可以将exec的输出存储到会话变量中以查看其当前进度 例如: index.php将php exec存储在会话变量中,php,session,terminal,command,exec,Php,Session,Terminal,Command,Exec,运行时是否可以将exec的输出存储到会话变量中以查看其当前进度 例如: index.php <php echo $_SESSION['output']); ?> follow.php <php echo $_SESSION['output']); ?> 因此,当我运行index.php时,我可以关闭页面并导航到follow.php,并在每次刷新页面时跟踪命令live的输出。否,因为exec等待生成的进程在返回之前终止。但是应该可以使用,因为该函数以流的形式提供派
<php echo $_SESSION['output']); ?>
follow.php
<php echo $_SESSION['output']); ?>
因此,当我运行index.php时,我可以关闭页面并导航到follow.php,并在每次刷新页面时跟踪命令live的输出。否,因为
exec
等待生成的进程在返回之前终止。但是应该可以使用,因为该函数以流的形式提供派生进程的输出,并且不等待它终止。用布罗德的话说,你可以这样做:
proc\u open
生成进程并将其输出重定向到管道session\u start
,将其写入会话变量并调用session\u write\u close
。这是允许脚本更新会话数据而无需始终锁定会话数据的方法不,你不能用这种方式实现观看 我建议您使用文件从index.php填充状态,并从follow.php中的文件读取状态。
作为文件的替代方案,您可以使用Memcache否,
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']);