I. Сравнение САПИЕНСОВ
1. САПИ
Интерфейс программирования серверных приложений – это интерфейс между сервером и языком программирования. Например, командная строка Linux выполняет фрагмент PHP-кода. Фактически, оболочка Linux передает набор параметров через PHP SAPI, а движок Zend возвращается в оболочку после выполнения. На всех этапах жизненного цикла PHP некоторые операции, связанные с обслуживанием, реализуются через интерфейсы SAPI.
Php_sapi_name() allows you to see the type of current SAPI interface. For example, cli (php-r "echo php_sapi_name ();"), fpm-fcgi, etc.
2. Четыре этапа запуска и загрузки PHP
Фаза инициализации модуля Minit может инициализировать расширение PHP, внутренние переменные библиотеки классов, константы регистрации, определение классов, используемых модулями, и т.д.
(2) Этап инициализации запроса Rinit, после инициализации и активации модуля, создаст рабочую среду PHP, инициализирует переменные среды, необходимые для этого запроса, такие как $_SERVER,$_SESSION
。
((3) На этапе закрытия запросов на завершение работы выполняется окончательная очистка, и освобождаются все ресурсы (переменные приложения) для обработки этого запроса. Завершение запроса может выполняться до тех пор, пока сценарий не будет завершен, или это может быть сделано путем вызова функций die () или exit ().
((4) Фаза рециркуляции модуля выключения, которая используется для выключения собственной подсистемы ядра и освобождения памяти.
3. Режимы работы SAPI 5
(1) В режиме одного процесса (CLI, CGI) при каждом выполнении PHP-скрипта выполняются четыре события INT и завершения работы, описанные в части II. Когда количество запросов пользователей очень велико, системные ресурсы, такие как память, время процессора и так далее, будут переполнены, что приведет к большим системным накладным расходам.
(2) Многопроцессорный режим (режим MPM с предварительной обработкой в Apache) приведет к разделению многих подпроцессов. Каждый подпроцесс имеет свое собственное независимое адресное пространство процесса. В подпроцессе жизненный цикл PHP заключается в вызове MINT для запуска и выполнения нескольких запросов (УСТАНОВКА/ВЫКЛЮЧЕНИЕ). ЗАВЕРШЕНИЕ работы будет вызвано только после закрытия Apache или завершения процесса. В модели с несколькими процессами каждый подпроцесс выполняется независимо без кода и обмена данными, поэтому завершение, выход и регенерация одного подпроцесса не повлияют на стабильность других подпроцессов.
((3) Режим многопоточности (рабочий MPM Apache 2), который создает несколько потоков в рамках одного процесса и выполняется в одном и том же адресном пространстве процесса.
(4) Режим быстрого CGI, nginx + php-fpm-это этот режим, fast-cgi-это обновленная версия CGI, Быстрый CGI можно рассматривать как резидентный CGI, его всегда можно выполнить, после запуска он может разветвлять более одного процесса, не тратя время на подпроцесс динамического разветвления. Ему не нужно вызывать MINT/ВЫКЛЮЧАТЬ для каждого запроса. Встроенный режим, который позволяет вызывать функции, предоставляемые PHP на языке C/C++. Он проходит в четыре этапа, как и CGI.
II. Принцип работы php-fpm
- CGI: Это протокол, в котором сервер инициирует запросы, передает их синтаксическому анализатору PHP и решает, какие данные передавать и какой формат использовать.
- Fastcgi: Это протокол для повышения производительности CGI. Его не нужно инициализировать каждый раз. Этого процесса недостаточно. Он запустит несколько процессов заранее. Если процесс слишком простаивает, он немного остановится. FastCGI управляет процессом, повышает производительность и экономит ресурсы.
- Php-fpm: Программа для реализации протокола FastCGI официально принята PHP. Он также обеспечивает функцию управления процессами. Процесс включает в себя основной процесс и рабочий процесс. Существует только один главный процесс, который отвечает за прослушивание запросов на распределение портов и получение запросов от веб-сервера, в то время как рабочий процесс обычно имеет несколько (определенное количество настраивается в соответствии с фактическими потребностями). В каждый процесс встроен интерпретатор PHP, в котором действительно выполняется PHP-код.
- Php-cgi: процесс интерпретатора CGI
Принцип работы FastCGI:
- Загрузите диспетчер процессов FastCGI при запуске веб – сервера
- Диспетчер процессов FastCGI инициализируется, запускает несколько интерпретаторов CGI (см. php-cgi) и ожидает подключения с веб-сервера
- Когда запрос клиента поступает на веб-сервер, менеджер процессов FastCGI выбирает интерпретатор CGI и подключается к нему. Веб-сервер отправляет переменные среды CGI и стандартные входные данные в подпроцесс FastCGI php-cgi
- Подпроцессы FastCGI возвращают стандартные выходные данные и информацию об ошибках из того же подключения к веб-серверу после обработки. Когда подпроцесс FastCGI закрывает соединение, запрос сообщает о завершении обработки. Затем подпроцесс FastCGI ожидает и обрабатывает следующее соединение от менеджера наследования FastCGI
При использовании FastCGI системные издержки невелики. Кроме того, может работать непрерывное соединение между базой данных и кэшем электронной почты.
Короткое подключение к базе данных: На этапе закрытия запроса освобождаются ресурсы, используемые запросом, а также освобождается дескриптор подключения к базе данных.
Подключение к базе данных с длительным подключением pconnect: после закрытия запроса PHP примет соединение, даже если оно активно закроется, оно не закроется, а сохранит его. В следующий раз, когда поступит запрос на открытие того же соединения, PHP напрямую удалит сохраненный дескриптор, устраняя процесс установления соединения.
Php-fpm для достижения длинных подключений также необходимо взаимодействовать с некоторой конфигурацией базы данных, процесс размещает соединение, количество подключений к базе данных-это количество подпроцессов, поэтому количество допустимых подключений к базе данных больше, чем количество подпроцессов.
3. Три модели управления процессами Php-fpm
Php-fpm поддерживает три режима работы: статический, по требованию и динамический, которые по умолчанию являются динамическими.
- Статический: В статическом режиме при запуске выделяется фиксированный рабочий процесс. Просто подумайте о количестве max_childrens, в зависимости от количества процессоров и времени отклика приложения.
- Ondemand: распределение по требованию, при запуске процесс не выделяется, и процесс запускается только при получении запросов пользователей. Главный процесс проверяет, ограничено ли количество рабочих процессов, есть ли незанятые рабочие процессы, и не создает новых рабочих процессов. Главный процесс становится загруженным в системах с высоким трафиком, занимает ресурсы системного процессора и не подходит для развертывания в средах с высоким трафиком.
- Динамический: Динамический режим, в котором выделяются фиксированные процессы при запуске. По мере увеличения числа запросов рабочий процесс настраивается в пределах установленного плавающего диапазона.
PM = Dynamic // dynamic process management, for dedicated servers, can be set to static, static one-time start the maximum number of sub-processes, will not change. Pm.max_children = 50// maximum number of child processes, PS aux can be viewed Pm.start_servers = 20// Number of processes that will be started when the service is started Pm.min_spare_servers = 5 /// guarantees the minimum number of idle subprocesses. If the idle process is less than this value, the php-fpm service creates new subprocesses. Pm.max_spare_servers = 35 /// guarantees the maximum number of idle sub-processes, if the number of idle processes is higher than this value, clean up. Pm.max_requests = 500// Defines the maximum number of requests processed by a child process, reaches this value, and the process automatically exits. The purpose is to control the memory overflow and make the memory in a controllable range. But if the settings are small, it is possible for multiple processes to reach this value at the same time and restart at the same time, which will cause PHP to stop responding until the restart is complete. Setting to 0 means that requests are always accepted.
4. Медленный журнал Php-fpm
Если можно получить доступ к веб-сайту на PHP, скорость доступа замедляется. Благодаря журналу медленного выполнения php-fpm мы можем четко понимать, где выполнение PHP-скриптов занимает много времени, и он может находить определенные строки кода.
vim /usr/local/php/etc/php-fpm.d/www.conf Request_slowlog_timeout = 1// timeout slowlog = /usr/local/php/var/log/www-slow.log Restart php-fpm/etc/init.d/php-fpm reload
Я добавил строку в PHP-файл sleep(3);
После запуска возвращается результат
Ссылка
1. https://www.jianshu.com/p/c9a… три режима управления процессами php-fpm 2. Пять режимов работы https://www.jb51.net/article/… САПИ 3. http://blog.51cto.com/1260661… php-fpm медленный журнал 4. https://www.cnblogs.com/wpjam… длительное соединение между php-fpm и MySQL