В чем отличие обработчика PHP (CGI против FastCGI против Mod_PHP против suPHP)?
Я понимаю, что есть четыре различных обработчика PHP (AFAIK).
- CGI (php-cgi)
- FastCGI (php-fpm)
- mod_php
- suPHP
Мне нужно знать плюсы и минусы этих обработчиков и для каких сред они подходят?
Например, если я использую сервер общего хостинга, какой из перечисленных выше обработчиков мне подходит? Или если я управляю частным сервером?
1 ответ
На самом деле это не "6 типов PHP", а два типа PHP, каждый из которых работает в 3 разных реализациях Apache.
suphp, suphp_worker и suphp_event
Сам suPHP - это оболочка для PHP, которая запускает PHP под заданными правами пользователя (например, отличается от прав, под которыми работает Apache) плюс модуль Apache (mod_suphp), который позволяет запускать suPHP - в основном в режиме CGI. Упрощенный режим CGI означает, что каждый запрос, передаваемый в PHP, запускает новый процесс PHP (во время выполнения). Это дорого, с точки зрения использования процессора, и медленнее по сравнению с постоянной средой выполнения PHP (я думаю, примерно в 3-5 раз).
Я предполагаю, что этот первый вариант использует MPA prefork от Apache, который широко используется и тестируется, но довольно медленный по сравнению с другими MPM. Prefork делает то, что подразумевает название: он разветвляет определенное количество процессов Apache и держит их доступными для входящих запросов.
Следующий (suphp_worker) использует вместо этого рабочий MPM. Рабочий - это смесь предварительно порожденных процессов и потоков, которая обычно быстрее, чем prefork (для доставки статического содержимого примерно в два раза) и использует меньше памяти.
Последнее (suphp_event), похоже, использует событие suPHP + MPM, которое снова использует другую модель процесса / потока, нежели рабочий. Из тестов, которые я видел, события и работники имеют примерно одинаковую скорость - событие MPM (по крайней мере, с использованием Apache 2.2, что, вероятно, делает ваш провайдер) помечено как экспериментальное.
mod_php, mod_php_ruid2 и mod_php_itk
Это другой вид реализации обработчика PHP: Apache предварительно запускает среду выполнения PHP и передает ей входящие запросы, порождая новые процессы по мере необходимости. Это значительно быстрее, чем suPHP, но имеет недостаток отсутствия разделения прав пользователя: все процессы php работают с теми же правами, что и сам Apache.
Первый вариант, вероятно, использует prefork MPM (описанный выше), так как mod_php несовместим с моделями потоков из worker или event.
Второй вариант (mod_php_ruid2), кажется, дополнительно использует модуль Apache mod_ruid2, который позволяет вам запускать каждый Apache VirtualHost с различными правами пользователя - это включает процессы PHP. У этого есть длинный список несовместимостей, которые вы должны рассмотреть.
В последнем варианте (mod_php_itk) используется сторонний ITK MPM для Apache, разветвленная версия prefork MPM Apache с опцией запуска каждого VirtualHost с заданными правами пользователя. Это также дает вам возможность применять дополнительные ограничения (например, количество клиентов) для VirtualHost.
Предложение
Если это ваш единственный выбор, и вы "одиноки" на своей Машине (иначе: вы не планируете общий хостинг), я бы, вероятно, выбрал хороший mod_php.
Если вы планируете несколько веб-сайтов, вы должны проверить с вашими приоритетами:
- безопасность за производительность: идти с suphp_worker. Оба (рабочий MPM и suPHP) широко протестированы и дают вам хорошую отправную точку для безопасности. Производительность для статических файлов должна быть хорошей, PHP не такой большой.
- производительность за безопасность: вероятно, mod_php_ruid2, но только потому, что у меня плохой опыт работы с ITK
Я предпочитаю использовать третий вариант, который использует FastCGI, предоставляя вам еще больше возможностей для разделения прав и доступа к привилегиям - но это, похоже, не предлагается.