У меня есть этот код, в котором у меня есть список удаленных файлов (например, изображений) для загрузки с использованием 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 и получать его каждые n секунд с помощью ajax, чтобы знать, сколько файлов были загружены до этого момента). Для этого я добавил функцию "curl_progress_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);
Однако я был бы признателен, если кто-то знает лучшее решение ...