PHP Stream
Streams em PHP permitem ler e gravar dados de arquivos, sockets e requisições HTTP com a mesma API. Aprenda funções, wrappers e exemplos práticos.
PHP Streams
Um stream em PHP é uma forma genérica de ler ou gravar em um fluxo de dados, independentemente de onde esses dados estejam. Um arquivo no disco, um bloco de memória, um socket de rede e o corpo de uma resposta HTTP são coisas muito diferentes, mas o PHP permite que você os manipule com o mesmo conjunto de funções. Essa uniformidade é exatamente o ponto: assim que você sabe como ler um arquivo com fopen()/fgets(), já sabe como ler uma página web ou um buffer de memória.
Esta página aborda o que são streams, as funções que os controlam, os wrappers que identificam a origem de um stream e como trabalhar com eles de forma segura.
Qual problema os streams resolvem?
Sem streams, você precisaria de uma API diferente para cada fonte de dados — uma para arquivos, outra para HTTP, outra para sockets. Os streams fornecem uma única abstração:
- Wrapper — um prefixo como
file://,php://,http://ouphp://memoryque diz ao PHP que tipo de recurso você está acessando. - Handle de recurso — o valor retornado por
fopen(); você o passa para todas as outras funções de stream. - Filtros e contextos — camadas opcionais que transformam os dados (ex.: gzip) ou configuram a conexão (ex.: cabeçalhos HTTP, timeouts).
Por causa desse design, você pode trocar um caminho local por uma URL remota e a maior parte do seu código permanece igual.
Funções principais de stream
Estas funções formam a base da API de Streams:
| Função | O que faz |
|---|---|
fopen($target, $mode) | Abre um arquivo ou URL e retorna um recurso de stream (ou false em caso de falha). |
fread($handle, $length) | Lê até $length bytes. |
fgets($handle) | Lê uma linha. |
fwrite($handle, $string) | Grava uma string e retorna o número de bytes gravados. |
feof($handle) | Retorna true ao chegar ao fim do stream. |
fclose($handle) | Libera o recurso de stream. |
O $mode controla o acesso: 'r' (leitura), 'w' (escrita, com truncamento), 'a' (acréscimo) e as variantes com '+' para leitura e escrita.
Para leituras e gravações únicas, geralmente não é preciso gerenciar um handle — os helpers de alto nível file_get_contents() e file_put_contents() abrem, transferem e fecham um stream em uma única chamada.
Wrappers e tipos de stream
O wrapper no início da string de destino determina o tipo de stream:
- Streams de arquivo (
file://, ou simplesmente um caminho simples) — leem e gravam dados no sistema de arquivos. Veja Manipulação de Arquivos em PHP e Abrir e Ler um Arquivo. - Streams de memória (
php://memory,php://temp) — um buffer de leitura/escrita que fica na RAM; ótimo para construir dados em testes sem tocar o disco. - Streams de I/O (
php://stdin,php://stdout,php://input) — entrada/saída padrão e o corpo bruto da requisição. - Streams de rede/socket (
tcp://,ssl://) — leem e gravam em uma conexão de rede. - Streams HTTP/FTP (
http://,https://,ftp://) — buscam documentos remotos como se fossem arquivos (requer queallow_url_fopenesteja habilitado).
Lendo um arquivo linha por linha
Este exemplo mínimo e autocontido grava um pequeno arquivo, o lê de volta por um stream linha a linha e depois faz a limpeza:
<?php
$path = sys_get_temp_dir() . '/stream-demo.txt';
// Write three lines using the high-level helper.
file_put_contents($path, "alpha\nbeta\ngamma\n");
// Read them back through a stream handle.
$handle = fopen($path, 'r');
if ($handle === false) {
exit("Could not open the stream.\n");
}
while (!feof($handle)) {
$line = fgets($handle);
if ($line !== false) {
echo "Line: " . trim($line) . PHP_EOL;
}
}
fclose($handle);
unlink($path);Saída:
Line: alpha
Line: beta
Line: gammaAbrimos o arquivo em modo de leitura, percorremos em loop até que feof() indique o fim e lemos cada linha com fgets(). Sempre verifique se fopen() não retornou false antes de usar o handle e chame fclose() ao terminar.
Usando um stream de memória
Streams de memória se comportam como arquivos, mas nunca acessam o disco — úteis para montar saídas ou para testes unitários:
<?php
$handle = fopen('php://memory', 'r+');
fwrite($handle, "buffered data");
// Rewind to the start before reading what we wrote.
rewind($handle);
echo fread($handle, 1024);
fclose($handle);Saída:
buffered dataApós gravar, você deve usar rewind() para voltar o ponteiro ao início antes de ler, pois a posição interna fica no final do que acabou de ser gravado.
Lendo um stream remoto
Como HTTP é apenas mais um wrapper, o mesmo loop funciona com uma URL quando allow_url_fopen está habilitado:
<?php
$handle = fopen('https://www.example.com', 'r');
if ($handle === false) {
exit("Failed to open the remote stream.\n");
}
while (!feof($handle)) {
echo fgets($handle);
}
fclose($handle);Este exemplo requer acesso à rede e a configuração
allow_url_fopenativada, portanto não funcionará em um sandbox offline. Para aplicações reais, um cliente HTTP dedicado como cURL oferece melhor controle sobre cabeçalhos, timeouts e erros.
Tratamento de erros
As funções de stream sinalizam falha retornando false em vez de lançar exceções, então proteja cada chamada:
- Verifique o valor de retorno de
fopen()antes de ler ou gravar. - Envolva operações arriscadas em
try/catchse você converter avisos em exceções — veja Exceções em PHP. - Sempre use
fclose()nos handles que você abre para liberar recursos.
Conclusão
Os streams fornecem ao PHP uma interface única e consistente para todo tipo de fluxo de dados — arquivos, buffers de memória, sockets e respostas HTTP. Aprenda o pequeno conjunto de funções principais (fopen, fread/fgets, fwrite, feof, fclose), entenda os wrappers como file:// e php://memory e utilize os helpers de alto nível file_get_contents()/file_put_contents() para casos simples. Para aprofundar, explore criação e gravação de arquivos e o tratamento de erros adequado.