PHP-FPM: Você sabia?

PHP-FPM, mas você sabe como funciona?
FPM é um gerenciador de processos para gerenciar o FastCGI SAPI (Server API) em PHP.
O PHP-FPM é um serviço e não um módulo. Este serviço é executado completamente independente do servidor web em um processo à parte e é suportado por qualquer servidor web compatível com FastCGI (Fast Common Gateway Interface).
PHP-FPM é consideravelmente mais rápido que os outros métodos de se processar scripts php, e também é escalável, ou seja é possível construir clusters e expandir a capacidade do PHP de receber requisições.
Com o PHP-FPM os elementos e as instruções invocadas são guardados em memória, ou seja, é a implementação de uma cache ao nível do servidor para ser reutilizada diretamente se o pedido for novamente executado. Por esse motivo, o arquivo PHP é requisitado bem menos vezes, o que se traduz num decréscimo da carga de máquina (load average) e de uma melhor disponibilidade de recursos para que possa efetuar outros trabalhos.
O PHP-FPM pode invocar “processo filhos” dentro de um mesmo “worker pool”, separando completamente o processamento de um script PHP de outro. Essas propriedades são configuradas no arquivo da “pool”, por padrão é definido a pool “www”.
Basicamente o servidor web envia uma requisição PHP para o o PHP-FPM que então envia para um de seus filhos, e executa até que seja entregue a resposta.

Veja o diagrama abaixo:

NOTA: É imporante resaltar que para o php-fpm em modo tcp e em servidor diferente do servidor web, é preciso ter os scripts php em cada um desses servidores.

É possível realizar diversas configurações para as pools do php-fpm, veja o exemplo de arquivo de configuração da pool www em www.config:

; Nome da pool 'www'.
;Os comentários são feitos com ";"
[www]
;listen = 127.0.0.1:9000 ; É possível abrir um socket TCP ipv4 ou,
listen = /srv/run/php5-fpm.sock ; Definir um unix socket

;listen.allowed_clients = 127.0.0.1 ; No socket ipv4, é possível restringir  quem se conecta à ele.
; No modo unix socket é preciso definir um usuário e um grupo, o arquivo socket será criado com essas propriedades.
listen.owner = lighttpd
listen.group = lighttpd
listen.mode = 0666


; É preciso configurar sob qual usuário o processo irá rodar.
user = lighttpd
group = lighttpd

; É possível alterar valores do php.ini para uma determinada pool.
php_admin_value[error_log] = /var/log/php-fpm/$pool.log ; É possível usar algumas variáveis, $pool é o nome da pool ("www")
php_admin_value[memory_limit] = 2G ; Vale lembrar que o memory_limit é para cada processamento php, ou seja, um filho pode chegar ao limite de 2G se você definir essa configuração.

; Configuração de como o gerenciador de processo irá administrar os processo filhos.
; Os Valores possíveis são: 
; static - um valor fixo de processos filhos (pm.max_children) é definido e é imutável.
; dynamic - o número de processos filhos é definido de forma dinâmica com base no
; seguintes diretivas:
; pm.max_children - o número máximo de processos filhos que podem fique vivo ao mesmo tempo.
; pm.start_servers - o número de processos filhos criados na inicialização.
; pm.min_spare_servers - o número mínimo de processos filhos em "ocioso" estado (esperando para processar). Se o número
; dos processos "ociosos" for menor do que o definido.
; pm.max_spare_servers - o número máximo de processos filhos em "ocioso" estado (esperando para processar). Se o número
; dos processos "ociosos" for maior do que o definido. Processos ociosos são matados caso o número seja superior ao definido nessa directiva.

pm =  dynamic ; 

;  max_children * php_admin_value[memory_limit] deve ser menor que o Total Memory RAM disponível para o PHP-FPM.
pm.max_children = 120

pm.start_servers = 36 ; Valor padrão: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.min_spare_servers = 15
pm.max_spare_servers = 50
pm.max_requests = 200 ; Número de requisições que um processo recebe antes de ser reiniciado.
pm.process_idle_timeout = 5s ; Tempo de tolerância de um processo ser ocioso, procesos ociosos por mais tempo que isso serão mortos.

Há funções que podem ou não ser usadas no PHP-FPM, como por exemplo o fastcgi_finish_requestque permite você entregar a reposta de forma parcial fechando a conexão http com o cliente e continuar processando algo no php em background.

Fonte: https://pt.stackoverflow.com/questions/207464/como-funciona-o-php-fpm

Renato Lucena

Developer PHP, Laravel. Goiania-GO https://www.linkedin.com/in/renato-de-oliveira-lucena-33777133/

Você pode gostar...