PHP под Apache реентерабельный?
Просто теоретический вопрос.
скажем, мой сайт состоит из формы, которая использует почтовые функции PHP для отправки электронной почты. У меня 500 пользователей, которые нажимают кнопку "Отправить" одновременно. Теперь 500 писем в 500 различных сессиях должны быть отправлены из PHP.
это будет сделано одновременно? сколько потоков задействовано? будет ли каждый отправлять блокировать других и делать это один за другим?
2 ответа
Есть две вещи, о которых вам нужно подумать.
Во-первых, как вы настроили свой веб-сервер. Если вы используете Apache, есть несколько модулей обработки, из которых можно выбрать. Самый популярный модуль обработки - prefork, в котором есть один родительский процесс и несколько дочерних процессов. Каждый ребенок обрабатывает один запрос за раз. Это полностью исключает многопоточность, поскольку не все модули Apache являются поточно-ориентированными. Вы также можете найти рабочий модуль где-нибудь в производстве. Он использует комбинацию разветвления и потоков для обслуживания нескольких запросов на каждого потомка. Он может использоваться только тогда, когда каждый отдельный модуль Apache и все его зависимости являются поточно-ориентированными.
Второе, о чем стоит подумать - это сам PHP. Хотя основной язык PHP и некоторые расширения являются поточно-ориентированными, многие расширения не являются поточно-ориентированными. По этой причине, когда вы используете Apache и mod_php, модуль обработки prefork - ваш лучший выбор. (Сам PHP не имеет внутренней концепции потоков.)
tl; dr: Apache + PHP = один запрос на каждого дочернего элемента Apache. Обычно у вас будет только 20-30 детей Apache, что означает 20-30 возможных одновременных запросов. Это зависит от конфигурации.
На Linux-сервере письма отправляются с использованием локальных sendmail
команда. Это немедленно принимает сообщение и возвращает. Остальная часть работы выполняется вашим MTA (асинхронно), который укрепляется и оптимизируется на протяжении десятилетий для таких работ, как эта.