Como usar o servidor nativo do PHP

Como usar o servidor nativo do PHP 5.4

Até o PHP 5.3, era necessário instalar um Servidor Web, como o Apache, Nginx ou IIS, para executar scripts PHP pelo navegador.

Em ambientes de desenvolvimento, onde há, em geral, apenas um usuário fazendo requisições HTTP para os testes, é um exagero rodar Apache para isso. É como matar formiga com canhão.

Felizmente, a partir do PHP 5.4, há um servidor nativo para testes locais. Assim, não é necessário instalar um servidor web em seu ambiente de desenvolvimento.

Vale lembrar que esse é um servidor simples, monothread, apenas para testes. Não o utilize em ambientes de produção!

Tendo o PHP 5.4, instalado, vá até o diretório onde deseja executar o servidor (raiz do seu projeto web), e executar no Terminal (Console, Prompt ou seja lá como queira chamá-lo) o seguinte comando:

cd diretorio/do/seu/projeto/web
php -S localhost:8080

localhost é o endereço. Pode ser um IP (127.0.0.1, por exemplo) ou um hostname, como localhost. A porta pode ser qualquer porta livre. Usei 8080 como exemplo, mas poderia ser a própria porta 80, desde você tenha permissão para usar portas abaixo de 1024 (é necessário ser root para isso).

Após isso, pode acessar o endereço http://localhost:8080 em seu navegador, e verá seus arquivos. Para encerrar o servidor, basta digitar, no terminal, CTRL+C.

Esse servidor não possui suporte a Mod Rewrite, então não é possível usar .htaccess, como no Apache ou no Nginx.

Porém existe uma forma de obter o mesmo comportamento. Basta usar um arquivo de rotas.

Crie o arquivo route.php (ou outro nome que preferir) com este conteúdo:

<?php
 
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
    // exibe o arquivo requisitado
    return false;
}
else
{
    // exibe sempre a index.php
    include __DIR__ . '/index.php';
}

Isso fará com que todas as requisições (exceto imagens) sejam enviadas para o arquivo index.php.

Depois basta iniciar o servidor chamando o arquivo de rotas:

php -S localhost:8000 route.php
  • Fiz os testes no servidor built-in do PHP logo que a versão 5.4 foi lançada com essa novidade.
    Gostei bastante do serviço por ser rápido no response e consumir poucos recursos da máquina.
    Além disso aceita muito bem rewrites.

    • Ronaldo

      Beraldo, eu tentei usar o mod_rewrite com o servidor nativo, mas não está funcionando.

      Segue meu exemplo:
      criei um arquivo php chamado teste.phpm segue código fonte abaixo:

      Criei o .htaccess, segue abaixo:

      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

      Sendo que, quando digito: localhost/categorias, era para imprimir categorias, porém não imprime nada.
      O que estou fazendo de errado?

      • Olá, Ronaldo

        O servidor nativo não lê o .htaccess. É necessário passar um arquivo de rotas, como este:

        if (preg_match(‘/\.(?:png|jpg|jpeg|gif)$/’, $_SERVER[“REQUEST_URI”])) {
        return false;
        }
        else
        {
        include __DIR__ . ‘/index.php’;
        }

        Depois inicie o servidor:

        php -S localhost:8000 route.php

        Atualizei o post com essa informação. Dê uma olhada ;)

        Abraço

  • Danilo

    Cara, muito bom o post! Desconhecia dessa opção.
    Só corrigindo ali, pra parar no Windows, é Ctrl+C, também :)

    • Obrigado pela correção, Danilo. Já arrumei o post.

      CTRL+Z no Windows é End-Of-File, o mesmo que CTRL+D em Unix-Like. Eu me confundi na hora de escrever, mesmo. :)

  • Guilherme

    Não entendi direito como usar o servidor nativo do PHP no windows. Preciso baixar o php para windows e usar, só isso?
    Aparentemente fiz tudo como está no post, mas não deu certo.

    • Por que não deu certo? O que ocorreu? Deu erro? Se sim, qual?
      Não testei no Windows, mas conheço quem já testou e funcionou corretamente.

  • Tiago

    Ótimo “post”. Funcionou perfeitamente no meu linux.

  • Pingback: As Diferentes Formas de Execução do PHP - Blog do Beraldo()

  • Pingback: 6 Dicas Para Estudar PHP Do Jeito Certo - Profissionais TI()

  • Pingback: Composer: o gerenciador de dependências para PHP()

  • Pingback: Composer: Gerenciamento Ágil de Dependências com PHP()

  • Pingback: URLs Amigáveis Sem .htaccess Usando Slim()

  • Pingback: Sistema de Cadastro com PHP e Laravel Em 1 Minuto()

  • Pingback: MVC: Uma Estrutura Básica Com PHP Orientado a Objetos()

  • Helder Tosta

    Bom Dia Beraldo, primeiramente parabéns pelo conteúdo de excelente qualidade.
    Eu tenho uma dúvida quanto ao servidor nativo do php. Quando eu clico em um link que redireciona para outro arquivo do meu projeto o apache redireciona automaticamente, porém o php não coloca o nome da pasta na url, fazendo assim com que o navegador mostre como arquivo não encontrado. Como posso resolver isso?

    • Olá. Primeiramente, obrigado! :)
      Como está o link? Provavelmente está sem a pasta. Se o apache gera outro link, deve ser uma regra do .htaccess. O link clicado é enviado ao navegador pelo próprio HTML, o PHP só entra na brincadeira quando a requisição é feita.

      • Helder Tosta

        São dois arquivos na pasta raiz do meu sistema. Quando acesso localhost/meuprojeto ele já vai direto no arquivo localhost/meuprojeto/index.php só que quando clico no link que leva para o arquivo cadastro.php que fica no mesmo diretório ao invés de ir para o caminho localhost/meuprojeto/cadastro.php ele tenta acessar o caminho localhost/cadastro.php.

        • Mas como está o link? Qual é o HTML da tag que você está clicando?

          • Helder Tosta

            o link está simplesmente assim:
            Cadastro
            Pois o arquivo está na mesma pasta.

            • De fato, o servidor vai para a raiz. Eu nunca tinha passado por isso.
              De qualquer forma, é sempre ideal usar caminhos completos. Isso evita esse tipo de problema. Também existe a opção -t, que altera o diretório raiz, ou seja, o DocumentRoot.
              De qualquer forma, o ideal seria usar um sistema de rotas, como explico neste artigo: http://rberaldo.com.br/urls-amigaveis-sem-htaccess-usando-slim/

              • Helder Tosta

                Ok muito obrigado pela atenção e pelas dicas.

              • Helder Tosta

                Acabei descobrindo o problema. O erro estava acontecendo porque eu iniciei o servidor nativo do php em um diretório que tinha vários projetos em subdiretórios. No caso o problema foi resolvido quando eu iniciei o servidor a partir do diretório do projeto específico.

                • O ideal é iniciar na raiz do projeto, mesmo. Outra possibilidade é usar a opção -t, como sugeri antes. O efeito é praticamente o mesmo.
                  Que bom que resolveu :)