Подтвердить что ты не робот

Как параллельные запросы обрабатываются в PHP (используя - потоки, пул потоков или дочерние процессы)

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

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

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

4b9b3361

Ответ 1

Как я знаю, на каждом веб-сервере есть свой вид обработки одноразового запроса multpile. Обычно Apache2 может развить дочерний процесс для каждого нового запроса. Но вы можете как-то настроить это поведение, как указано в связанном ответе StackOverflow.

Nginx, например, получает каждый запрос в одном потоке (обрабатывает новые соединения асинхронно, например, Node.js), или иногда использует кеширование (в соответствии с настройкой, Nginx также может использоваться как балансировщик нагрузки или HTTP-прокси). Это выбор правильного веб-сервера для вашего приложения.

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

Nginx очень хорош, если вы ожидаете много длительных соединений с каким-то длительным временем обработки. Тогда вам не нужно так много балансировки.

Надеюсь, я смог помочь вам с этим;)

Источники:

https://httpd.apache.org/docs/2.4/mod/worker.html

https://anturis.com/blog/nginx-vs-apache/

Я также рекомендую вам взглянуть на: Что такое поточно-безопасный или не потоковый сейф в PHP?

Ответ 2

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

Важно подумать о том, как настроить PHP-серверы для получения информации о нем. Для настройки сервера и PHP по-своему может быть три возможности:

1) Использование PHP как модуля (для многих серверов PHP имеет прямой интерфейс модуля (также называемый SAPI))

2) CGI

3) FastCGI

Учитывая пример # 1 PHP как модуль, в этом случае модуль интегрируется с самим веб-сервером, и теперь он полностью помещает мяч на веб-сервер, как он обрабатывает запросы с точки зрения процесса разметки, используя потоки, пулы потоков и т.д..

Для модуля Apache mod_php, как представляется, очень часто используется, и сам Apache обрабатывает запросы с использованием процессов и потоков в двух моделях, как указано в этом ответе

Prefork MPM использует несколько дочерних процессов с одним потоком каждый и каждый процесс обрабатывает одно соединение за раз.

Рабочий MPM использует несколько дочерних процессов со многими потоками. Каждый поток обрабатывает по одному соединению за раз.

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

Для # 2 и # 3 веб-сервер и часть PHP обрабатываются в разных процессах, а также то, как веб-сервер обрабатывает запрос и как он обрабатывается приложением (часть PHP). Например, NGINX может обрабатывать запрос с использованием асинхронного неблокирующего ввода-вывода, и Apache может обрабатывать запросы с использованием потоков, но как запрос будет обрабатываться приложением FastCGI или CGI, является другим аспектом, как описано ниже. Оба аспекта, а именно то, как веб-сервер обрабатывает запросы и как обрабатывается часть PHP, будет иметь важное значение для производительности серверов PHP.

Учитывая № 2, протокол CGI делает веб-сервер и приложение (PHP) независимыми друг от друга, а для протокола CGI требуется, чтобы приложение и веб-сервер обрабатывались с использованием другого процесса, и протокол не способствует повторному использованию одного и того же процесса, что в turn означает, что для обработки каждого запроса требуется новый процесс.

Учитывая № 3, протокол FastCGI преодолевает ограничение CGI, разрешая повторное использование процесса. Если вы проверите ссылку IIS FastCGI, FastCGI решает проблемы производительности, присущие CGI, предоставляя механизм повторного использования одного процесса снова и снова для много запросов.

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

Тем не менее, в случае FastCGI кажется, что сервер поддерживает пул процессов и использует пул процессов для обработки входящих клиентских запросов, и поскольку пул процессов не требует проверки потоковой безопасности, он обеспечивает хорошую производительность.

Ответ 3

Я думаю, что ответ зависит от того, как веб-сервер и развертывание cgi.

В моей компании мы используем Nginx как веб-сервер и php-fpm как cgi, поэтому параллельный запрос обрабатывается как процесс php-fpm, а не поток.

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

Итак, я считаю, что сам PHP может поддерживать все из них, но как его использовать, что зависит.

Ответ 4

PHP не обрабатывает запросы. Веб-сервер делает.

Для Apache HTTP Server наиболее популярным является "mod_php". Этот модуль фактически является самим PHP, но скомпилирован как модуль для веб-сервера, и поэтому он загружается прямо в него.

Поскольку с mod_php, PHP загружается прямо в Apache, если Apache собирается обрабатывать параллелизм, используя свой Worker MPM (то есть, используя Threads)

Для nginx PHP полностью вне веб-сервера с несколькими процессами PHP processes

Иногда вы можете использовать PHP non-thread safe или thread safe.

Но функция setlocale() (если поддерживается) фактически изменяет состояние процесса операционной системы и не является поточно-ориентированной.

Вы должны помнить это, когда вы не уверены, как работает унаследованный код.