powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / php выдаёт данные быстрее чем сеть передаёт
21 сообщений из 21, страница 1 из 1
php выдаёт данные быстрее чем сеть передаёт
    #38455290
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот работал мой сайт медленно, теперь быстро.
теперь я прекрасно вижу что пока из гигабайтного файла мозила закачала 200мб, скрипт на сервере уже выдал весь гигабайт.
(выдача файла исключительно скриптом)

оперативка седеться вся на это время на сервере, ну и из 3 закачек две оборвались - тоесть как бы файл мозила получила но не весь.

вот и возникает вопрос. А можно ли както на пхп узнать, не стоит ли притормозить с выводом.

что будет если будет сразу 10 человек качать большие файлы, пхп код будет их шутро выдавать, но сеть не успеет передавать это всё.

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

кто что может сказать?
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38455346
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще то, вопросы скорости передачи решаются где-то на уровне протокола передачи данных.


alex564657498765453из гигабайтного файла мозила закачала 200мб, скрипт на сервере уже выдал весь гигабайт.Не много ли под буферы выделено?
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38455474
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

отдавать такие большие файлы через пхп - плохая идея. никаких ресурсов нехватит.
выгружайте их в каталог, формируйте временную ссылку и отдавайте пользователю. пусть отдачей контента занимается сам вебсервер. он изначально заточен пож это. поддерживает докачку, меньше тратит ресурсов и т.д.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38456134
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

так ябы и выдавал большие файлы на прямую - если бы они существовали :)

этот файл формируеться пхп, его ни по частям ни иным способом не существует в природе.

можно конечно сначала сделать сборку - но этот процес для гигабайтных файлов(а файл может быть и 50 гигов) это минуты а то и больше.

пользователю не прикольно ждать будет.

может можно както подстроиться на пхп к отдаче... ну както контролировать размер данных в буфере или ещо какой способ, чтоб замедлить работу свою и "подождать" пока данные из буфера уйдут в сеть пользователю.

???
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38458554
Electric200
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "выдавать" ? Как вы его выдаете? Выдавайте порциями, после каждой очищайте буфер.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38497856
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Electric200,

ты наверно можешь подсказать что-то дельное, но не понял суть проблемы.

представь себе что у меня файл на 50 гигов храниться в паке кусками по 10 метров.

я пишу скрипт выдающий этот файл -
1)делаем хидеры
2)в цикле от первого до последнего кусочка - риид_файл(нужный кусочек)

вопрос - с какой скоростью будет выдача данных скриптом??? посути скоростьлимитирующим фактором сдесь будет скорость чтения с шдд. это гдето 50 мб в секунду.

но то тчо пхп выдал за первую секунду 50мб, не означает что за первую секунду юзер их получил. сеть столько не пропустит.

вот и получаем вопрос, а где же будут храниться данные , которые уже "вышли" из пхп(попали в стдаут) но ещо не ушли в сеть.

они будут в буфере.

итого получаем, что при быстром чтении с шдд, и медленой сети - а это стандартная ситуация, му кучу данных пишем в буфер, который в оперативку не помещаеться, и естествено валиться в свап - тоест обратно пишеться на шдд.

и если говорить не о одном файле в 50 гектар, а о файлак пускай даже по 50-100мб, но зато одновременых запросах несколько десятков - полуаем что ложиться шдд.

так как мы ерундой занимаемся.

вот и вопрос, как это правильно решить.

вот если мы посылаем в синхроном режиме данные на сокет по 10 метров в цикле.
что будет? 10 метров в сокет кидаем, и пока они реально не уйдут, скрипт будет "висеть" на этой команде. тоесть не получиться у нас никогда что скрипт выдал уже гектар, а удалёный узел получил только 40метров.


вот подобное, или может ещо както можно с выводом юзеру файла сделать???
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38498008
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во-первых убедитесь, что у вас на фронтэнде нету нджинкса, который проксирует запросы на апач (если есть, то следует произвести доп. настройки нджинкса, в частности отключить запись в файл кэшированных данных - proxy_max_temp_file_size, а вообще лучше использовать X-Access-Redirect).


по поводу буферов, то я так понимаю все здесь http://www.php.net/ob_start
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38498034
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453так как мы ерундой занимаемся.Верно подмечено.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38498037
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett вообще лучше использовать X-Access-Redirect).


x-accel-redirect
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38498038
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vklealex564657498765453так как мы ерундой занимаемся.Верно подмечено.
Почему сразу ерундой?
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38500162
Electric200
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как то у вас сильно все мудрено. Гигабайтные файлы формировать на лету, передавать клиенту и с использованием PHP. Забивать гвозди отверткой. И главный недостаток не в PHP, а в том, что вам на прямую не доступен порт/сокет в данном случае с PHP. Вам доступен только STDIN и STDOUT и все что относиться к потокам. Вам скрипт не слушает на прямую порт/сокет входящего соединения, по этому вы очень ограничены в контролировании передачи и не можете даже отследить возможные ошибки. По этому что бы вы не придумали, любой подход будет противоречить технологии. А в худшем случае, скушаються все ресурсы сервера.
Мой совет, используйте подход:
1. Создание физического файла и запись на диск , или в буфер
2. Передача работ по скачиванию Web серверу (не важно какому). Ведь он для этого и создан.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38515410
Сергей Арбузов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453r u,

можно конечно сначала сделать сборку - но этот процес для гигабайтных файлов(а файл может быть и 50 гигов) это минуты а то и больше.

пользователю не прикольно ждать будет.

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

