Posted on: January 29, 2020 12:18 PM
Posted by: Renato
Categories: PHP
Views: 376
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:
É 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
Donate to Site
Renato
Developer