Como testar rapidamente sites com o servidor Web embutido do PHP

Publicados: 2022-08-11

Ilustração mostrando o logotipo do PHP

Precisa iniciar rapidamente um servidor web para testar um aplicativo PHP? O interpretador PHP tem um built-in! Você pode usar isso para inspecionar rapidamente seu trabalho sem executar Apache, NGINX ou uma solução de conteinerização.

O servidor integrado do PHP recebe relativamente pouca atenção, mas é bastante poderoso para fins de desenvolvimento. Neste guia, mostraremos como você pode usá-lo como alternativa a outros micro-servidores como o SimpleHTTPServer do Python ou o pacote http-server npm, nenhum dos quais pode executar scripts PHP.

Usando o servidor integrado

O servidor integrado é um mecanismo de conveniência para ajudá-lo a testar sites PHP em ambientes que não possuem um servidor HTTP completo. Está disponível no PHP 5.4 e em todas as versões posteriores. Você pode executá-lo diretamente do seu diretório de trabalho sem precisar configurar um host virtual primeiro.

Antes de usar o servidor, esteja avisado de que ele foi projetado apenas para uso em desenvolvimento. A documentação do PHP adverte explicitamente contra a implantação deste servidor na frente de aplicativos de produção. Não é suficientemente seguro para ser exposto em redes publicamente acessíveis.

Iniciando o servidor

O servidor é iniciado passando o sinalizador -S para o executável php :

 $ php -S localhost:8080
[Sex 10 de junho 16:00:00 2022] Servidor de desenvolvimento PHP 8.1.5 (http://localhost:8080) iniciado

O argumento dado ao comando especifica o endereço de escuta do servidor. Usamos a porta 8080 no localhost no exemplo acima. Agora você pode visitar http://localhost:8080 em seu navegador da Web para acessar o conteúdo em seu diretório de trabalho. Quaisquer scripts PHP serão executados automaticamente quando você os solicitar.

Você pode servir um caminho que está fora do seu diretório de trabalho definindo o sinalizador -t ao iniciar o servidor:

 $ php -S localhost:8080 -t /home/$USER/public_docs

A raiz do documento agora será /public_docs em sua pasta pessoal.

Mantenha a janela do terminal aberta enquanto estiver usando o servidor web. Pressione Ctrl+C para encerrar o processo quando terminar de testar seu site. O PHP registrará cada solicitação recebida em sua janela de terminal, incluindo o URI e o método HTTP. Quaisquer erros PHP não detectados também aparecerão nos logs.

Ativando o acesso remoto

Ouvir no localhost não permitirá conexões de entrada de outros dispositivos em sua rede. Você pode permitir o acesso remoto vinculando-se a 0.0.0.0 :

 $ php -S 0.0.0.0:8080

Lembre-se de que o servidor não está protegido para uso em produção e não deve ser exposto publicamente. Permita acesso remoto apenas quando for absolutamente necessário, como ao testar um recurso específico em um dispositivo móvel. Verifique se a porta que você usa não está aberta para a Internet.

Solicitar correspondência de fallback

O PHP procurará os arquivos index.php e index.html na raiz do documento ativo quando a solicitação recebida não tiver um componente URI. Se nenhum desses arquivos existir, o servidor continuará subindo na árvore de diretórios, procurando um índice em um dos pais da raiz do documento. Isso significa que você pode, sem querer, acabar servindo conteúdo que está fora do diretório que você especificou. Um status 404 Not Found será emitido quando o topo da árvore for alcançado sem que um arquivo de índice seja encontrado.

As solicitações que incluem um URI (como /file ) devem ser correspondidas exatamente por um arquivo estático na raiz do documento. Caso contrário, um 404 será devolvido. O PHP define automaticamente o cabeçalho de resposta Content-Type para o tipo MIME do arquivo servido para as extensões de arquivo mais populares.

Usando um script de roteador

Opcionalmente, você pode configurar o servidor web para chamar um script em cada solicitação. Isso permite que você use o front controller do seu aplicativo para executar roteamento dinâmico avançado.

A funcionalidade do roteador é habilitada fornecendo um nome de arquivo PHP na linha de comando quando você inicia o servidor:

 $ php -S localhost:8080 roteador.php

O PHP agora usará router.php para lidar com todas as requisições recebidas. Você pode rotear usuários para o ponto apropriado em seu aplicativo inspecionando o URI de solicitação:

 if ( $_SERVER [ "REQUEST_URI" ] === "/dashboard" ) {
    require_once ( "dashboard.php" ) ;
}
senão if ( $_SERVER [ "REQUEST_URI" ] === "/profile" ) {
    require_once ( "profile.php" ) ;
}
senão {
    require_once ( "404.php" ) ;
}

A saída produzida pelo script do seu roteador se tornará a resposta enviada de volta ao cliente. Uma exceção é se o script retornar false : neste caso, o PHP retornará para retornar o arquivo estático que corresponde ao URI da solicitação original.

 if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // Rotear para o endpoint de API correto
    // ...
}
senão {
    // Servir outras rotas estaticamente
    retornar falso ;
}

Detectando o servidor interno do seu código PHP

Seu código PHP pode detectar se está sendo chamado pelo servidor web integrado inspecionando o nome da interface ativa. A função php_sapi_name() fornece esse valor. Será definido como cli-server quando o script for invocado pelo componente do servidor integrado.

 if ( php_sapi_name ( ) === "cli-server" ) {
    enable_development_mode ( ) ;
}

Lidando com várias solicitações simultaneamente

O servidor assume como padrão a execução em um modo síncrono de processo único por padrão. As solicitações são tratadas individualmente e bloqueiam a execução umas das outras até serem concluídas. Esta é uma das razões pelas quais o servidor não é adequado para uso em produção.

O PHP 7.4 adicionou suporte para lidar com várias solicitações simultaneamente. Ele depende da disponibilidade de fork() e não funciona no Windows. O servidor bifurcará um novo trabalhador para atender a cada solicitação recebida quando esse modo estiver ativado. Você pode ativá-lo definindo a variável de ambiente PHP_CLI_SERVER_WORKERS para o número de trabalhadores que você deseja:

 $ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

Esta funcionalidade ainda está marcada como experimental no PHP 8.1.

Resumo

O PHP possui um servidor web integrado que é uma maneira conveniente de testar seus aplicativos e expor rapidamente o conteúdo do sistema de arquivos local em sua rede local. Ele suporta execução de scripts PHP, roteamento catch-all e arquivos estáticos com os tipos MIME mais comuns.

Embora o servidor agora suporte um modo de bifurcação opcional, não é aconselhável usá-lo em produção. Destina-se a auxiliar o desenvolvimento e não possui os recursos de personalização e segurança necessários para suas implantações públicas. Onde se destaca é como uma alternativa leve e integrada às plataformas de desenvolvimento convencionais, como contêineres WAMP, XAMPP e Docker.