CGI против FastCGI

задняя часть PHP сервер Nginx

Важный вывод

  • Nginx+PHP-FPM может достигать в 5-10 раз больше, чем Apache+mod_php5 при высоком уровне параллелизма.Сейчас все больше и больше людей используют nginx+PHP-FPM.

CGI

  • Английский CGI - это (ОБЩИЙ ИНТЕРФЕЙС ШЛЮЗА) общедоступный интерфейс шлюза. Сервер не может напрямую запускать файлы, такие как php и asp. Его функция состоит в том, чтобы помочь серверу взаимодействовать с языком. Вот связь между nginx и php, потому что язык nginx и php отличаются, поэтому требуется процесс преобразования связи, а CGI является протоколом для этой связи.
  • После того, как сервер nginx получит данные, переданные браузером, если запрос представляет собой статическую страницу или изображение, не требующее динамической обработки, он напрямую найдет свое местоположение в соответствии с запрошенным URL-адресом и вернет его в браузер. для участия PHP здесь, но если это запрос динамической страницы. В это время nginx должен взаимодействовать с php. В это время протокол cgi будет использоваться для преобразования данных запроса в информацию, которую может понять php, а затем информация, возвращаемая php на основе этой информации, также должна пройти протокол cgi, преобразовать ее в информацию, которую может понять nginx, и, наконец, nginx получает эту информацию и возвращает ее в браузер.

fast-cgi

  • Традиционный протокол cgi будет открывать процесс для обработки каждый раз, когда делается запрос на соединение, и процесс будет закрыт после обработки, поэтому при следующем соединении нужно будет снова открыть процесс для обработки, поэтому процессов cgi столько, сколько есть соединения. , вот почему традиционные cgi могут казаться медленными, поэтому слишком много процессов потребляют ресурсы и память.

  • Fast-cgi — это процесс, который может обрабатывать несколько запросов, что полностью отличается от приведенного выше протокола cgi.cgi — это процесс, который может обрабатывать только один запрос, что приведет к большому количеству программ cgi, что создаст нагрузку на сервер.

php-cgi:

  • php-cgi — это программа интерфейса протокола cgi, предоставляемая php для веб-сервиса, то есть внешнего сервера http.При получении запроса от внешнего сервера http процесс php-cgi будет открыт для обработки, и процесс открытия php-cgi будет Во-первых, вам нужно перезагрузить конфигурацию, структуру данных и инициализировать работающую среду.Если вы обновляете конфигурацию php, вам нужно перезапустить php-cgi, чтобы он вступил в силу, например, phpstudy.

php-fpm:

  • php-fpm - это программа интерфейса протокола fastcgi, предоставляемая php для веб-сервера, который является внешним сервером http.Он не перезапускает процесс каждый раз, когда он подключается, как php-cgi, а затем закрывает процесс после обработки запроса, но позволяет процессу обрабатывать несколько подключений без немедленного закрытия процесса, но продолжает обрабатывать следующее подключение. Можно сказать, что это программа управления php-cgi и улучшение php-cgi.
  • php-fpm открывает несколько программ php-cgi, а php-fpm находится в памяти.Каждый раз, когда веб-сервер отправляет соединение, php-fpm назначает информацию о соединении одной из следующих подпрограмм, php-cgi, для обработки. обработке, то php-cgi не закроется, а продолжит ждать следующего подключения, что тоже является принципом ускорения fast-cgi, но т.к. php-fpm мультипроцессный, а php-cgi в основном потребляет 7 -25M памяти, поэтому если подключений слишком много, это вызовет чрезмерное потребление памяти и вызовет некоторые проблемы, например, 502 ошибки в nginx.

В то же время php-fpm также имеет некоторые другие функции:

  • Например, для плавного перехода изменения конфигурации обычный php-cgi нужно перезапускать для инициализации новой конфигурации после каждого изменения конфигурации, тогда как php-fpm в этом не нуждается, php-fpm отправляет новые соединения в новую подпрограмму php -cgi, в это время загружается новая конфигурация, а исходный работающий php-cgi по-прежнему использует исходную конфигурацию.После этого соединения следующее соединение будет инициализировано с новой конфигурацией, что является плавным переходом.

Схема

Весь рабочий процесс FastCGI

  • Загружать диспетчер процессов FastCGI (модуль IIS ISAPI или Apache) при запуске веб-сервера.
  • Менеджер процессов FastCGI инициализирует себя, запускает несколько процессов интерпретатора CGI (несколько видимых php-cgi) и ожидает соединения с веб-сервером.
  • Когда клиентский запрос поступает на веб-сервер, менеджер процессов FastCGI выбирает интерпретатор CGI и подключается к нему. Веб-сервер отправляет переменные среды CGI и стандартный ввод в подпроцесс FastCGI php-cgi.
  • Подпроцесс FastCGI возвращает стандартный вывод и сообщения об ошибках из того же соединения на веб-сервер, когда он завершает обработку. Запрос обрабатывается, когда дочерний процесс FastCGI закрывает соединение. Затем дочерний процесс FastCGI ожидает и обрабатывает следующее соединение от диспетчера процессов FastCGI (работающего на веб-сервере). В режиме CGI здесь завершается работа php-cgi.