2013-10-04 76 views
0

可以將exec'輸出存儲到會話變量,而其運行時查看它的當前進度?將php exec存儲在會話變量中

例如:

的index.php

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

follow.php

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

所以,當我的index.php運行我可以關閉該頁面,並導航到follow.php並按照live命令的輸出每次我刷新頁面。

回答

1

不,因爲exec在返回之前等待產生的進程終止。但是應該可以使用proc_open,因爲該函數將生成的進程的輸出作爲流提供,並且不會等待它終止。因此,你可以這樣做:

  1. 使用proc_open產生一個進程並將其輸出重定向到管道。
  2. 在某種循環內使用stream_select來查看是否有輸出讀取;如果有適當的流功能,請閱讀它。
  3. 無論何時讀取輸出,請致電session_start,將其寫入會話變量並調用session_write_close。這是standard "session lock dance",它允許您的腳本更新會話數據,而無需一直鎖定它們。
0

不,你不能以這種方式實現觀看。

我建議你使用文件從index.php填充狀態,並從follow.php文件讀取狀態。 作爲文件的替代方法,您可以使用Memcache

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