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

641

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

Теги:
multithreading
thread-safety
packages

4 ответа

617

Необходимый фон для подходов 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-потока, это не имеет значения.

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

  • 2
    Значит PHP-FPM не является многопоточным? Это решает проблему, так как Fast CGI используется на серверах nginx.
  • 28
    Удивительная деталь, я программировал на PHP годами и никогда не знал этого.
Показать ещё 12 комментариев
233

A потокобезопасная версия должна использоваться, если вы устанавливаете PHP как Apache module, как рабочий MPM (модель с несколькими процессорами).

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

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

  • 1
    greg ваш ответ должен был быть следующим: «Если вы хотите установить PHP в качестве модуля Apache, где работник является MPM, следует использовать версию Thread Safe».
  • 4
    Является ли Thread Safe таким же, как ZTS?
Показать ещё 7 комментариев
27

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

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

Linux

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

PHP-FPM + APC

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

  • 0
    Событие MPM еще лучше ...
16

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню