Existem duas razões pelas quais você pode querer ler um arquivo linha por linha com PHP. A primeira é que o projeto em que você está trabalhando exige que você processe o arquivo uma linha de cada vez. A segunda é que você está lendo um arquivo muito grande e a única maneira de lê-lo sem ultrapassar o limite de memória é fazê-lo uma linha de cada vez.
Usando file()
para ler o arquivo
Você pode usar o file()
função em PHP para ler o arquivo inteiro de uma vez em uma matriz. Os elementos do array são linhas individuais do arquivo. Assim, você poderá iterar sobre as linhas do arquivo iterando sobre a matriz. A função aceita três parâmetros:
- nome do arquivo: Este é o arquivo que você deseja ler. Você também pode fornecer um URL como nome de arquivo.
-
bandeiras: Este é um parâmetro opcional e pode ser definido para um ou mais dos seguintes valores constantes:
FILE_USE_INCLUDE_PATH
,FILE_IGNORE_NEW_LINES
eFILE_SKIP_EMPTY_LINES
. - contexto: Este também é um parâmetro opcional usado para modificar o comportamento de um fluxo.
Estaremos usando o FILE_SKIP_EMPTY_LINES
sinalizador para pular todas as linhas vazias em um arquivo. Você também pode querer usar FILE_IGNORE_NEW_LINES
para remover terminações de linha de linhas individuais.
Esta função retorna um array com o conteúdo do arquivo em caso de sucesso e false
mediante falha. Você também receberá um E_WARNING
erro de nível se o arquivo não existir. Aqui está um exemplo de uso desta função.
A saída do código acima é assim:
01. The Project Gutenberg eBook of Pride and Prejudice, by Jane Austen 02. 03. This eBook is for the use of anyone anywhere in the United States and 04. most other parts of the world at no cost and with almost no restrictions 05. whatsoever. You may copy it, give it away or re-use it under the terms 06. of the Project Gutenberg License included with this eBook or online at 07. www.gutenberg.org. If you are not located in the United States, you 08. will have to check the laws of the country where you are located before 09. using this eBook. 10. 11. Title: Pride and Prejudice 12. 13. Author: Jane Austen 14. 15. Release Date: June, 1998 16. [Most recently updated: August 23, 2021]
Você pode ver que existem algumas linhas vazias na saída, podemos nos livrar delas usando o FILE_SKIP_EMPTY_LINES
bandeira. Além disso, pode não ser evidente, mas as linhas acima incluem o caractere de nova linha. É por isso que não tivemos que adicionar um caractere de nova linha próprio enquanto repetimos as linhas. Você pode se livrar das linhas em branco usando o FILE_IGNORE_NEW_LINES
bandeira.
A saída com esses sinalizadores ficará assim:
01. The Project Gutenberg eBook of Pride and Prejudice, by Jane Austen 02. This eBook is for the use of anyone anywhere in the United States and 03. most other parts of the world at no cost and with almost no restrictions 04. whatsoever. You may copy it, give it away or re-use it under the terms 05. of the Project Gutenberg License included with this eBook or online at 06. www.gutenberg.org. If you are not located in the United States, you 07. will have to check the laws of the country where you are located before 08. using this eBook. 09. Title: Pride and Prejudice 10. Author: Jane Austen 11. Release Date: June, 1998 [eBook #1342] 12. [Most recently updated: August 23, 2021]
Usando o file()
function é uma maneira fácil de ler um arquivo linha por linha no PHP se você não estiver preocupado com o uso da memória. No entanto, você terá que ser mais criativo se o uso de memória for um problema porque file()
lê o arquivo inteiro em uma matriz de uma só vez.
Usando fgets()
para ler o arquivo
Outra maneira de ler um arquivo linha por linha com PHP é usar o fgets()
função. Ele tem um parâmetro obrigatório que é um identificador de arquivo válido. Nós usaremos o fopen()
função para obter acesso ao identificador de arquivo. Aqui está o código que vamos executar:
Na primeira linha, abrimos nosso arquivo em modo somente leitura. Então, definimos uma função que aceita um $file_handle
como parâmetro e devolve uma única linha. Observe que estamos usando um yield
declaração e nossa função get_all_lines()
é uma função geradora. Você pode querer ler sobre funções geradoras em PHP se você não as usou antes.
Estamos usando o feof()
funcionar dentro get_all_lines()
para verificar se nosso ponteiro de arquivo atingiu o fim do arquivo. Nós só cedemos enquanto não estamos no final do arquivo. Você deve obter a seguinte saída executando o código acima:
1. The Project Gutenberg eBook of Pride and Prejudice, by Jane Austen 2. 3. This eBook is for the use of anyone anywhere in the United States and 4. most other parts of the world at no cost and with almost no restrictions 5. whatsoever. You may copy it, give it away or re-use it under the terms 6. of the Project Gutenberg License included with this eBook or online at 7. www.gutenberg.org. If you are not located in the United States, you 8. will have to check the laws of the country where you are located before 9. using this eBook. 10. 11. Title: Pride and Prejudice 12. 13. Author: Jane Austen 14. 15. Release Date: June, 1998 16. [Most recently updated: August 23, 2021]
As saídas são as mesmas da nossa seção anterior. A única diferença desta vez é que você não corre mais o risco de ficar sem memória.
Eu mencionei anteriormente que fgets()
permitirá que você leia uma linha do arquivo por vez e requer apenas um único parâmetro que aponte para o ponteiro do arquivo que você deseja ler. O consumo de memória neste caso dependeria do comprimento da linha e há uma pequena chance de você ficar sem memória.
No entanto, digamos que você esteja lendo um arquivo de texto que contém linhas extraordinariamente longas. Você pode então passar um segundo parâmetro opcional para o fgets()
função que especifica o número de caracteres que você deseja ler. Em seguida, será lido length - 1
bytes do arquivo antes de parar. Ele irá parar mais cedo se encontrar uma nova linha ou fim de arquivo. Isso lhe dá mais controle sobre o consumo de memória do seu código.
Pensamentos finais
Eu discuti dois métodos de leitura de um arquivo linha por linha com PHP neste tutorial. Existem mais algumas maneiras de fazer isso, mas essas duas atenderão a quase todas as suas necessidades. Use o file()
funcionar quando o consumo de memória não for um problema e usar fgets()
com uma função de gerador se você quiser economizar memória.