Что произойдет при десяти подключениях к серверу PHP

Ответ

При 10 подключениях к серверу PHP (например, через Apache с mod_php или PHP-FPM):

  1. Для mod_php: Каждое подключение создаст отдельный процесс PHP (если используется prefork MPM), что может быстро исчерпать память, так как каждый процесс хранит свою копию PHP и расширений.

  2. Для PHP-FPM: Подключения обрабатываются пулом worker-процессов (зависит от настроек pm.max_children). Если пул перегружен, запросы будут ждать в очереди или отклоняться.

Пример ограничения в PHP-FPM:

pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
  1. Блокирующие операции: Если скрипты выполняют долгие операции (запросы к БД, API), это может привести к накоплению подключений и увеличению времени ответа.

Оптимальное число подключений зависит от доступной памяти и нагрузки. Например, для скрипта с потреблением 50MB RAM и сервера с 2GB свободной памяти максимум ~40 процессов (2000MB / 50MB).

Ответ 18+ 🔞

Ну вот, опять про эти ваши PHP-процессы. Сидишь такой, думаешь: "О, сервер, десять человек зашли одновременно — красота!" А он тебе: "Слышь, дружок, а память-то у нас на исходе, ёпта!"

Смотри, как это работает, если по-простому, а то глаза стекленеют от этих мануалов.

Вариант первый, старый-добрый mod_php под Apache. Представь, что каждый новый посетитель — это отдельный клон PHP. Зашло десять человек — бац, и десять одинаковых увальней в памяти сидят, жрут оперативку, как не в себя. Каждый со своим набором расширений, со своим кодом. Овердохуища копий получается! Сервер твой взвоет: "Мужик, ну я же не резиновый, блядь!" И всё, накрылся медным тазом — памяти нет, запросы в пизду.

Вариант второй, поумнее — PHP-FPM. Тут уже не клоны, а пул работяг, worker'ов. Как на заводе: сидят несколько подготовленных процессов, ждут заданий. Запрос пришёл — свободный работяга его схватил и пошёл выполнять. Умно, да?

Но и тут, сука, подводные камни! В конфиге же надо грамотно настроить, а то опять обосрёшься. Смотри:

pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8

Перевожу с бюрократического на русский:

  • pm.max_children = 20 — это лимит, блядь! Больше двадцати работяг одновременно не заведи, иначе память кончится.
  • Остальные настройки — это сколько их изначально запустить и сколько держать про запас, чтобы не тратить время на создание нового, когда народ повалит.

А теперь, внимание, главная проблема! Допустим, работяги у тебя есть. Но если каждый из них, получив задание, идёт не спеша чай пить — то есть делает долгий запрос к базе или тупит на каком-то API — то что получается? Очередь, блядь! Все десять подключений висят и ждут, пока эти копуши свои дела сделают. Время ответа растёт, пользователи нервно тыкают F5. Пиздец, а не отзывчивость.

Так сколько же можно? Давай считать, как в деревне. Допустим, один твой PHP-скрипт, как слон, жрёт 50 мегабайт оперативки. А на сервере у тебя свободных, ну, 2 гига (2000 МБ). Делим одно на другое: 2000 / 50 = 40. Вот тебе и pm.max_children — около сорока работяг максимум. Больше — и они друг друга в тесноте задавят, памяти не хватит. Всё, хуй с горы, сервер ляжет.

Вот такая, блядь, арифметика. Казалось бы, ерунда — десять подключений. А нет, оказывается, целая наука, чтобы не обосраться на ровном месте.