LINUX.ORG.RU

Вопрос по архитектуре высоконагруженных PHP-сайтов.


0

2

1) А для обработки параллельно поступивших 1000 запросов, обязательно создавать 1000 процессов PHP-интерпретатора?

2) Нельзя постоянно держать в памяти процесс-интерпретатор и последовательно через FastCGI с фронтэнда слать ему запросы? Наверное так не делают потому, что PHP-интерпретатор может пойти в базу или по HTTP в какое-нибудь API google для верификации капчи и тогда все остальные входящие пользовательские запросы встанут в очереди.

3) А можно создать процесс-пул php-интерпретаторов, который бы через FastCGI принимал от фронтэнд-сервера/балансера запросы и внутри себя переиспользовал уже готовые php-интерпретаторы, где уже всё проинициализировано? Короче, обязательно новый UNIX-процесс рожать на каждый запрос, если мы не хотим блокировать все входящие запросы своим походом в базу?

4) Я клоню к тому, что идеальному серверу не нужно процессов больше количества ядер, а все сетевые входящие и исходящие операции могут быть обработаны асинхронно на epoll или kqueue. То есть процесс, обрабатывающий пользовательский запрос, может в какой-то момент времени находиться в состоянии ожидания по 100 соединениям в базу и при этом принимать новые запросы. Ему нужно только иметь 100 объектов, хранящих состояние каждого запроса.

★☆

Последнее исправление: kiverattes (всего исправлений: 1)

0. Почему именно php?

1. Нет, конечно. Есть вещи вроде http://www.photon-project.com/

2. Закопать FastCGI. Алсо, см. пункт 1.

может пойти в базу

встанут в очереди

В пыхе есть асинхронные вещи.

3, 4 — ознакомься с существующими поделками.

x3al ★★★★★
()

что делать то собрался им?

umren ★★★★★
()
Ответ на: комментарий от x3al

PHP как пример частоиспользуемой технологии, я на нём ничё делать не собираюсь. Знакомиться с существующими поделками времени нет, надеюсь найдётся кто-то, у кого есть пять минут написать краткий коммент по сути с объяснением на пальцах.

kiverattes ★☆
() автор топика
Последнее исправление: kiverattes (всего исправлений: 1)

Я так вот скажу (50% имха, 50% математика, про реальность уже рассказывали)

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

2) Можно, но велосипед ненужный получится. Есть лучше способы.

3) Получается велосипед второго уровня уже. Тут уже проще свой вебсервер написать будет и рулить в нём потоками как нравится.

4) Это надо ещё идеальные процессы с идеальными ядрами. Но так не бывает, поэтому 2-64 процессов на ядро получается гораздо эффективней.

Goury ★★★★★
()

1) Да, либо reactphp либо 1000 воркеров, если у тебя прям такая потребность будет в реальности. Если меньше воркеров то запросы постоят в очереди. В целом если тебе нужен realtime в вебе, то php не твой выбор, см. erlang.

2) php lives to die, он не живет в памяти, см erlang.

3) см. erlang.

4) идеальный сервер это миф, если нужен shared state то см. другие технологии, хотя его можно эмулировать через redis/или системы сообщений и прочее.

umren ★★★★★
()
Ответ на: комментарий от kiverattes

Если коротко, то оно уже написано несколько раз, но в основном в бетах т.к. это зачастую пишут на более нормальных стэках. Асинхронным с точки зрения конечного кодера может быть _всё_, включая запросы в базу и прочую фигню. В том числе в php.

x3al ★★★★★
()

В PHP с акселератором очень низкий стартап-оверхед. Так что хотя можно извращаться с многопоточностью, реально с 1000 воркеров на том же php-fpm легко справляется даже посредственный сервер. Тут скорее проблема будет в том, что этим 1000 воркерам понадобится быстрый бэкенд, а вот тот же MySQL десятки-тысячи запросов в секунду с одной ноды будет отдавать неохотно. Альтернативы, как правило, ещё хуже. Так что, как ни крути, а придётся горизонтально масштабироваться. Разве что объём данных реально небольшой и все их можно в готовом виде хранить в памяти в key-value.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

десятки-тысячи запросов в секунду

Читать, конечно, как «десятки-сотни тысяч запросов в секунду» :) (1000 воркеров * количество запросов в секунду от каждго (2-10) * количество SQL-запросов на один запрос документа (10-100)).

KRoN73 ★★★★★
()

1) Нет
2) Для этого и есть FastCGI.
3) Для этого и есть FastCGI.
4)

процесс, обрабатывающий пользовательский запрос, может в какой-то момент времени находиться в состоянии ожидания по 100 соединениям в базу и при этом принимать новые запросы.

Пока PHP ждет ответа из БД, все равно нужно хранить его данные в памяти.

goingUp ★★★★★
()
Ответ на: комментарий от kiverattes

Потратить бюджет на велосипедостроение на покупку сервера получше.

А если ваш хайлоад это не тысячи, а миллиарды запросов в секунду, то не жадничать на R&D и пилить свой вебсервер, слушающий что надо и отвечающий как надо.

Все остальные варианты в середине уже огласили и если они не подошли, то пилить что-нибудь другое всё-равно выйдет гораздо дороже железа.

Goury ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.