Логотип   Простое и понятное управление
  Уникальные возможности по настройке
  Open Server скачали уже 1 398 549 раз!

Форум

Добро пожаловать, Гость!

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

Обсуждение проблем в работе программного комплекса
Vitas
Сообщения: 6
C нами: 2 мес

Непрочитанное сообщение Vitas » 14 окт 2017, 12:41

$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, никаких проблем с передачей больших файлов этим же скриптом не возникает.

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

Аватара пользователя
Максим
Сообщения: 5216
C нами: 7 лет
Контакты:

Непрочитанное сообщение Максим » 16 окт 2017, 12:32

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

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

Vitas
Сообщения: 6
C нами: 2 мес

Непрочитанное сообщение Vitas » 16 окт 2017, 12:46

Максим, спасибо.
Нет, не на него. Но тоже думаю что на сервера гугла.

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

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

Аватара пользователя
Максим
Сообщения: 5216
C нами: 7 лет
Контакты:

Непрочитанное сообщение Максим » 16 окт 2017, 13:03

CURLOPT_BUFFERSIZE пробовали?

Vitas
Сообщения: 6
C нами: 2 мес

Непрочитанное сообщение Vitas » 16 окт 2017, 13:08

CURLOPT_BUFFERSIZE не использовал, но, callback-функции также не использую.

Vitas
Сообщения: 6
C нами: 2 мес

Непрочитанное сообщение Vitas » 19 окт 2017, 10:18

Доброго утра. Все еще не решил проблему к сожалению.

Vitas
Сообщения: 6
C нами: 2 мес

Непрочитанное сообщение Vitas » 22 окт 2017, 09:57

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

Аватара пользователя
Максим
Сообщения: 5216
C нами: 7 лет
Контакты:

Непрочитанное сообщение Максим » 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 и т.д. прикручивать.

Vitas
Сообщения: 6
C нами: 2 мес

Непрочитанное сообщение Vitas » 24 окт 2017, 17:39

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


Вернуться в «Ошибки Open Server»

Кто сейчас на конференции

Сейчас этот форум просматривают: relax и 3 гостя