Я видел разные двоичные файлы для PHP, например, не-поток или потокобезопасный?
Что это значит?
В чем разница между этими пакетами?
Я видел разные двоичные файлы для PHP, например, не-поток или потокобезопасный?
Что это значит?
В чем разница между этими пакетами?
Ответы:
Различные веб-серверы реализуют разные методы для параллельной обработки входящих HTTP-запросов. Довольно популярным методом является использование потоков, то есть веб-сервер будет создавать / выделять отдельный поток для каждого входящего запроса. HTTP-сервер Apache поддерживает несколько моделей для обработки запросов, одна из которых (называемая рабочим MPM) использует потоки. Но он поддерживает другую модель параллелизма, называемую prefork MPM, которая использует процессы, то есть веб-сервер будет создавать / выделять отдельный процесс для каждого запроса.
Существуют также другие совершенно разные модели параллелизма (использующие асинхронные сокеты и ввод / вывод), а также модели, которые смешивают две или даже три модели вместе. Для ответа на этот вопрос нас интересуют только две модели, приведенные выше, и в качестве примера используется HTTP-сервер Apache.
Сам 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 для командной строки - безопасность потоков не имеет значения.
Наконец, если потокобезопасность не имеет значения, то какую версию следует использовать - поточно-безопасную или не поточно-безопасную? Честно говоря, у меня нет научного ответа! Но я предполагаю, что не поточнобезопасная версия быстрее и / или менее глючная, иначе они просто предложили бы поточнобезопасную версию и не удосужились бы дать нам выбор!
Для меня я всегда выбираю версию без потока, потому что я всегда использую nginx или запускаю PHP из командной строки.
Необезопасную версию следует использовать, если вы устанавливаете PHP как двоичный файл CGI, интерфейс командной строки или другую среду, в которой используется только один поток.
Потоково-безопасную версию следует использовать, если вы устанавливаете PHP как модуль Apache в рабочем MPM (модель многопроцессорной обработки) или в другой среде, где несколько потоков PHP работают одновременно.
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.
Согласно документации PHP ,
Потоковая безопасность означает, что двоичный файл может работать в контексте многопоточного веб-сервера, такого как Apache 2 в Windows. Потокобезопасность работает путем создания копии локального хранилища в каждом потоке, чтобы данные не сталкивались с другим потоком.
Так что я выбираю? Если вы решите запустить PHP как бинарный файл CGI, вам не понадобится безопасность потоков, потому что бинарный файл вызывается при каждом запросе. Для многопоточных веб-серверов, таких как IIS5 и IIS6, следует использовать многопоточную версию PHP.
Следующие библиотеки не являются потокобезопасными. Они не рекомендуются для использования в многопоточной среде.