Загрузка больших файлов на сервер через HTTP, клиентская часть

DeadMorozBLR

Новичок
Загрузка больших файлов на сервер через HTTP, клиентская часть

Есть задача с помощью скрипта загружать большие файлы (до 500МБ) через веб-форму. Zend_Http_Client, к примеру, умеет загружать файлы, но при этом хранит содержимое файлов в памяти (использует file_get_contents()), соответственно, не подходит.

Существуют ли для этого готовые решения?

P.S. серверную часть поменять нельзя (в частности, загружать файлы по FTP), т.к. это сторонний файловый хостинг.
 

N3K

Новичок
fsockopen вроде позволяет по частям считывать ответ.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
DeadMorozBLR
существуют решения на AIR, JAVA и просто десктопные приложения
 

DeadMorozBLR

Новичок
@grigori: спасибо, но речь идет конкретно о готовой реализации HTTP-клиента на PHP, способного загружать большие файлы по методу POST в потоковом режиме.

Zend_Http_Client — это самое близкое к тому, что я имею ввиду, за исключением того, что он загружает содержимое файла в оперативную память.
 

DeadMorozBLR

Новичок
Спасибо, поставил. Первый ответ по существу!

Насколько я понимаю, там класс HTTP_Request2_MultipartBody инкапсулирует в себе все данные запроса, в т.ч. и указатели на файлы, и позволяет HTTP-клиенту читать из него данные в виде потока и передавать на сервер.

Попробую Zend_Http_Client с адаптером curl или просто curl, чтобы замного не переписывать, а дальше Ваше решение попробую.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
DeadMorozBLR
да ты мастер точных формулировок
 

Viktor_Rez

Новичок
PHP вроде как ориентирован на отдачу данных. Приёмом 500 меговых (охренеть) занимается протокол FTP!
 

Wicked

Новичок
еще один :)
про прием файлов тут речи не идет :)

да и фтп ваш устарел уже много лет назад
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: DeadMorozBLR
Попробую Zend_Http_Client с адаптером curl...
Не поможет, Zend'овские гении всё равно грузят все файлы целиком в память.

Так что рекомендуется либо голый Curl, либо HTTP_Request2 с адаптером Socket. HTTP_Request2 с адаптером Curl может иметь проблемы из-за бага в PHP'шном Curl'e.
 

DeadMorozBLR

Новичок
HTTP_Request2 с адаптером Socket прокатил. Однако есть проблема с таймаутом ответа сервера: после загрузки большого файла сервер, видимо, пытается куда-то его скопировать и задерживает ответ на некоторое время. При этом получаем исключение
Код:
HTTP_Request2_Exception: Request timed out after 0 second(s)
, что само по себе странно. Увеличение таймаута в конфигурации запроса, кажется, решает проблему.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: DeadMorozBLR
HTTP_Request2 с адаптером Socket прокатил. Однако есть проблема с таймаутом ответа сервера: после загрузки большого файла сервер, видимо, пытается куда-то его скопировать и задерживает ответ на некоторое время. При этом получаем исключение
Код:
HTTP_Request2_Exception: Request timed out after 0 second(s)
, что само по себе странно. Увеличение таймаута в конфигурации запроса, кажется, решает проблему.
По ходу PHP сам какой-то таймаут ставит, а в адаптере таймаут проверяется при помощи stream_get_meta_data() даже если сами мы его не указывали... Да, надо бы по крайней мере сообщение об ошибке поправить.
 

DeadMorozBLR

Новичок
За одно стоило бы переименовать поле $timeout адаптера во что-нибудь типа $timeout_timestamp, то есть временная метка, по достижении которой запрос считается просроченным. Иначе получается путаница с одноименным параметром конфигурации.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Sad Spirit
По ходу PHP сам какой-то таймаут ставит, а в адаптере таймаут проверяется при помощи stream_get_meta_data() даже если сами мы его не указывали... Да, надо бы по крайней мере сообщение об ошибке поправить.
Для будущих поколений, пользующихся поиском: в PHP есть (стопицотый) конфигурационный параметр default_socket_timeout, по умолчанию равный 60 секундам.
 
Сверху