Я загружаю файл, используя cURL 7.38.0 с php 5.6, и я хотел бы получить прогресс загрузки. Это мой код:
$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?
Спасибо.
Тип аргумента функции CURLOPT_PROGRESSFUNCTION имеет двойной тип, поэтому вы, вероятно, приводите эти значения к int где-то в вашем коде. и, вероятно, поскольку ваша ОС является 32-битной архитектурой, вы переполняете ограничение размера int. Я бы посоветовал вам пересмотреть код, чтобы не приводить к большим двоичным числам.
Других решений пока нет …