【问题标题】:Store php exec in a session variable将 php exec 存储在会话变量中
【发布时间】:2013-10-11 14:21:33
【问题描述】:

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

示例:

index.php

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

follow.php

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

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

【问题讨论】:

    标签: php session terminal command exec


    【解决方案1】:

    不,因为exec 在返回之前等待生成的进程终止。但是应该可以使用proc_open,因为该函数将生成的进程的输出作为流提供,并且不等待它终止。所以从广义上讲,你可以这样做:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        不,你不能以这种方式实现监视。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-06
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多