[PHP, CURL] Задержка отдачи файла юзеру.

123
Robin_Bad
На сайте с 24.12.2007
Offline
85
#11

как написали выше, нужно делать через сокеты, CURL вам не поможет. а то, что удалось "достигнуть цели" - простое совпадение. суть в том, что при скачивании файла посредством CURL, он сначала ЦЕЛИКОМ будет загружен вам на сервер и только потом начнёт отдаваться пользователю. вам же нужно, насколько я понял, "прозрачно пробрасывать" файл через свой сервер.

P.S. да и вообще, если вы файлом не проделываете никаких манипуляций, можно просто сделать проксирование в Apache или nginx, смотря что у вас там стоит. так будет проще и менее накладно по ресурсам.

DavyJohnes
На сайте с 05.01.2011
Offline
84
#12
Robin_Bad:
как написали выше, нужно делать через сокеты, CURL вам не поможет. а то, что удалось "достигнуть цели" - простое совпадение. суть в том, что при скачивании файла посредством CURL, он сначала ЦЕЛИКОМ будет загружен вам на сервер и только потом начнёт отдаваться пользователю. вам же нужно, насколько я понял, "прозрачно пробрасывать" файл через свой сервер.

P.S. да и вообще, если вы файлом не проделываете никаких манипуляций, можно просто сделать проксирование в Apache или nginx, смотря что у вас там стоит. так будет проще и менее накладно по ресурсам.

Конечно организовать прокси посредством веб-сервера было бы проще, однако с файлом как раз таки необходимо проделать несколько манипуляций (переименовать, обрезать и мб еще что то). Смею попросить Вас изложить поподробнее, что за совпадение произошло при проведении тестов? Я пробовал с разными файлами на разных серверах, результат везде такой какой мне нужен, а именно файл минует внутренний буфер, и все это время использовался именно curl (уж очень я его полюбил с самой первой встречи).

https://handy-tools.io (https://handy-tools.io) - Набор полезных утилит для всех!
siv1987
На сайте с 02.04.2009
Offline
427
#13
Robin_Bad:
он сначала ЦЕЛИКОМ будет загружен вам на сервер и только потом начнёт отдаваться пользователю

Не совсем так - http://php.net/manual/ru/function.curl-setopt.php RETURNTRANSFER

Robin_Bad:
P.S. да и вообще, если вы файлом не проделываете никаких манипуляций, можно просто сделать проксирование в Apache или nginx, смотря что у вас там стоит. так будет проще и менее накладно по ресурсам.

Можно пример проксирования на апаче?

DavyJohnes
На сайте с 05.01.2011
Offline
84
#14
siv1987:
Не совсем так - http://php.net/manual/ru/function.curl-setopt.php RETURNTRANSFER


Можно пример проксирования на апаче?

1 вариант: mod_proxy, mod_proxy_http. Директивы ProxyReverse, ProxyPass и т.д.

2 вариант: тривиальный прокси можно организовать с помощью rewrite (флаг [P])

beginerx
На сайте с 13.07.2009
Offline
173
#15

видел на perl покусочного скачивания, обработки, отдачи да еще с индикаторами прогресса на клиенте.

проверка показала что на шаредном хостинге Netfirms фишка работает. Дело в perl, он просто круче! :)

>>>Скорость и Реакция<<< (https://vk.com/app4629907 ): онлайн тренировка скорости и времени реакции.... (https://vk.com/app4612117 )... (https://vk.com/club18740762 ).
Robin_Bad
На сайте с 24.12.2007
Offline
85
#16
siv1987:
Не совсем так - http://php.net/manual/ru/function.curl-setopt.php RETURNTRANSFER


Можно пример проксирования на апаче?

Флаг CURLOPT_RETURNTRANSFER влияет лишь на то, что контент будет возвращён в качестве результата вызова функции curl_exec() вместо вывода его на экран. На принцип работы это никак не влияет.

А про проксирование вам в принципе выше уже ответили.

siv1987
На сайте с 02.04.2009
Offline
427
#17
Robin_Bad:
Флаг CURLOPT_RETURNTRANSFER влияет лишь на то, что контент будет возвращён в качестве результата вызова функции curl_exec() вместо вывода его на экран. На принцип работы это никак не влияет.

Как раз на "принцип работы" и влияет. Он так и так возвращается результатом curl_exec, только в одном случае буферизируется, в другом отдается сразу.

beginerx
На сайте с 13.07.2009
Offline
173
#18

нет, судя по описанию, всегда буфферизируется, но в первом случае

в память, и свопированием занимается система, а во втором

в памяти небольшие куски которые сбрасываются на диск по мере

поступления. Только вот callback на эти куски по готовности НЕТ,

а в perl ЕСТЬ.

(хотя какие-то хаки и доп софт для исправления ситуации все же есть для php)

siv1987
На сайте с 02.04.2009
Offline
427
#19

Не знаю как по описанию, но практика показывает другое.

Пруф линк?

Robin_Bad
На сайте с 24.12.2007
Offline
85
#20
siv1987:
Как раз на "принцип работы" и влияет. Он так и так возвращается результатом curl_exec, только в одном случае буферизируется, в другом отдается сразу.

Откуда вы это взяли? При неустановленном CURLOPT_RETURNTRANSFER curl_exec() весь вывод выплёвывает на экран, а сама функция возвращает true либо false в зависимости от успеха/неудачи выполнения. При установленном CURLOPT_RETURNTRANSFER, функция ничего не выводит на экран, но возвращает своим результатом полученный контент.

Впрочем, чуть другими словами написано в официальной документации:

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Однако, если установлена опция CURLOPT_RETURNTRANSFER, при успешном завершении будет возвращен результат, а при неудаче - FALSE.

Про буферизацию там кстати ни слова не сказано. Но я проверял - чудес не бывает.

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий