Как сервер управляет запросами разных пользователей одновременно? - PullRequest
5 голосов
/ 03 июня 2010

подскажите, как сервер обрабатывает разные HTTP-запросы одновременно. Если 10 пользователей войдут на сайт и одновременно отправят запрос на страницу, что произойдет?

Ответы [ 5 ]

7 голосов
/ 03 июня 2010

Обычно каждый из пользователей отправляет HTTP-запрос на страницу.Сервер получает запросы и передает их разным работникам (процессам или потокам).

В зависимости от заданного URL-адреса сервер читает файл и отправляет его обратно пользователю.Если файл является динамическим файлом, таким как файл PHP, файл выполняется перед отправкой обратно пользователю.

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

Подробнее см .: Веб-серверы HowStuffWorks

2 голосов
/ 03 июня 2010

HTTP использует TCP , который является протоколом на основе соединения.Это значит, что клиенты устанавливают соединение TCP во время связи с сервером.

Несколько клиентов могут подключаться к одному и тому же порту назначения на одном и том же компьютере назначения одновременно.Сервер просто открывает несколько одновременных подключений.

Apache (и большинство других HTTP-серверов) имеет модуль мультиобработки ( MPM ).Это отвечает за распределение потоков / процессов Apache для обработки соединений.Эти процессы или потоки могут затем работать параллельно на своем собственном соединении, не блокируя друг друга.Apache MPM также имеет тенденцию сохранять открытые «резервные» потоки или процессы, даже когда нет открытых соединений, что помогает ускорить последующие запросы.

Программа ab (короткаядля ApacheBench), которая поставляется вместе с Apache, позволяет вам проверить, что происходит, когда вы открываете несколько подключений к вашему HTTP-серверу одновременно.

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

Обратите внимание, что протокол HTTP (начиная с версии 1.1) позволяет поддерживать соединение открытым, так чтоклиент может сделать несколько HTTP-запросов перед закрытием соединения, потенциально уменьшая количество одновременных соединений, которые ему нужно сделать.

Подробнее о MPM Apache:

Сам Apache может использовать несколько различныхмодули обработки (MPM).В Apache 1.x обычно используется модуль под названием «prefork», который заранее создает ряд процессов Apache, так что входящие соединения часто можно отправлять существующему процессу.Это как я описал выше.

В Apache 2.x обычно используется MPM с именем «worker», который использует многопоточность (запуск нескольких потоков выполнения в одном процессе) добиться того же.Преимущество многопоточности перед отдельными процессами состоит в том, что многопоточность намного легче по сравнению с открытием отдельных процессов и может даже использовать немного меньше памяти.Это очень быстро.

Недостаток многопоточности в том, что вы не можете запускать такие вещи, как mod_php.Когда вы используете многопоточность, все ваши библиотеки надстроек должны быть «поточно-ориентированными», то есть они должны знать о работе в многопоточной среде.Сложнее написать многопоточное приложение.Поскольку потоки внутри процесса совместно используют некоторую память / ресурсы между ними, это может легко привести к ошибкам состояния гонки, когда потоки читают или записывают в память, когда другой поток находится в процессе записи в него.Чтобы обойти это, требуются такие методы, как блокировка .Многие из встроенных библиотек PHP не являются поточно-ориентированными, поэтому желающие использовать mod_php не могут использовать «рабочий» MPM Apache.

0 голосов
/ 03 июня 2010

Сервер (apache) является многопоточным , что означает, что он может запускать несколько программ одновременно. Несколько лет назад один процессор мог быстро переключаться между несколькими потоками, создавая впечатление, что две вещи происходят одновременно. В наши дни компьютеры имеют несколько процессоров, поэтому компьютер может одновременно выполнять два потока кода. При этом потоки на самом деле не отображаются на процессоры каким-либо простым способом.

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

Одна из наиболее распространенных проблем с многопоточностью - это «условия гонки» - когда два запроса делают одно и то же («гонки» делают одно и то же), если это один ресурс, один из них собирается победить. Если они оба вставят запись в базу данных, они не смогут получить одинаковый идентификатор - один из них победит. Поэтому при написании кода нужно быть осторожным, чтобы понять, что одновременно выполняются другие запросы, и может изменить вашу базу данных, записать файлы или изменить глобальные переменные.

При этом модель программирования позволяет вам в основном игнорировать эту сложность.

0 голосов
/ 03 июня 2010

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

Как правило, демон HTTP порождает либо несколько процессов, либо несколько потоков, и каждый из них обрабатывает один клиентский запрос. Сервер может хранить резервные потоки / процессы, так что когда клиент делает запрос, ему не нужно ждать создания потока / процесса. Каждый поток / процесс может быть сопоставлен с другим процессором или ядром, чтобы они могли обрабатываться быстрее. Однако в большинстве случаев запросы содержат сетевой ввод-вывод, а не отсутствие необработанных вычислений, поэтому зачастую не наблюдается замедления из-за того, что число процессоров / ядер значительно меньше числа запросов, обрабатываемых за один раз. *

0 голосов
/ 03 июня 2010

Apache 2 имеет два разных режима работы. Один работает как многопоточный сервер , другой использует режим, называемый "prefork" ( несколько процессов ).

...