Страница 1 из 1

CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 14 окт 2017, 12:41
Vitas
$fp = fopen($file, 'r');
curl_setopt($ch, CURLOPT_INFILE, $fp);
 curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
Использую OpenServer 5.2.7 x64 на Windows 10 x64, модуль Apache 2.4 x64, php 5.6 x64

Загружаю файл на зарубежный сервер (находящийся в интернете) методом PUT.

После загрузки от сервера в ответе получаю [bytesTransferred] => 2147221504, [bytesTotal] => 2822977103

То есть, из почти 3-х гб файла передается только 2 гб.

Использование curl_setopt($ch, CURLOPT_RESUME_FROM, $start_upload_from_bytes); не помогает


При этом, на другом локальном сервере, запущенном на MacOS, никаких проблем с передачей больших файлов этим же скриптом не возникает.

Пожалуйста, помогите мне решить эту проблему.

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 16 окт 2017, 12:32
Максим
Попробуйте дополнить свой скрипт примерами отсюда: https://github.com/Danack/Youtube-Autou ... beCurl.php

И добавьте на всякий случай:
curl_setopt($ch, CURLOPT_TIMEOUT, 10000 );

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 16 окт 2017, 12:46
Vitas
Максим, спасибо.
Нет, не на него. Но тоже думаю что на сервера гугла.

Просмотрел код - кажется, не заметил чего-то вспомогательного.

Когда я указываю
curl_setopt($ch, CURLOPT_RESUME_FROM, $start_upload_from_bytes)
($start_upload_from_bytes = 2147221504), то от сервера не приходит никакого ответа (в т.ч. нет заголовков) - думаю, fopen не хочет читать файл начиная с этого байта.

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 16 окт 2017, 13:03
Максим
CURLOPT_BUFFERSIZE пробовали?

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 16 окт 2017, 13:08
Vitas
CURLOPT_BUFFERSIZE не использовал, но, callback-функции также не использую.

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 19 окт 2017, 10:18
Vitas
Доброго утра. Все еще не решил проблему к сожалению.

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 22 окт 2017, 09:57
Vitas
Пожалуйста, помогите мне разобраться в этой ситуации.

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 24 окт 2017, 02:35
Максим
Попробуйте в конфиге php увеличьте раза в 2 параметр memory_limit и убедитесь что у вас +1 ГБ имеется в запасе на машине.

В скрипт добавьте такое:
set_time_limit(0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000 );
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
и возможно уберите параметр
curl_setopt($ch, CURLOPT_UPLOAD, true);
он вроде как нужен при загрузке по http POST, а не CURLOPT_PUT, хотя может это и не так.

Может что-то поможет. Заодно попробуйте на PHP 7.1. А вообще я поискал на эту тему в сети, оказывается был такой баг в Curl (в Windows системах невозможно было работать с файлами более 2gb), но это для 32 битной версии curl и исправили этот баг еще в 2016 году. Поэтому ниже чем php 5.6 версию не пробуйте даже.

Ну а докачка в вашем скрипте не работает скорее всего потому, что там нужно Accept-Ranges, Content-Range и т.д. прикручивать.

Re: CURL-загрузка файлов на сервер размером более 2-х ГБ

Добавлено: 24 окт 2017, 17:39
Vitas
Большое спасибо.
php использую с самого начала 5.6 x64.
Но, от сервера все равно приходит ответ ..."status":"IN_PROGRESS","bytesTransferred":2147221504,"bytesTotal":2822977118...
То есть, функцией fopen читается именно это определенное количество байтов.