Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
вот работал мой сайт медленно, теперь быстро. теперь я прекрасно вижу что пока из гигабайтного файла мозила закачала 200мб, скрипт на сервере уже выдал весь гигабайт. (выдача файла исключительно скриптом) оперативка седеться вся на это время на сервере, ну и из 3 закачек две оборвались - тоесть как бы файл мозила получила но не весь. вот и возникает вопрос. А можно ли както на пхп узнать, не стоит ли притормозить с выводом. что будет если будет сразу 10 человек качать большие файлы, пхп код будет их шутро выдавать, но сеть не успеет передавать это всё. или же при достижении предела буффера, пхп скрипты просто замрут на очередной команде эхо, пока не освободиться место для вывода. кто что может сказать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 23:32 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Вообще то, вопросы скорости передачи решаются где-то на уровне протокола передачи данных. alex564657498765453из гигабайтного файла мозила закачала 200мб, скрипт на сервере уже выдал весь гигабайт.Не много ли под буферы выделено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2013, 00:37 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, отдавать такие большие файлы через пхп - плохая идея. никаких ресурсов нехватит. выгружайте их в каталог, формируйте временную ссылку и отдавайте пользователю. пусть отдачей контента занимается сам вебсервер. он изначально заточен пож это. поддерживает докачку, меньше тратит ресурсов и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2013, 05:42 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
r u, так ябы и выдавал большие файлы на прямую - если бы они существовали :) этот файл формируеться пхп, его ни по частям ни иным способом не существует в природе. можно конечно сначала сделать сборку - но этот процес для гигабайтных файлов(а файл может быть и 50 гигов) это минуты а то и больше. пользователю не прикольно ждать будет. может можно както подстроиться на пхп к отдаче... ну както контролировать размер данных в буфере или ещо какой способ, чтоб замедлить работу свою и "подождать" пока данные из буфера уйдут в сеть пользователю. ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2013, 14:03 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Что значит "выдавать" ? Как вы его выдаете? Выдавайте порциями, после каждой очищайте буфер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2013, 00:48 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Electric200, ты наверно можешь подсказать что-то дельное, но не понял суть проблемы. представь себе что у меня файл на 50 гигов храниться в паке кусками по 10 метров. я пишу скрипт выдающий этот файл - 1)делаем хидеры 2)в цикле от первого до последнего кусочка - риид_файл(нужный кусочек) вопрос - с какой скоростью будет выдача данных скриптом??? посути скоростьлимитирующим фактором сдесь будет скорость чтения с шдд. это гдето 50 мб в секунду. но то тчо пхп выдал за первую секунду 50мб, не означает что за первую секунду юзер их получил. сеть столько не пропустит. вот и получаем вопрос, а где же будут храниться данные , которые уже "вышли" из пхп(попали в стдаут) но ещо не ушли в сеть. они будут в буфере. итого получаем, что при быстром чтении с шдд, и медленой сети - а это стандартная ситуация, му кучу данных пишем в буфер, который в оперативку не помещаеться, и естествено валиться в свап - тоест обратно пишеться на шдд. и если говорить не о одном файле в 50 гектар, а о файлак пускай даже по 50-100мб, но зато одновременых запросах несколько десятков - полуаем что ложиться шдд. так как мы ерундой занимаемся. вот и вопрос, как это правильно решить. вот если мы посылаем в синхроном режиме данные на сокет по 10 метров в цикле. что будет? 10 метров в сокет кидаем, и пока они реально не уйдут, скрипт будет "висеть" на этой команде. тоесть не получиться у нас никогда что скрипт выдал уже гектар, а удалёный узел получил только 40метров. вот подобное, или может ещо както можно с выводом юзеру файла сделать??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 02:58 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Ну во-первых убедитесь, что у вас на фронтэнде нету нджинкса, который проксирует запросы на апач (если есть, то следует произвести доп. настройки нджинкса, в частности отключить запись в файл кэшированных данных - proxy_max_temp_file_size, а вообще лучше использовать X-Access-Redirect). по поводу буферов, то я так понимаю все здесь http://www.php.net/ob_start ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 09:52 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
alex564657498765453так как мы ерундой занимаемся.Верно подмечено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 10:12 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Hett вообще лучше использовать X-Access-Redirect). x-accel-redirect ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 10:13 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
vklealex564657498765453так как мы ерундой занимаемся.Верно подмечено. Почему сразу ерундой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 10:15 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Ну как то у вас сильно все мудрено. Гигабайтные файлы формировать на лету, передавать клиенту и с использованием PHP. Забивать гвозди отверткой. И главный недостаток не в PHP, а в том, что вам на прямую не доступен порт/сокет в данном случае с PHP. Вам доступен только STDIN и STDOUT и все что относиться к потокам. Вам скрипт не слушает на прямую порт/сокет входящего соединения, по этому вы очень ограничены в контролировании передачи и не можете даже отследить возможные ошибки. По этому что бы вы не придумали, любой подход будет противоречить технологии. А в худшем случае, скушаються все ресурсы сервера. Мой совет, используйте подход: 1. Создание физического файла и запись на диск , или в буфер 2. Передача работ по скачиванию Web серверу (не важно какому). Ведь он для этого и создан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:59 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
alex564657498765453r u, можно конечно сначала сделать сборку - но этот процес для гигабайтных файлов(а файл может быть и 50 гигов) это минуты а то и больше. пользователю не прикольно ждать будет. ??? Собирайте файл и отдавайте ссылку отложено, самый простой вариант это по клику запускается сборка пользователю говорится что он должен проверить почту и потом на почту приходит ссылка на большой файл. Есть более гибкие способы когда при формировании страницы идет проверка на наличие подготовленных файлов и если они есть то генерится ссылка на файл если нет, то генерится ссылка на заказ файла... дальше все как в предыдущем варианте. Угадывать скорость отдачи данных - это шаманство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 18:09 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Описанный гемор чем лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 18:17 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Hett, тем что за счет асинхронности можно сделать предсказуемую нагрузку на сервер к примеру зашли 100 клиентов потребовали мега-файл если повезет, то файл придется генерировать только один раз, и в любом случае можно незаметно для клиента ограничить количество одновременных генераций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 21:54 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
ну и еще не придется заставлять пользователя ждать начала выдачи данных с открытым браузером ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 22:14 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
alex564657498765453Electric200, ты наверно можешь подсказать что-то дельное, но не понял суть проблемы. представь себе что у меня файл на 50 гигов храниться в паке кусками по 10 метров. Начиная с этого места становится понятно, что автор и не собирается объяснить суть проблемы, а все больше на какихто заоблачных примерах все строит Может хватит описывать на примерах, а пора поделиться задачей как она стоит изначально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 22:28 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Anjey aka PM, Так задача и есть изначальная. мой сервис, это файловый сервис. хитрость в хранении, обусловливается отказоустойчивостью кластера на случай падения нод. Можно конечно все файлы продублировать трижды целиком, упала одна нода, пользователь попадёт на другую, потом на третью. но это дорого. идея и заключаеться в том, чтобы использовать избыточность, которая при минимальном размере(избыточность) обеспечит читаемость файла при отказе (у нас 5 нод одновременно) это значит что файл бёьться на части и хитро (чистая математика, по формуле) раскидываеться на ноды, притом так, что даже если пять нод содержащих свою порцию файла провалиться под землю изза прямого попадания в эти 5 датацентров ядерной ракеты, даных с остальных будет гарантировано достаточно для востановления исходного файла. тоесть, мой сервис, по сути это обычный сервис, где представте себе, файлы тупо лежат на шдд, и мы их выдаём напрямую Нджинксом. а потом решили применить это хитрое кодирование+разбиение+сохранение частей в кластере(группе нод). теперь нджинкс напрямую выдать файл не может, на пхп сделали скрипт, который КСТАТЕ, может сдесь есть лучшее решение.. открывает себе нужные части $part1=fopen('http://node1.site.com/hitrii_storage/75984375439893.part1'); ..... $partN=fopen('http://node5.site.com/hitrii_storage/75984375439893.partN'); и потом простая арифметика. while(file_ne_do_konca) { $original_part = restore_original(fread($part1,4096),....,fread($partN, 4096)); //кусок оригинального файла echo $original_part; } ЗЫ кратенько. изначально презакачивал нужные кусочки цурлом, но это юзер ждёт порой по 25сек начала скачивания, особенно если некоторые ноды отказали и преходиться не одновременно закачивать нужные скажем 10 кусков, а 10 закачек поставили, 3 ошибкой, берём другие 3 (у нас же избыточность). потом пробовал через сокеты, вроде норм, но время реакции оставалось на уровне 2-4с. когда открываю файл вот так, тоесть на удалёной ноде не пхп код выдаёт кусочек, а нджинкс. и удалённая нода меньше тормозит, и фронтальная юзеру начинает выдачу файла порой за 150мс - что очень даже неплохо. при нагрузке на сеть до 500мс . ======== Так вот, когда презакачивал файлы цурлом, то видя что презакачано (а кусочки удаляються сразу после выдачи) наблюдал постоянно. скрипт отработал, тоесть презакачал и поудалял уже кусочки, тем самым выдал 2Гб файл, а я с своим медленым нетом с сервера получил около 120Мб. === сейчас изза отсутсвия презакачек(не совсем понятно почему) фронтальная нода явно всумме медленее обрабатывает файл и выдаёт, но влюбом случае зайдя на ноду по ссх, и wget http://localhost/<uri_for_get_the_file> получаем файл на сокростях 4-5Мбайт/сек юзер естественно скачивает , вот я тестя, гдето 200-до 800 Кб/сек. тобишь актуальным остаёться вопрос, принудительно притормаживать выдачу(сборку) файла, если юзер один чорт не успеет быстрее качать. Плюс планирую кеш сделать, кеш кусочкев по логике.(без деталей) файл из 150 кусочков, юзеры которые его обычно качают качают на скоростях 2мб/сек, все кусочки на близких нодах, а вот два из них на тормознутых, выдающих их с скоростью 50Кб/сек. вот такие два кусочка, которые нам все портят лягут в кеш на той ноде где такая ситуация. На ноде стоящей в хантымансийске, где любители качать данный файл его качают через мобильный интернет на скоростях 20Кб/сек(например) - кешировать проблемные куски не так важно, ибо они сдесь не делают проблему. Этот кешер, пока на уровне идеии, (плюс видеофайлы могут сразу смотря не доконца смотреть...тоесть кусочки первых чанков файла, важны, последних нет). Но в любом случае, как вы правильно заметили, лучшая оптимизация для выдачи файла большого, это выдавать его нджинксом. и правильно подметили, что в пхп не предполагалось решение подобных задач. НО задача стала, и надо найти решение. (варианты напиания на шелле(юникс) чегото вспомогательного и вызов его из пхп, расматриваеться смелло, вплоть до написания несложного кода на си, который низкоуровнево может пообщаться с ОС и выдать нам нужную инфу). ЗЫЗЫ варианты предварительно собирать, это всё весело, но как видно из вышенаписаного, я спецом бился чтоб выдавать юзеру файл через пару сотен мсек. - так что ждать пару минут для сборки - не вариант. ЗЫЗЫЗЫ если подобное можно сделать на другом языке(перл. питон, ноудджес...) предлагайте. задача не стоит сделать на пхп по возможности контроль за реальной отдачей. вопрос стоит сделать контроль реальной отдачи , по возможности на пхп(ибо остальное уже на пхп) - но если прийдёться хоть на двух или трёх языках ещо чтото дописывать, совершенно не проблемма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 13:59 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Anjey aka PMalex564657498765453Electric200, ты наверно можешь подсказать что-то дельное, но не понял суть проблемы. представь себе что у меня файл на 50 гигов храниться в паке кусками по 10 метров. Начиная с этого места становится понятно, что автор и не собирается объяснить суть проблемы, а все больше на какихто заоблачных примерах все строит Может хватит описывать на примерах, а пора поделиться задачей как она стоит изначально. на сервере пока что стоит тестово - max_upload_file_size=50G в будущем, будет клиент способен передавать файл порциями на сервер, а сервер будет уметь принимать, и размер файла который теоритически можно закачать(например копию своего шдд на 750Гб) будет лимитироваться уже совсем другими величинами, квотой юзера и наличием места в кластере. а это уже терабайты , а то и 10ки возможно. спасибо что пытаетесь помочь, но вы подошли стандартно - пытаться найти обходной путь, решив что задача стандартная, а я по глупости пошол в дебри сразу. может упустил чего, но остальные варианты я уже перепробовал - пытаться найти недокументированную возможность в пхп, играясь функциями работы с потоками / сокетами для stdout, не получилось. ну а просто flush() и подобные советы выше - они изначально не подходят - не о том буффере речь. речь о буфере за пределами пхп и по сути даже нджинкс. также спасибо комуто за идею заставить нджинкс не создавать временый файл для вывода. я об этом думал но проигнорировал, счас думаю поиграться ещо с этим. писать свой лисенер 80 порта, эта идея только осталась не расмотренной, хотя такие вещи как nanoserver(php framework для создания своих серверов) уже расматриваються. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 14:07 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Заинтриговали. А вот эти функции не помогут определиться что с выводом стоит притормозить? Ну и да собирать и раздавать файл двумя потоками. 1 Читает временный файл в удобном режиме и отдает его пользователю при этом из файла семафора читает количество байт которые пользователю можно отдать(количество собранных байт от начала файла) 2 Собственно собирает временный файл по вашему алгоритму и пишет в файл семафор количество хороших байт ЗЫ для эстетики можно пошаманить с алгоритмом хранения и хранить на заголовки на максимально доступных нодах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 22:53 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
Облака отдыхають. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 09:01 |
|
||
|
php выдаёт данные быстрее чем сеть передаёт
|
|||
|---|---|---|---|
|
#18+
whitediver, Это не тот буфер. такая буферизация в пхп не используеться у меня. ну то есть я не даю команды ob_start(), а конфиге пхп включен autoflush - да и на практике убеждался - в буфере вывода пусто. буферизация идёт дальше, и походу штатными средствами в неё не заглянуть. А нащот потоков(в пхп кстате нету многопоточности! как и свойств у класов.) точнее нащёт двух процессов, думал но: понял что связываться с этим гиблое дело. куча гемора, не возможность разрабатывать под любимым виндоус, документация скудная, и главное, так как это процессы а не потоки, лично я не понял как обмениваться ресурсами, ведь именно это бы помогло, в другой задаче. а так посути, как не крути, это воткнуть ещё промеждуточный узел один, вряд ли получиться не замедлить общую скорость работы. ЗЫ моё предположение, максимум чего шаманством добиться(а меня бы это устроило) это работа получиться аля такое. пхп код выводит чтото на вывод, данные пошли в сеть, пхп быстрее выдаёт, тем самым наполняя некий буфер, напримр 250Кб в оперативке, как буфер наполниться, пхп код приотсановиться --- аналогично как код пхп замирает на любых внешних вызовах - конект к базе данных, открытие сокета или файла, передача /приём в блокирующем режиме и подобное. тогда получиться что мы конечно не видим скорость отдачи, но по заморозке кода сможет оценивать её, делая земеры времени перед и после команды ечо. хотя может так и хуже будет наоборот. эх. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 14:10 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38456134&tid=1463121]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
173ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 450ms |

| 0 / 0 |
