Alura > Cursos de Programação > Cursos de PHP > Conteúdos de PHP > Primeiras aulas do curso PHP I/O: trabalhando com arquivos e streams

PHP I/O: trabalhando com arquivos e streams

Lendo arquivos - Introdução

Olá, pessoal, tudo bem? Sejam muito bem-vindos a mais um treinamento na Alura. Nesse treinamento vamos aprender a manipular arquivos - ou melhor dizendo, streams em PHP. Vamos entender o que eles são, o fluxo, sendo eles de entrada ou de saída.

E vamos começar manipulando arquivos. Vamos ler arquivos e depois escrever em arquivos utilizando alguns formatos interessantes. Depois vamos entender que o PHP trabalha da mesma forma que pode trabalhar com arquivos, também com rede.

Ou seja, posso fazer uma requisição HTTP, posso ler dados que estejam armazenados em um site ou até através de FTP, SSH e em várias outras coisas. Posso também mandar dados para a rede. Fazer uma requisição utilizando POST, por exemplo, para enviar dados, mandar dados para um FTP, mandar dados através de SSH fazendo uma cópia por SCP, enfim.

Além disso, também vamos conseguir manipular o teclado, pela primeira vez com o PHP. Vamos conseguir ler dados da entrada padrão, que é o teclado. Vamos entender alguns atalhos para isso também e continuar escrevendo no console, só que de uma forma um pouco diferente.

Também vamos ver algumas coisas interessantes, como, por exemplo, manipular arquivos Zip, ler arquivos zipados e arquivo Zip com senha, inclusive. Vamos trabalhar com textos nos streams para fazermos isso. Vamos também ver como filtrar os streams, como filtrar o nosso fluxo de entrada para que nem tudo passe, para que nem tudo chegue na nossa aplicação.

Enfim, vai ser um curso bastante completo. Vamos ver bastante coisas. Então se prepare, que eu te espero no próximo vídeo para começarmos a colocar a mão na massa.

Lendo arquivos - Lendo linha a linha

Olá, pessoal! Sem enrolação, vamos direto ao ponto. Tenho um arquivo e nele salvei os cursos que já gravei até hoje. Então tenho um arquivo com uma lista de cursos e preciso, utilizando PHP, ler essa lista de cursos para apresentar em uma página da Web, para salvar no banco de dados. Não importa, a questão é que preciso ler esse arquivo.

Preciso ler ele como um todo. Então vou criar um arquivo chamado de leitor-cursos. Perfeito, criei um arquivo. Só recapitulando, para deixar todo mundo no mesmo barco, tudo o que precisamos até esse ponto é ter o PHP instalado.

Já instalamos o PHP em cursos anteriores, então vamos direto colocar a mão na massa. Para que eu consiga manipular um arquivo utilizando qualquer linguagem de programação, me arrisco a dizer que a primeira coisa que precisamos fazer é abrir esse arquivo.

Então para abrir esse arquivo, se falarmos “abrir” em inglês é a palavra open. Então será que existe uma função chamada open? Mas, open o quê? O que estou tentando abrir? Um arquivo. Um “arquivo” em inglês é file. Então a função para abrir um arquivo em PHP é f de file, open.

Com essa função eu consigo de abrir um arquivo para que eu consiga ler, escrever ou fazer qualquer outro tipo de manipulação com ele. Essa função recebe, a princípio, dois parâmetros. Receberem outros vários parâmetros, mas o que vamos usar por enquanto são dois parâmetros.

O primeiro parâmetro é o arquivo queremos abrir. Aqui é lista-cursos.txt que é nome desse arquivo que tem todos os cursos. O segundo parâmetro indica o que quero fazer com esse arquivo - vamos falar bem mais sobre ele mais para frente.

Inicialmente eu quero ler. Então vou colocar um r de read, porque por enquanto só quero ler esse arquivo. Essa função me retorna como se fosse um ponteiro para esse arquivo, um recurso, que posso chamar de arquivo. Perfeito.

Já tenho o meu arquivo aberto, pronto para ser lido. O que quero fazer? Vamos pensar primeiro no algoritmo e depois vamos implementar a chamada de cada função propriamente dita. Basicamente, o que quero fazer é, enquanto não chegar no fim do arquivo, quero fazer isso.

Enquanto eu não chegar no fim do arquivo, quero ler uma linha e depois ir para a próxima linha. Então, enquanto eu não chegar no final do arquivo, leio uma linha desse arquivo e vou lendo linha a linha até chegar no final. Perfeito!

