FrankenPHP: servidor de aplicações PHP moderno
(frankenphp.dev)- Em fluxos de deploy que querem subir apps PHP sem um PHP-FPM separado, o FrankenPHP é um servidor de aplicações baseado em Go que incorpora o runtime oficial de PHP no Caddy, permitindo executar aplicações web PHP e scripts CLI com um único comando
- Reúne como recursos padrão HTTP/1.1, HTTP/2, HTTP/3, certificados HTTPS automáticos, compressão Brotli/Zstandard/Gzip, logging estruturado e métricas Prometheus, reduzindo a necessidade de configuração do servidor
- O modo Worker inicializa a aplicação uma vez e a mantém em memória, e afirma ter obtido resultado 3,5 vezes mais rápido que o FPM em benchmark próprio da aplicação API Platform
- É compatível com PHP 8.2+, a maioria das extensões PHP e módulos do Caddy, e também oferece suporte nativo a extensões populares como OPcache e XDebug
- Suporta imagem Docker, Kubernetes, plataformas de nuvem e distribuição como binário estático independente, o que pode simplificar a unidade de deploy de aplicações PHP
Forma de execução e fluxo básico de uso
- O FrankenPHP se propõe a ser um servidor de aplicações PHP moderno escrito em Go, estruturando a instalação e a execução do servidor de aplicações PHP em torno de um único comando
- Os exemplos de instalação são divididos por sistema operacional
- Linux/macOS:
curl https://frankenphp.dev/install.sh | sh - Windows PowerShell:
irm https://frankenphp.dev/install.ps1 | iex
- Linux/macOS:
- A execução local cobre tanto servidor web quanto CLI
frankenphp php-server -r public/: serve o diretóriopublic/frankenphp php-cli script.php: executa um script PHP de linha de comando
- A execução com Docker também usa a mesma imagem
- A imagem
dunglas/frankenphpserve o diretóriopublic/ - Na mesma imagem, também é possível executar scripts CLI como
php script.php
- A imagem
- A configuração é baseada em Caddy, e o exemplo ativa compressão dentro do bloco
localhoste usaphp_serverpara processar arquivos PHP e assets estáticos do diretório atual
Recursos do servidor e compatibilidade com PHP
-
Recursos do servidor web
- Incorpora o runtime oficial de PHP ao Caddy
- Suporta nativamente HTTP/1.1, HTTP/2 e HTTP/3
- Automatiza a criação, renovação e revogação de certificados HTTPS via Let’s Encrypt ou ZeroSSL
- Suporta por padrão compressão Brotli, Zstandard e Gzip
- Inclui logging estruturado e suporte a Prometheus
-
Ambiente de execução PHP
- Compatível com PHP 8.2+, a maioria das extensões PHP e todos os módulos do Caddy
- Oferece suporte nativo a extensões PHP populares, incluindo OPcache e XDebug
- Não requer PHP-FPM e usa sua própria SAPI criada para o servidor web em Go
Modo Worker e recursos voltados a desempenho
- O modo Worker inicializa a aplicação uma vez e a mantém em memória, deixando-a pronta para processar requisições em poucos milissegundos
- Há suporte nativo em Symfony, API Platform e Laravel
- Usa os superglobais tradicionais do PHP sem PSR-7
- Mesmo que a aplicação não seja compatível com o modo Worker, ela ainda pode ser servida normalmente
- Oferece um watcher que reinicia automaticamente os workers quando o código muda
- É apresentado como tendo desempenho 3,5 vezes superior ao FPM em benchmark próprio baseado em uma aplicação API Platform
Deploy e empacotamento
- É possível fazer deploy de aplicações cloud-native com a imagem Docker
- É compatível com Kubernetes e plataformas modernas de nuvem
- Aplicações web PHP e ferramentas de linha de comando podem ser empacotadas como binários estáticos independentes
- O projeto afirma que roda como um único serviço e um único binário, sem necessidade de serviços externos
Recursos adicionais da plataforma web
- Suporta 103 Early Hints e apresenta o recurso, com base em um artigo da Cloudflare, como capaz de melhorar o tempo de carregamento de sites em 30%
- Por meio do hub Mercure embutido, é possível enviar eventos de uma aplicação PHP para navegadores conectados, que podem receber o payload imediatamente como eventos JavaScript
- Suporta deploy sem downtime com graceful reload
1 comentários
Opiniões no Hacker News
O personagem de elefante Frankenstein é estranho, feio e fofo. O design, as cores, o texto e as animações também são bem caprichados. Para alguém que ficou afastado do desenvolvimento em PHP por um tempo, a proposta de valor fica clara, e parece bom para começar algo pequeno rapidamente
Não quero subir 8 contêineres para isolar software ruim ou dependências enroladas. Não gosto da ideia de empacotar um “funciona na minha máquina” e jogar para o mundo em vez de entregar software instalável. Pela nostalgia, talvez eu mexa um pouco, mas não sei se ainda quero colocar algo assim em produção
Em vez de seguir o caminho antigo do LAMP, que exigia uma configuração um tanto complexa do Apache, é para esse tipo de direção que a linguagem deveria ir
Também pretendo experimentar isto, mas nunca encontrei gargalo com nginx nem com Apache. Dá para subir ambos em alguns minutos, no máximo
Ele roda como um serviço único, como Apache + mod_php, lida com multiprocessamento de PHP e outras linguagens, arquivos estáticos e proxy reverso, e permite configurar tanto ele próprio quanto o PHP em uma única configuração em runtime via arquivo ou socket: https://unit.nginx.org/configuration/#php
Um exemplo real de configuração é https://github.com/PrivateBin/docker-unit-alpine/blob/master..., e a imagem de contêiner resultante também pode ficar bem pequena: https://hub.docker.com/r/privatebin/unit-alpine
Não me lembro de ter feito muita coisa além de reiniciar o Apache
É basicamente
LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so"eSetHandler "proxy:fcgi://127.0.0.1:9000". Também há um exemplo de Nginx conceitualmente parecido com a forma de configurar o Apache, incluindo a instalação dos pacotes necessários: https://news.ycombinator.com/item?id=37443911Também existem imagens de contêiner pré-compiladas que dão um resultado parecido, mas, se quiser ver como funciona por dentro, dá para fazer manualmente. Com certeza é mais fácil do que configurar manualmente Tomcat ou GlassFish em servidores de aplicação Java antigos e, embora um único comando de execução seja melhor em qualquer ambiente, o LAMP não é tão ruim assim em comparação com outras stacks
Tendo um binário, também fica fácil empacotá-lo em um app Electron
php -S 0.0.0.0:8000 public/index.phpMas ele é single-thread e lento, então não serve para produção. O FrankenPHP parece promissor, mas o problema de limitação de cores/threads[2] também parece poder ser um problema em produção. Ainda assim, talvez eu aplique no projeto pure-todo[1] para ver se o mesmo problema aparece. A imagem Docker padrão parece muito boa
1: https://github.com/sandreas/pure-todo
2: https://github.com/dunglas/frankenphp/discussions/294
Veja o aviso no topo da página: https://www.php.net/manual/en/features.commandline.webserver...
Nem sei se é justo usá-lo como comparação nesse contexto
PHP_CLI_SERVER_WORKERS, dá para executá-lo com várias threadsPara um site pequeno com poucos usuários, eu gostaria de saber o que se perde em relação a outros ambientes “prontos para produção”
Dizem que fica pronto para produção com poucos comandos e é 3,5 vezes mais rápido que FPM, mas, no meu ambiente, funcionou com cerca de 1% do desempenho do FPM. Também tentei o executável, mas o problema foi o mesmo; para um hello world, eu esperava pelo menos 200K rps
Na maioria dos benchmarks, quando o modo worker está ativado, o FrankenPHP costuma ser muito mais rápido que o FPM, cerca de 3 vezes mais. Ainda assim há alguns casos de exceção, e estamos corrigindo isso junto com os mantenedores do PHP
É uma situação bem estranha, porque o próprio Caddy tem desempenho muito bom quando usado com PHP
No momento está lá embaixo como did not complete
Há problemas de desempenho. Tirando isso, é um projeto realmente promissor
Mas não me aprofundei, e os testes foram feitos dentro do Docker, não em uma configuração comum. O WordPress também estava praticamente na configuração padrão, sem temas pesados, então não eram condições realistas. Ainda assim quero refazer os testes e entender melhor
Ainda assim, com 103 Early Hints, dá para pré-carregar assets e reduzir a latência de carregamento da página em 30%. Mesmo assim, o FrankenPHP facilita ativar cache HTTP no WordPress e também simplifica a implantação. Há também um projeto específico para WordPress e FrankenPHP, que inclui um cache HTTP embutido personalizado para WordPress usando a biblioteca Go Souin: https://github.com/StephenMiracle/frankenwp
Dá para economizar um pouco mais de memória do Apache e abrir espaço para lidar com mais requisições PHP
docker run -v $PWD:/app/public -p 443:443 \ dunglas/frankenphpSe quiser criar diretamente um contêiner Docker para servir o app, os comandos abaixo parecem suficientes para transformar um Debian novo no contêiner necessário:
apt install -y apache2 libapache2-mod-phpe a configuração de/etc/apache2/sites-enabled/000-default.confJunto com amigos, mantenho um repositório que mostra o processo de ir do zero até uma aplicação web em execução em várias linguagens e frameworks populares: https://github.com/no-gravity/web_app_from_scratch
Toda vez que ativo o xdebug, preciso reiniciar o Apache depois da sessão de depuração. Desde ontem comecei a configurar o apache2 para usar php-fpm, e me pergunto se este FrankenPHP serviria para nós, ao menos no ambiente de desenvolvimento. Mas não encontrei na documentação como instalar extensões do PHP
000-default.confdo Apache faz redirecionamento de 443 para 80?O FPM e sua arquitetura shared-nothing foram fundamentais para o sucesso do PHP no passado, mas ao mesmo tempo sinto que também foram as correntes do PHP