← Stack web // stack web · back end · linguagem e plataforma

PHP: página dinâmica no servidor embutido

O PHP vem com um servidor de desenvolvimento dentro do próprio interpretador. Um comando no terminal e você já tem uma página que o servidor monta na hora, sem Apache, sem Nginx, sem arquivo de configuração.

O que PHP resolve

Uma página HTML salva no disco entrega o mesmo texto pra todo mundo, sempre. Preço, estoque, saldo, a data de hoje, o nome de quem acabou de entrar: nada disso cabe num arquivo fixo. Alguém precisa montar a página no instante em que o navegador pede.

PHP faz esse trabalho dentro do servidor. O código roda antes da resposta sair, monta o HTML com os valores daquele momento e entrega o resultado. O navegador recebe HTML comum e nunca vê o código que o gerou. Essa fronteira entre o que roda no servidor e o que roda no navegador separa o PHP do JavaScript que você escreve pra página.

Os conceitos que você precisa antes da primeira linha

  • Requisição e resposta. O navegador pede um endereço, o servidor devolve um texto. Todo código PHP roda entre esses dois momentos, na máquina do servidor. Cada F5 do visitante é uma requisição nova, e o código roda outra vez do começo.
  • Modo PHP. Um arquivo .php é HTML comum até aparecer a tag <?php. Daí em diante o texto vira código, até o ?>. Você entra e sai do modo PHP quantas vezes quiser no mesmo arquivo, e o que está fora das tags vai direto pro navegador.
  • echo. A instrução que escreve texto na resposta. O que você passa pro echo aparece no HTML que chega ao navegador, no lugar exato onde a tag estava.
  • Variável. Um nome começado por cifrão guarda um valor: $agora, $sorteio. As variáveis nascem e morrem dentro de uma requisição, então nada sobra de um acesso pro seguinte.
  • Servidor embutido. O interpretador da linha de comando traz um servidor de desenvolvimento, ligado com php -S. A documentação oficial avisa em caixa de alerta que ele serve pra desenvolver, testar e demonstrar em ambiente controlado, e que não deve ser usado em rede pública.

A linguagem por dentro: tipos, funções e objetos

PHP tem tipagem dinâmica com conversão automática: "5" + 2 vale 7, porque a linguagem converte o texto pra número antes de somar. É cômodo e é perigoso, e por isso o PHP moderno aceita declarar tipo em parâmetro, retorno e propriedade, além do modo estrito declare(strict_types=1) que desliga a conversão silenciosa.

  • Os tipos do dia a dia: int, float, string, bool, null e o array, que é o canivete da linguagem: serve de lista ([1, 2, 3]) e de mapa chave-valor (["nome" => "Ana"]) na mesma estrutura.
  • Função se declara com function, e desde o PHP 7 vale anotar os tipos: function soma(float $a, float $b): float.
  • Orientação a objetos: class com propriedades tipadas, construtor __construct, visibilidade (public/private) e herança com extends. O ecossistema que você vai encontrar em vaga (Laravel, WordPress moderno) é todo escrito assim.
<?php
// tipos, função e classe em doze linhas
$precos = [12.5, 30, 7];                 // array como lista

function formata(float $valor): string { // tipos declarados
    return "R$ " . number_format($valor, 2);
}

class Carrinho {
    private array $itens = [];           // propriedade tipada
    public function add(string $item): void {
        $this->itens[] = $item;          // acesso com ->
    }
}

echo formata(array_sum($precos));        // R$ 49.50

O cifrão nas variáveis e a seta -> no acesso a objeto são a assinatura visual da linguagem: acostume o olho com os dois e qualquer código PHP fica legível.

Hello world: uma página calculada na hora