Então vamos por partes. Primeiro, como será que leio uma linha? Quero pegar um curso. Como pego essa linha de um arquivo? Existe uma função também do PHP chamada fgets, que pega uma string até o final da linha de determinado arquivo - e esse arquivo é o que já abrimos.

Poderia, em vez de pedir para ele ler até o final da linha, informar que quero ler determinada quantidade de caracteres. Isso também funcionaria. Quero ler só três caracteres. Funciona dessa forma e poderia passar três caracteres, mas no caso quero ler até o final da linha.

Só que eu já consigo ler essa linha, mas ainda preciso saber se cheguei ou não no final do arquivo. Quero saber se estou no fim do arquivo, em inglês end of file, eof. Então posso pegar se estou no arquivo fim do arquivo. Mas qual arquivo? Esse arquivo que já abrimos. Então se eu não estiver alcançado o final desse arquivo, leio uma linha e essa linha vai ser armazenada na variável curso.

Recapitulando para esclarecer algumas coisas. Primeiro ponto: abrimos o arquivo. Abrimos para ler o arquivo chamado lista-cursos. Desse arquivo verificamos - "Estou no fim do arquivo ou já atingi o fim do arquivo? Ainda não?" Se não atingi o fim do arquivo, leio uma linha. Só que essa função, além de ler uma linha, ela posiciona o cursor no final dessa linha lida.

"Vinicius, não entendi nada. O que isso quer dizer?" Basicamente, quando abrimos esse arquivo o cursor estava no início. Aí, quando chamamos a função fgets, o que ele fez é ler. Ele vai lendo até chegar em uma quebra de linha. Então vou parar aqui.

Parei, devolvi para a variável curso e repare onde o cursor está. Já está na próxima linha. Então na próxima chamada desse fgets eu vou passar a ler essa linha e vou lendo até chegar aqui.

Chamo o fgets. Leu e chegou no final do arquivo. Não tem mais nada para ler. Beleza, traga o valor para a variável curso e verifique de novo. Chegou no final do arquivo? Chegou. Não tem mais nada para frente do cursor, então vai sair desse loop.

Por enquanto tudo o que vou fazer é exibir o valor que está armazenado nessa variável curso. Vou abrir no meu prompt de comando esse projeto. Pode ser em qualquer pasta que você criar. Só para garantir que estou na pasta correta, tem o leitor-cursos e o arquivo lista-cursos.

Então, utilizando o PHP vou executar esse leitor de cursos. Tudo o que ele vai me devolver é a nossa lista de cursos, nada além disso. Com isso, consigo ler linha a linha o meu arquivo. Só que aqui tem um detalhe: acabei deixando esse arquivo aberto no final do script.

Em muitos casos o PHP consegue entender que o script terminou, ele fecha o arquivo e todo mundo pode voltar a manipular ele. Mas em determinados casos, como, por exemplo, se o PHP parar, der algum tipo de erro ou alguma manipulação inesperada acontecer nesse arquivo, o PHP pode se perder e esse arquivo vai ficar marcado como aberto.

Então outros programas não vão conseguir manipular esse programa, além de gastarem recurso. Ou seja, esse arquivo vai estar com um ponteiro, com essa variável ainda armazenada na memória. Então é sempre uma boa prática do script PHP chamar a função fclose para fechar esse arquivo. Para dizer, "terminei de trabalhar com esse arquivo".

Terminei de trabalhar com ele. Posso liberar esse recurso, eu posso fechar esse arquivo porque não vou usar mais. Então deixe-me limpar a tela e executar de novo para garantir que tudo continua funcionando. E está lá, linha a linha, o arquivo exibido!

"Beleza, Vinicius. Mas se você só está pegando o conteúdo como um todo, você não está tratando linha a linha? Será que não consigo pegar o conteúdo de todo esse arquivo de uma vez só?" Claro que consigo e nós vamos conversar sobre isso no próximo vídeo.

Lendo arquivos - Lendo o arquivo todo

Olá, pessoal! Bem-vindos de volta. No último vídeo já começamos a entender como trabalhar com arquivos. Já entendemos que antes de tudo, precisamos abrir e no final é interessante fecharmos. Vimos como verificarmos se já atingimos o fim do arquivo e também fomos pegando linha a linha.

