2013-10-04 3 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']); 
Смежные вопросы