Streams no PHP \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 03 Horas 

 54 Min 

 38 Seg 

   Tempo restante da oferta: 03 54 38 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Streams no PHP  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# Streams no PHP

 Você, desenvolvedor PHP, já teve a oportunidade de trabalhar mais intimamente com Streams? Se você já teve ou não, esse artigo é pra você! Uma introdução ao essencial sobre o assunto.

 [ Kennedy Tedesco ](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/08/24120107/streams.jpg)  

Streams representam coleções de dados que podem não estar completamente disponíveis de imediato e que também não possuem a limitação de terem que caber de uma só vez na memória. Isso faz com que elas sejam uma poderosa ferramenta para lidarmos com os dados em partes (*chunks*) e acessados sob demanda. Uma definição mais técnica para streams é que representam a transmissão/fluxo de dados de uma fonte para um destino.

Entender o essencial sobre streams é fundamental para se trabalhar com arquivos. Sem streams não conseguiríamos abrir um arquivo de 20GB se não tivéssemos 20GB de memória disponíveis. Com elas, abrimos o arquivo e o lemos em partes. Sistemas operacionais baseados no Unix proveem uma interface padrão para operações *I/O* (input e output) que se passa por descritores de arquivo. Um descritor de arquivo é representado por um número inteiro que se associa a um arquivo aberto e, nesses sistemas, há uma generalização de que “tudo é um arquivo”, então, quando falamos aqui de arquivo, ele pode ser uma conexão de rede (um socket é um tipo especial de arquivo), um arquivo de texto, um arquivo de vídeo ou até mesmo uma pasta (que é um tipo especial de arquivo).

[  ![WordPress - Criação de Plugins](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/wordpress-plugins.svg)   Curso WordPress - Criação de Plugins Conhecer o curso ](https://www.treinaweb.com.br/curso/wordpress-desenvolvimento-de-plugins)

Grande parte do que é feito no [PHP](https://www.treinaweb.com.br/blog/o-que-e-php/ "PHP") é sobre streams. Ao ler um arquivo, lidamos com streams. Ao retornar um *output* para o cliente, lidamos com streams. Ao ler um *input*, lidamos com streams. Ao obter dados de uma conexão TCP/IP, também estaremos trabalhando com streams. O PHP abstrai ao máximo o trabalho com as streams e, na maior parte do tempo, usamos funções de alto nível da linguagem que deixam bem transparente o uso delas. No entanto, há momentos em que precisamos conhecer um pouco mais sobre elas para que consigamos resolver problemas e necessidades específicas. Essa é a ideia desse artigo.

## Operações básicas com streams

Uma stream é referenciada dessa maneira:

```
://

```

*Scheme* é nome do *wrapper* que está sendo utilizado. *Target* é a identificação do recurso que será trabalhado. E esse recurso vai depender do contexto, se estamos falando do sistema de arquivos ou da rede, por exemplo.

O PHP possui algumas funções genéricas que nos permitem interagir com streams e até mesmo mudar o comportamento delas. Muitas das funções que trabalham com arquivos permitem essa interação. Algumas das mais conhecidas são:

- fopen()
- fwrite() ou fputs()
- fclose()
- file\_get\_contents()
- file\_put\_contents()
- Entre outras.

O PHP possui uma extensão chamada [Stream](https://www.php.net/manual/pt_BR/book.stream.php) que já vem habilitada por padrão. Como o próprio nome sugere, ela lida com toda a abstração de streams de I/O (input e output) do PHP. No decorrer do artigo utilizaremos algumas dessas funções.

Antes, apenas para dar contexto ao que falamos anteriormente de que com streams lidamos com *chunks* e que isso permite trabalharmos com grandes quantidade de dados sem estourar o limite de memória, desenvolveremos um simples exemplo.

Se você usa um sistema baseado em unix, em um diretório de testes, crie o seguinte arquivo:

```bash
$ awk 'BEGIN { n = 1; while (n < 10000000) print (n++) }' > numeros.txt

```

O arquivo criado tem ~78MB e é composto apenas de números sequenciais. Agora, digamos hipoteticamente que a nossa instalação do PHP nos permite usar apenas 4MB por script, vamos tentar ler o arquivo utilizando `file_get_contents()`:

```php
