Что такое потокобезопасный или не потокобезопасный в PHP? - PullRequest
721 голосов
/ 26 октября 2009

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

Ответы [ 4 ]

629 голосов
/ 12 мая 2011

Необходимая справка по подходам параллелизма:

Различные веб-серверы реализуют разные методы для параллельной обработки входящих HTTP-запросов. Довольно популярным методом является использование потоков, то есть веб-сервер будет создавать / выделять отдельный поток для каждого входящего запроса. HTTP-сервер Apache поддерживает несколько моделей для обработки запросов, одна из которых (называемая рабочим 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 собирается обрабатывать параллелизм с помощью своего Worker MPM (то есть с помощью Threads), то PHP должен быть способен работать в этой же многопоточной среде, то есть PHP должен быть поточно-ориентированным, чтобы правильно играть в мяч с Apache!

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

Заключительные ноты

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

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

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

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

250 голосов
/ 21 ноября 2010

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

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

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

29 голосов
/ 18 июля 2011

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

В общем, снизу вверх

Linux

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

PHP-FPM + APC

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

21 голосов
/ 14 декабря 2015

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

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

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

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

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

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