Precisa de terminal, de um editor de texto e do PHP instalado. Nada de servidor web separado.

  1. Abra o terminal e confira se o PHP já está aí:

    php -v

    Se a resposta começar com a palavra PHP seguida de um número de versão, pule para o passo 3. Se o terminal disser que o comando não existe, faça o passo 2.

  2. Instale o PHP. No Debian, no Ubuntu e nas distribuições derivadas:

    sudo apt update
    sudo apt install php-cli

    O manual oficial mostra a linha completa com php-common e libapache2-mod-php para quem vai usar Apache. Para o servidor embutido, o pacote php-cli basta.

    No macOS, com Homebrew:

    brew install php

    No Windows, baixe o build em windows.php.net/download, escolha a versão Non Thread Safe de 64 bits, extraia o zip numa pasta como C:\php e abra o terminal dentro dela. Depois de instalar, rode php -v de novo para confirmar.

  3. Crie a pasta do projeto e entre nela:

    mkdir ola-php
    cd ola-php
  4. Dentro dessa pasta, crie um arquivo chamado index.php com este conteúdo:

    <?php
    date_default_timezone_set('America/Sao_Paulo');
    $agora = date('H:i:s');
    $sorteio = random_int(1, 100);
    ?>
    <!DOCTYPE html>
    <html lang="pt-BR">
      <head>
        <meta charset="UTF-8" />
        <title>Minha primeira página em PHP</title>
      </head>
      <body>
        <h1>Olá, mundo</h1>
        <p>O servidor montou esta página às <?php echo $agora; ?>.</p>
        <p>Número sorteado nesta requisição: <?php echo $sorteio; ?></p>
      </body>
    </html>

    A linha do fuso vem antes de tudo por um motivo prático. Uma instalação nova do PHP deixa date.timezone vazio no php.ini e o interpretador assume UTC, então o relógio da página sai três horas à frente de quem está no horário de Brasília. Com date_default_timezone_set, o horário impresso bate com o relógio da sua máquina.

    O nome index.php tem motivo. Quando a URL não aponta um arquivo, o servidor embutido procura index.php ou index.html na pasta e devolve o que achar.

  5. Ainda dentro da pasta, ligue o servidor:

    php -S localhost:8000

    O terminal para de devolver o prompt e imprime uma linha só, com data, versão do PHP e o endereço em que ele escuta:

    [Sat Aug 15 07:28:33 2026] PHP 8.5.8 Development Server (http://localhost:8000) started

    Tutorial antigo costuma mostrar quatro linhas aqui, com raiz de documentos e o aviso de que Ctrl-C encerra. O PHP condensou tudo nessa linha única, e o comportamento continua o mesmo. Rodamos o comando no PHP 8.5.8 e no 8.1.34 e os dois imprimem a linha única.

  6. Abra http://localhost:8000/ no navegador. Recarregue duas ou três vezes com F5, sem pressa entre uma e outra.

  7. Quando terminar, volte ao terminal e pressione Ctrl+C para parar o servidor.

A prova de que funcionou. A página mostra "Olá, mundo" e, abaixo, um horário com segundos e um número entre 1 e 100. Recarregue com F5: os segundos avançam e o número muda. Esse é o ponto da página inteira. O arquivo no disco continua idêntico, e mesmo assim o conteúdo chega diferente a cada requisição, porque o servidor executou o código antes de responder. Olhe também o terminal: cada F5 acrescenta três linhas de log, uma Accepted, uma com o status e o caminho pedido no formato [200]: GET /, e uma Closing. Se o navegador mostrar o texto <?php escrito na tela, ou baixar um arquivo em vez de exibir a página, você abriu o arquivo direto do disco e não pelo endereço http://localhost:8000/.

Uma coisa pra experimentar antes de sair

Troque date('H:i:s') por date('d/m/Y H:i:s'), salve e recarregue. A data aparece junto do horário sem você reiniciar o servidor. O servidor embutido lê o arquivo a cada requisição, então editar e recarregar basta.

O que PHP não é

O mito mais comum é achar que o PHP roda no navegador, como o JavaScript de uma página. Ele roda no servidor, e o código nunca sai de lá. Faça o teste: com a página aberta, peça "Ver código-fonte da página" no navegador. Aparece só HTML, com o horário já preenchido, sem uma linha sequer de PHP. É pela mesma razão que dois cliques no index.php não funcionam, já que nesse caminho ninguém executou o interpretador.

A segunda confusão é misturar PHP com WordPress. O WordPress foi escrito em PHP, e boa parte do que se chama por aí de "trabalhar com PHP" é mexer em tema de WordPress. A linguagem existe fora disso, e o hello world acima não tem nada de WordPress dentro.

Fontes

Rodamos este passo a passo em 15/08/2026, numa máquina Ubuntu 26.04 onde php -v respondia php: command not found. No lugar do apt, que exige root, usamos o binário estático oficial do projeto static-php-cli, que se identifica como PHP 8.5.8 (cli) (built: Jul 7 2026 05:21:52). Com o index.php desta página, o comando php -S localhost:8000 subiu o servidor e duas requisições seguidas voltaram HTTP 200 com conteúdo diferente: montou esta página às 07:29:13 com o sorteio 42, e três segundos depois às 07:29:16 com o sorteio 89. Três trechos desta página mudaram por causa do teste: a linha de fuso no index.php, a linha única que o servidor imprime ao subir e a contagem de linhas de log por requisição.

Para continuar

Python resolve o mesmo problema por outro caminho e também traz um servidor de desenvolvimento na caixa. Ruby vale a comparação de sintaxe logo depois. As duas páginas ficam no mesmo lugar deste mapa, o stack web.

O curso desta trilha está em preparação. A lista paga menos.

Os tutoriais daqui continuam gratuitos. O que está a caminho é um curso pago que transforma esse mapa em formação guiada, na ordem certa e com projeto. Deixe seu e-mail: você recebe os estudos novos gratuitos e, no lançamento, o desconto de quem entrou na lista primeiro.