Ответ 1
Необходимый фон для подходов concurrency:
Различные веб-серверы реализуют различные методы обработки входящих запросов HTTP параллельно. В довольно популярной технике используются потоки - то есть веб-сервер будет создавать/выделять один поток для каждого входящего запроса. Веб-сервер Apache HTTP поддерживает несколько моделей для обработки запросов, один из которых (называемый рабочим MPM) использует потоки. Но он поддерживает другую модель concurrency, называемую prefork MPM, которая использует процессы - то есть веб-сервер будет создавать/выделять один процесс для каждого запроса.
Существуют также другие совершенно разные модели concurrency (с использованием асинхронных сокетов и ввода-вывода), а также те, которые объединяют две или даже три модели вместе. Для ответа на этот вопрос мы рассматриваем только две модели, приведенные выше, и в качестве примера используем HTTP-сервер Apache.
Необходимый фон о том, как PHP "интегрируется" с веб-серверами:
Сам PHP не отвечает на фактические HTTP-запросы - это задание веб-сервера. Поэтому мы настраиваем веб-сервер для пересылки запросов на PHP для обработки, затем получаем результат и отправляем его пользователю. Существует несколько способов подключения веб-сервера к PHP. Для Apache HTTP Server наиболее популярным является "mod_php". Этот модуль фактически является самим PHP, но скомпилирован как модуль для веб-сервера, и поэтому он загружается прямо внутри него.
Существуют и другие методы для связывания PHP с Apache и другими веб-серверами, но mod_php является наиболее популярным, и он также будет служить для ответа на ваш вопрос.
Возможно, вам не нужно было разбираться в этих деталях раньше, потому что хостинговые компании и дистрибутивы GNU/Linux поставляются со всем, что приготовлено для нас.
Теперь, на ваш вопрос!
Поскольку с mod_php PHP загружается прямо в Apache, если Apache собирается обрабатывать concurrency с помощью своего MPM Worker (то есть с помощью Threads), то PHP должен иметь возможность работать в этой же многопоточной среде - Значение PHP должен быть потокобезопасным, чтобы иметь возможность правильно играть в шарик с помощью Apache!
На этом этапе вам следует подумать "ОК, поэтому, если я использую многопоточный веб-сервер, и я собираюсь внедрить PHP прямо в него, тогда я должен использовать поточно-безопасную версию PHP", И это было бы правильное мышление. Однако, как это бывает, PHP-безопасность потока сильно оспаривается. Это использование-если-вы-действительно-действительно-знаете-что-вы-делаете землю.
Заключительные примечания
Если вам интересно, мой личный совет будет не использовать PHP в многопоточной среде, если у вас есть выбор!
Говоря только о средах, основанных на Unix, я бы сказал, что, к счастью, вам нужно только подумать об этом, если вы собираетесь использовать PHP с веб-сервером Apache, и в этом случае вам рекомендуется перейти с предпродажным MPM Apache (который не использует потоки и, следовательно, не имеет значения для потоков потоков), и все дистрибутивы GNU/Linux, которые я знаю, будут принимать это решение для вас, когда вы устанавливаете Apache + PHP через свою систему пакетов без даже побуждая вас к выбору. Если вы собираетесь использовать другие веб-серверы, такие как nginx или lighttpd, у вас не будет возможности встраивать PHP в них. Вы будете использовать FastCGI или что-то равное, которое работает в другой модели, где PHP полностью выходит за пределы веб-сервера с несколькими процессами PHP используется для ответа на запросы, например FastCGI. В таких случаях безопасность потоков также не имеет значения. Чтобы узнать, какая версия использует ваш сайт, поместите файл с <?php phpinfo(); ?>
на свой сайт и найдите запись Server API
. Это может сказать что-то вроде CGI/FastCGI
или Apache 2.0 Handler
.
Если вы также посмотрите версию командной строки для PHP-потока, это не имеет значения.
Наконец, если безопасность потоков не имеет значения, какую версию вы должны использовать - поточно-безопасную или небезобезопасную? Честно говоря, у меня нет научного ответа! Но я бы предположил, что версия, отличная от потоковой, быстрее и/или менее глючит, иначе они бы просто предложили потокобезопасную версию и не потрудились дать нам выбор!