Php 进展函数与旋度多重

Php 进展函数与旋度多重,php,curl,progress-bar,curl-multi,Php,Curl,Progress Bar,Curl Multi,我有一段代码,其中有一个远程文件列表,例如要使用multi-curl下载的图像: $urls = array('http://www.google.com/images/nav_logo82.png', 'http://static.php.net/www.php.net/images/php.gif'); function curl_progress_callback($a=0,$b=0,$c=0, $d=0) { /* ?? */ } $save_to='./publ

我有一段代码,其中有一个远程文件列表,例如要使用multi-curl下载的图像:

$urls = array('http://www.google.com/images/nav_logo82.png', 'http://static.php.net/www.php.net/images/php.gif');

function curl_progress_callback($a=0,$b=0,$c=0, $d=0)  {
    /*   ??    */
}

$save_to='./public/images/';

$conn = array();
$fp = array();
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
    $g=$save_to.basename($url);
    if(!is_file($g)){
        $conn[$i]=curl_init($url);
        $fp[$i]=fopen ($g, "wb");
        curl_setopt ($conn[$i], CURLOPT_FILE, $fp[$i]);
        curl_setopt ($conn[$i], CURLOPT_HEADER ,0);
        curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
        curl_setopt ($conn[$i], CURLOPT_MAXCONNECTS, 10);
        curl_setopt($conn[$i], CURLOPT_NOPROGRESS, false);
        curl_setopt($conn[$i], CURLOPT_PROGRESSFUNCTION, 'curl_progress_callback');
        curl_multi_add_handle ($mh,$conn[$i]);
    }
}
do {
    $n=curl_multi_exec($mh,$active);
}
while ($active);
foreach ($urls as $i => $url) {
    curl_multi_remove_handle($mh,$conn[$i]);
    curl_close($conn[$i]);
    fclose($fp[$i]);
}
curl_multi_close($mh);
问题是我想制作一些进度条,所以php应该给我关于下载进度的信息。例如,我希望有一个计数器,每次文件下载完成后,计数器都会增加一个,那么在.txt文件上编写这个计数器并使用ajax每n秒检索一次,就很容易知道在那一刻之前下载了多少文件。为此,我附加了函数curl\u progress\u callback,但是我不知道在它里面放什么来做我想做的事情

编辑:最后我用一个小功能实现了这一点

function define_progress_callback($i) {
    global $conn;
    $flag = 1;
    curl_setopt($conn[$i], CURLOPT_PROGRESSFUNCTION, function ($a=0,$b=0,$c=0,$d=0) use($i, &$flag)  {
        if($b != 0 && $flag != 0 && $b/$a == 1) {
            /* Put here the code to execute every time that a download finishes */
            $flag = 0;
        }
    });
}



$save_to='./public/images/';

$conn = array();
$fp = array();
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
    $g=$save_to.basename($url);
    $conn[$i]=curl_init($url);
    $fp[$i]=fopen ($g, "wb");
    curl_setopt ($conn[$i], CURLOPT_FILE, $fp[$i]);
    curl_setopt ($conn[$i], CURLOPT_HEADER ,0);
    curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
    curl_setopt ($conn[$i], CURLOPT_MAXCONNECTS, 10);
    curl_setopt($conn[$i], CURLOPT_NOPROGRESS, false);
    define_progress_callback($i);
    curl_multi_add_handle ($mh,$conn[$i]);
}
do {
    $n=curl_multi_exec($mh,$active);
}
while ($active);
foreach ($urls as $i => $url) {
    curl_multi_remove_handle($mh,$conn[$i]);
    curl_close($conn[$i]);
    fclose($fp[$i]);
}
curl_multi_close($mh);
不过,如果有人知道更好的解决方案,我将不胜感激。

请参见