Mas, como comentamos, eu não quero pegar linha a linha. Não preciso tratar linha a linha. Posso pegar o arquivo como um todo, pegar o arquivo inteiro. Então vamos remover esse loop, já que não vou pegar linha a linha; e vamos pensar: como será que posso ler um arquivo como um todo?

Ler é read em inglês e se todas as funções de arquivo estão começando com a letra “F”, suponho que exista a função fread, e realmente existe! Essa função recebe dois parâmetros. O primeiro é o arquivo que queremos ler. O segundo parâmetro que entra o pulo do gato é onde definimos o tamanho, a quantidade de caracteres, o número de letras que queremos ler.

Na verdade, é o número de bytes que queremos ler, mas para não complicar, eu vou dizer que é o número de caracteres. Então se queremos ler o arquivo todo, aqui eu preciso dizer o tamanho do arquivo, ou seja, o número de caracteres presente nesse arquivo, a quantidade de caracteres que esse arquivo tem.

Dessa forma, vou conseguir ler o arquivo todo. Então vou ter a lista de cursos. Mas como será que pego o número de caracteres do meu arquivo? Como será que conto essa quantidade de letras? Na verdade, qual a quantidade de bytes que tenho no arquivo?

Antes, para testarmos a função fread, vou dizer que o tamanho do arquivo é de 10 caracteres. Eu só vou ler os 10 primeiros caracteres desse arquivo. Vou abrir o prompt de comando de novo e executar o leitor-cursos. Algum problema aconteceu? Nenhum problema aconteceu, só não exibi nada. Então vou exibir esses 10 caracteres que li do meu arquivo de cursos.

Então vamos executar de novo. E estão lá, 10 caracteres lidos do arquivo. Perfeito! Então já entendemos como funciona a função fread, mas e para pegarmos o tamanho de um arquivo?

Seguindo essa analogia que temos feito chamando funções que começam com a letra “F” e o nome em inglês da função delas, o tamanho é length. Então flength. Com isso, vou ter o tamanho do arquivo, mas eu estou recebendo um erro de função não definida.

Realmente, nesse caso não existe essa consistência. Não é flength ou fsize, por exemplo. Na verdade, o nome da função que traz o tamanho de um arquivo é filesize. Eu posso passar o nome do arquivo.

Repare no nome do arquivo. Não vou passar o arquivo aberto, eu vou passar o nome dele. Com isso, tenho o tamanho do arquivo, ou seja, a quantidade de bytes que esse arquivo tem.

Com isso, teoricamente vou conseguir ler desse arquivo quantos bytes? Todos os bytes que existem nesse arquivo e depois vou exibir. Vou executar de novo. E estão lá! Desde o primeiro curso até o último, todos os caracteres sendo exibidos de uma vez só sem eu precisar fazer o loop e ler linha a linha.

Mas, você pode estar se perguntando: "Vinicius, mas e se o meu arquivo tiver 1GB, você vai tentar colocar 1GB na memória?" Sim, esse é o problema! Por isso não podemos sempre ler o arquivo todo de uma vez só, porque nem sempre vamos ter memória suficiente para isso. Inclusive, uma dica para você, por padrão, o limite de memória que o PHP pode usar é de 128MB.

Então se você tiver um arquivo maior do que 128MB, você não vai conseguir ler dessa forma sem mudar nenhuma configuração e nem deveria! Você não deve alocar mais de 128MB na memória para ler um arquivo. Então se você estiver trabalhando com arquivos grandes, você vai utilizar aquela primeira abordagem de ler linha a linha.

Se você tem um arquivo pequeno, como é o nosso caso, não faz mal nenhum lermos o arquivo todo. "Mas Vinicius, não achei essa sintaxe agradável. Eu tenho que ler o tamanho do arquivo e depois ler o arquivo em si. Será que não existe uma sintaxe mais amigável ou uma forma de facilitar essa leitura do arquivo como um todo?". Vamos conversar sobre isso no próximo vídeo!

Sobre o curso PHP I/O: trabalhando com arquivos e streams

O curso PHP I/O: trabalhando com arquivos e streams possui 117 minutos de vídeos, em um total de 64 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Plus

De
R$ 1.800
12X
R$109
à vista R$1.308
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

Matricule-se

Pro

De
R$ 2.400
12X
R$149
à vista R$1.788
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Luri, a inteligência artificial da Alura

    Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com Luri até 100 mensagens por semana.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas