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

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

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

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

25

Решение

Как я знаю, у каждого веб-сервера есть свой собственный вид обработки нескольких запросов.
Обычно 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?

19

Другие решения

После некоторых исследований я пришел к следующим выводам.

Важно учитывать, как 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 требует, чтобы приложение и веб-сервер обрабатывались с использованием разных процессов, и протокол не способствует повторному использованию одного и того же процесса, что, в свою очередь, означает новый процесс требуется для обработки каждого запроса.

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

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

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

4

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

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

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

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

3
По вопросам рекламы [email protected]