Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将php exec存储在会话变量中_Php_Session_Terminal_Command_Exec - Fatal编程技术网

将php exec存储在会话变量中

将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等待生成的进程在返回之前终止。但是应该可以使用,因为该函数以流的形式提供派

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

例如:

index.php

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