2015-05-05 2 views
0

Я загружаю файл с использованием cURL 7.38.0 с php 5.6, и я хотел бы получить ход загрузки. Это мой код:php cURL progress function limit limit

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "http://path/to/file.zip"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_BUFFERSIZE, 65536); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'downloadProgress'); 
curl_setopt($ch, CURLOPT_NOPROGRESS, false); 

curl_exec($ch); 
curl_close($ch); 

function downloadProgress ($resource, $download_size, $downloaded_size, $upload_size, $uploaded_size) { 
    echo 'download_size: ' . $download_size . '; downloaded_size: ' . $downloaded_size . ';<br>'; 
} 

Все отлично работает большую часть времени, за исключением того, если файл больше 2 Гб, то $download_size возвращается -2147483648 и $downloaded_size работает до тех пор, пока не доберется до 2147483648, а также обращается к -2147483648 и прекращает увеличиваться.

Выход с файлом 3,4 ГБ является следующее:

download_size: 0; downloaded_size: 0; 
download_size: -2147483648; downloaded_size: 1147; 
download_size: -2147483648; downloaded_size: 1147; 
download_size: -2147483648; downloaded_size: 16987; 
download_size: -2147483648; downloaded_size: 16987; 
download_size: -2147483648; downloaded_size: 25627; 
... 
download_size: -2147483648; downloaded_size: -2147483648; 
download_size: -2147483648; downloaded_size: -2147483648; 
download_size: -2147483648; downloaded_size: -2147483648; 

Есть ли что-то я сделал не так или это ограничение PHP Curl?

спасибо.

+0

Поместите весь код функции 'downloadProgress()', это, скорее всего, означает, что переменная, в которой хранится размер загрузки, является регулярным «знаковым целым числом», то есть от 2^32 до -2^32, см. Это http://stackoverflow.com/questions/13657630/curlopt-progressfunction-what-these-parameters-mean и этот http://stackoverflow.com/questions/22417507/in-my-curl-curlopt-progressfunction-callback-dltotal -is-always-0 по аналогичным проблемам – bodi0

+0

Похоже, что максимальный размер представляет собой 32-битное целое число. –

+0

Также хороший вариант альтернативы curl для обратного вызова прогресса, см. Здесь http://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html – bodi0

ответ

0

Тип аргумента функции CURLOPT_PROGRESSFUNCTION double, поэтому, вероятно, вы выбрали это значение для int в вашем коде. и, вероятно, поскольку ваша os - 32-битная архитектура, вы переполняете предел размера int. Я бы предложил вам пересмотреть свой код, чтобы избежать кастинга до больших двоичных чисел.

+0

Никакой бросок не выполняется. Я обновил свой пост на примере. –

+0

Является ли var_dump на $ download_size одинаковым? – maalls

+0

Вывод: 'int (-2147483648)' –