2013-12-16 19 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分鐘以上,所以如果可能的話我想知道最新進展情況?

香港專業教育學院嘗試添加以下內容:

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

感謝

回答

2

您需要打開一個過程描述符句柄與proc_open() asyncronously閱讀和使用本stream_get_contents()流中讀取。

您下載的工具用\r字符結尾刷新進度,這會覆蓋實際行,因爲沒有以下\n新行字符。

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

請參閱這些功能來找到php.net或谷歌的代碼示例。

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注意:stream_select():提供的參數不是/ var/www2/html /目錄中的有效流資源。第11行的download.php 警告:stream_select()[function.stream-select]:沒有流數組通過/var/www2/html/download.php在第11行 警告:fread()期望參數1資源,null在/var/www2/html/download.php在線13 – Exoon

+0

Yse,對不起,剛更新的答案,它應該工作,現在... – MarcoS