2013-12-16 3 views
1

Я использую скрипт для получения файлов с моего сервера. Я использую aria2 для быстрой загрузки файлов, и он отлично работает, но есть способ, когда скрипт работает для вывода того, что происходит в команде.PHP shell_exec обновляет выходные данные при запуске скрипта

Например, при выполнении этой команды вы получаете обновления каждые несколько секунд с помощью командной строки

$output = shell_exec('aria2c http://myserver.com/myfile.rar'); 
echo "<pre>$output</pre>"; 

Я получаю эти выходы:

[#f6a7c4 9.5MiB/1.7GiB(0%) CN:15 SD:5 DL:431KiB ETA:1h9m9s] 

[#f6a7c4 52MiB/1.7GiB(2%) CN:23 SD:7 DL:0.9MiB ETA:30m19s] 

[#f6a7c4 141MiB/1.7GiB(8%) CN:26 SD:4 DL:1.7MiB ETA:15m34s] 

Скрипт только показывает мне эти данные один раз он завершил выполнение, что может быть до 5 + минут, поэтому я хотел бы знать, что происходит, если это возможно?

Ive пытался добавить следующее:

ob_start(); 
--Get URL for Files and show URL on screen 
ob_flush(); 
--Start downloading file 
ob_flush(); 

Благодаря

ответ

2

Вам необходимо открыть дескриптор процесса дескриптора для чтения асинхронного с proc_open() и читать из этого потока с помощью stream_get_contents().

Ваш инструмент для загрузки сбрасывает прогресс с помощью символа \r в конце, который перезаписывает фактическую строку, потому что нет следующего \n символа новой строки.

http://www.php.net/manual/en/function.proc-open.php

Пожалуйста, обратитесь к этим функциям, чтобы найти примеры кода на php.net или Google.

2

Вы должны лучше использовать proc_open, вместо shell_exec() ...:

<?php 
    $cmd = 'wget http://192.168.10.30/p/myfile.rar'; 
    $pipes = array(); 
    $descriptors = array(
     0 => array("pipe", "r"), 
     1 => array("pipe", "w"), 
     2 => array("pipe", "w"), 
    ); 
    $process = proc_open($cmd, $descriptors, $pipes) or die("Can't open process $cmd!"); 

    $output = ""; 
    while (!feof($pipes[2])) { 
     $read = array($pipes[2]); 
     stream_select($read, $write = NULL, $except = NULL, 0); 
     if (!empty($read)) { 
      $output .= fgets($pipes[2]); 
     } 
     # HERE PARSE $output TO UPDATE DOWNLOAD STATUS... 
     print $output; 
    } 
    fclose($pipes[0]); 
    fclose($pipes[1]); 
    fclose($pipes[2]); 
    proc_close($process); 
    ?> 

UPDATE: Да, извините, исправил пару ошибок ... :-(

И, быть уверенный исполняемый файл «aria2» находится в вашей среде php PATH ... Чтобы быть в безопасности, вы должны указать полный путь в своей системе ...

+0

получить довольно много ошибок при попытке запустить это – Exoon

+0

Предупреждение: FeO f() ожидает, что параметр 1 будет ресурсом, null указан в /var/www2/html/download.php в строке 9 Предупреждение: stream_select(): предоставленный аргумент не является допустимым ресурсом потока в/var/www2/html/download.php в строке 11 Предупреждение: stream_select() [function.stream-select]: в строке /var/www2/html/download.php не переданы потоковые массивы Предупреждение: fread() ожидает параметр 1 быть ресурсом, null указан в /var/www2/html/download.php в строке 13 – Exoon

+0

Yse, извините, только что обновленный ответ, он должен работать, теперь ... – MarcoS

Смежные вопросы