Intereting Posts

Что такое поточно-безопасный или небезопасный поток в PHP?

Я видел разные двоичные файлы для PHP, например, без потоковой или потоковой безопасности? Что это значит? В чем разница между этими пакетами?

Необходимый фон для параллельных подходов:

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

Существуют также другие совершенно разные модели параллелизма (с использованием асинхронных сокетов и ввода-вывода), а также те, которые объединяют две или даже три модели вместе. Для ответа на этот вопрос мы рассматриваем только две модели выше, а в качестве примера – HTTP-сервер Apache.

Нужен фон о том, как PHP «интегрируется» с веб-серверами:

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

Существуют и другие способы связывания PHP с Apache и другими веб-серверами, но mod_php является самым популярным, и также будет служить для ответа на ваш вопрос.

Возможно, вам не нужно было разбираться в этих деталях раньше, потому что хостинговые компании и дистрибутивы GNU / Linux поставляются со всем, что приготовлено для нас.

Теперь, на ваш вопрос!

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

На данный момент вы должны думать «ОК, поэтому, если я использую многопоточный веб-сервер, и я собираюсь внедрить PHP прямо в него, тогда я должен использовать поточно-безопасную версию PHP». И это было бы правильное мышление. Однако, как это бывает, безопасность потоков PHP очень оспаривается . Это использование-если-вы-действительно-действительно-знаете-что-вы-делаете землю.

Итоговые заметки

В случае, если вам интересно, мой личный совет заключается в том, чтобы не использовать PHP в многопоточной среде, если у вас есть выбор!

Говоря только о средах, основанных на Unix, я бы сказал, что, к счастью, вам нужно только подумать об этом, если вы собираетесь использовать PHP с веб-сервером Apache, и в этом случае вам рекомендуется перейти с предпродажным MPM Apache (который не использует потоки, и поэтому безопасность потоков на PHP не имеет значения), и все дистрибутивы GNU / Linux, которые я знаю, будут принимать это решение для вас, когда вы устанавливаете Apache + PHP через свою систему пакетов, даже не запрашивая для выбора. Если вы собираетесь использовать другие веб-серверы, такие как nginx или lighttpd , у вас не будет возможности встраивать PHP в них. Вы будете использовать FastCGI или что-то равное, которое работает в другой модели, где PHP полностью выходит за пределы веб-сервера с несколькими процессами PHP, используемыми для ответа на запросы, например, FastCGI. В таких случаях безопасность потоков также не имеет значения. Чтобы увидеть, какая версия использует ваш сайт, поместите файл, содержащий <?php phpinfo(); ?> <?php phpinfo(); ?> на вашем сайте и искать запись Server API . Это может сказать что-то вроде CGI/FastCGI или Apache 2.0 Handler .

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

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

Для установки PHP в качестве модуля Apache следует использовать поточно-безопасную версию в качестве рабочей MPM (мультипроцессорной модели).

Непоточная безопасная версия должна использоваться, если вы устанавливаете PHP как двоичный файл CGI .

Предпрограмма Apache MPM с modphp используется, потому что ее легко настроить / установить. По производительности это довольно неэффективно. Мой предпочтительный способ сделать стек, FastCGI / PHP-FPM. Таким образом, вы можете использовать гораздо быстрее MPM Worker. Весь PHP остается не-threaded, но Apache работает с потоками (как и должно).

Итак, в основном, снизу вверх

Linux

Apache + MPM Worker + ModFastCGI (NOT FCGI) | (или) | Чероки | (или) | Nginx

PHP-FPM + APC

ModFCGI не поддерживает PHP-FPM или любые внешние приложения FastCGI. Он поддерживает только сценарии FastCGI, не связанные с процессом. PHP-FPM – это менеджер процессов PHP FastCGI.

Согласно документации PHP ,

Что означает безопасность потоков при загрузке PHP?

Thread Safety означает, что двоичный файл может работать в многопоточном контексте веб-сервера, например Apache 2 в Windows. Thread Safety работает, создавая локальную копию хранилища в каждом потоке, чтобы данные не сталкивались с другим потоком.

Итак, что мне выбрать? Если вы решите запустить PHP как двоичный код CGI, вам не понадобится безопасность потоков, потому что двоичный код вызывается при каждом запросе. Для многопоточных веб-серверов, таких как IIS5 и IIS6, вы должны использовать поточную версию PHP.

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

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)