Угадывать скорость отдачи данных - это шаманство.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38515413
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Описанный гемор чем лучше?
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38515520
Сергей Арбузов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett, тем что за счет асинхронности можно сделать предсказуемую нагрузку на сервер
к примеру зашли 100 клиентов потребовали мега-файл если повезет, то файл придется генерировать только один раз, и в любом случае можно незаметно для клиента ограничить количество одновременных генераций
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38515538
Сергей Арбузов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и еще не придется заставлять пользователя ждать начала выдачи данных с открытым браузером
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38522610
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453Electric200,

ты наверно можешь подсказать что-то дельное, но не понял суть проблемы.

представь себе что у меня файл на 50 гигов храниться в паке кусками по 10 метров.


Начиная с этого места становится понятно, что автор и не собирается объяснить суть проблемы, а все больше на какихто заоблачных примерах все строит

Может хватит описывать на примерах, а пора поделиться задачей как она стоит изначально.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38526925
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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Кб/сек(например) - кешировать проблемные куски не так важно, ибо они сдесь не делают проблему.

Этот кешер, пока на уровне идеии, (плюс видеофайлы могут сразу смотря не доконца смотреть...тоесть кусочки первых чанков файла, важны, последних нет).

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

и правильно подметили, что в пхп не предполагалось решение подобных задач.

НО задача стала, и надо найти решение.
(варианты напиания на шелле(юникс) чегото вспомогательного и вызов его из пхп, расматриваеться смелло, вплоть до написания несложного кода на си, который низкоуровнево может пообщаться с ОС и выдать нам нужную инфу).

ЗЫЗЫ
варианты предварительно собирать, это всё весело, но как видно из вышенаписаного, я спецом бился чтоб выдавать юзеру файл через пару сотен мсек. - так что ждать пару минут для сборки - не вариант.

ЗЫЗЫЗЫ
если подобное можно сделать на другом языке(перл. питон, ноудджес...) предлагайте.

задача не стоит сделать на пхп по возможности контроль за реальной отдачей.

вопрос стоит сделать контроль реальной отдачи , по возможности на пхп(ибо остальное уже на пхп) - но если прийдёться хоть на двух или трёх языках ещо чтото дописывать, совершенно не проблемма.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38526939
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PMalex564657498765453Electric200,

ты наверно можешь подсказать что-то дельное, но не понял суть проблемы.

представь себе что у меня файл на 50 гигов храниться в паке кусками по 10 метров.


Начиная с этого места становится понятно, что автор и не собирается объяснить суть проблемы, а все больше на какихто заоблачных примерах все строит

Может хватит описывать на примерах, а пора поделиться задачей как она стоит изначально.

на сервере пока что стоит тестово - max_upload_file_size=50G
в будущем, будет клиент способен передавать файл порциями на сервер, а сервер будет уметь принимать, и размер файла который теоритически можно закачать(например копию своего шдд на 750Гб) будет лимитироваться уже совсем другими величинами, квотой юзера и наличием места в кластере. а это уже терабайты , а то и 10ки возможно.

спасибо что пытаетесь помочь, но вы подошли стандартно - пытаться найти обходной путь, решив что задача стандартная, а я по глупости пошол в дебри сразу.
может упустил чего, но остальные варианты я уже перепробовал - пытаться найти недокументированную возможность в пхп, играясь функциями работы с потоками / сокетами для stdout, не получилось. ну а просто flush() и подобные советы выше - они изначально не подходят - не о том буффере речь. речь о буфере за пределами пхп и по сути даже нджинкс.


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

писать свой лисенер 80 порта, эта идея только осталась не расмотренной, хотя такие вещи как nanoserver(php framework для создания своих серверов) уже расматриваються.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38530222
whitediver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,

Заинтриговали.
А вот эти функции не помогут определиться что с выводом стоит притормозить?

Ну и да собирать и раздавать файл двумя потоками.
1 Читает временный файл в удобном режиме и отдает его пользователю при этом из файла семафора читает количество байт которые пользователю можно отдать(количество собранных байт от начала файла)
2 Собственно собирает временный файл по вашему алгоритму и пишет в файл семафор количество хороших байт

ЗЫ для эстетики можно пошаманить с алгоритмом хранения и хранить на заголовки на максимально доступных нодах
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38530351
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Облака отдыхають.
...
Рейтинг: 0 / 0
php выдаёт данные быстрее чем сеть передаёт
    #38531802
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whitediver,

Это не тот буфер. такая буферизация в пхп не используеться у меня.

ну то есть я не даю команды ob_start(), а конфиге пхп включен autoflush - да и на практике убеждался - в буфере вывода пусто.

буферизация идёт дальше, и походу штатными средствами в неё не заглянуть.

А нащот потоков(в пхп кстате нету многопоточности! как и свойств у класов.)
точнее нащёт двух процессов, думал но:
понял что связываться с этим гиблое дело. куча гемора, не возможность разрабатывать под любимым виндоус, документация скудная, и главное, так как это процессы а не потоки, лично я не понял как обмениваться ресурсами, ведь именно это бы помогло, в другой задаче. а так посути, как не крути, это воткнуть ещё промеждуточный узел один, вряд ли получиться не замедлить общую скорость работы.

ЗЫ моё предположение, максимум чего шаманством добиться(а меня бы это устроило)
это работа получиться аля такое.

пхп код выводит чтото на вывод,

данные пошли в сеть, пхп быстрее выдаёт, тем самым наполняя некий буфер, напримр 250Кб
в оперативке, как буфер наполниться, пхп код приотсановиться --- аналогично как код пхп замирает на любых внешних вызовах - конект к базе данных, открытие сокета или файла, передача /приём в блокирующем режиме и подобное.

тогда получиться что мы конечно не видим скорость отдачи, но по заморозке кода сможет оценивать её, делая земеры времени перед и после команды ечо.

хотя может так и хуже будет наоборот. эх.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / php выдаёт данные быстрее чем сеть передаёт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]