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


775

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

Что это значит?

В чем разница между этими пакетами?


18
Вы можете читать о Потокобезопасности на en.wikipedia.org/wiki/Thread_safety Что касается PHP: Является ли PHP поточно- Do не верить лжи: PHP Не поточно-же разница между PHP и потокобезопасна не потокобезопасной binarie Там Есть много доступных ресурсов. Поиск здесь в Stackoverflow или Google.
TigerTiger

Ответы:


669

Необходимые знания о подходах к параллелизму:

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

Говоря только о средах на основе 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 для командной строки - безопасность потоков не имеет значения.

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


2
То есть PHP-FPM не является многопоточным? Это решает проблему, так как Fast CGI используется на серверах nginx.
Xeoncross

41
Удивительная деталь, я программировал на PHP годами и никогда не знал этого.
Патрик

1
@Xeoncross: Вообще-то это правильно, и на практике это одна из лучших причин управлять процессами PHP вне Apache. Я перехожу этот аспект в своем ответе.
JM Becker

Единственная проблема здесь в том, что PHP-FPM недоступен под Windows. По крайней мере, как родная сборка.
Денис V

9
Является ли безопасность потоков PHP по - прежнему «весьма спорной» (в 2015 и версии 7)?
Альтиано Герунг,

261

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

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

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


1
greg ваш ответ должен был звучать так: «Если вы хотите установить PHP как модуль Apache, где рабочий - это MPM, следует использовать версию Thread Safe»
wlf

9
так php, который идет с xampp на окнах, является NTS или TS?
Абудая

1
Что делать, если вы используете встроенный веб-сервер PHP? Какой вариант PHP использовать для оптимальной производительности?
Ариод

1
@Dario Я думаю, что это просто Windows.
Грег

1
@ ChristopherShaw чувак, ответ содержит только мнение. Нет никакого источника или причины, почему бы использовать ZTS в сочетании с модулем Apache. Это не правильный ответ. Даже 217 чел могут быть не правы m8.
Даниэль В.

30

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

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

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

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

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

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

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.