Menu

PHP file_get_contents(): ler um arquivo numa string

file_get_contents('notes.txt') lê um arquivo inteiro e o retorna como uma string, ou false se não conseguir. A parceira file_put_contents() escreve uma string num arquivo, e file() retorna as linhas como array.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

file_get_contents('notes.txt') lê o arquivo inteiro e o retorna como uma string. Se o arquivo não puder ser lido, ele retorna false. Para escrever, use file_put_contents('notes.txt', $text), que cria o arquivo ou substitui o que havia nele.

Saída:

Buy milk
Call Ada
Write docs
29 bytes
3 lines

O bloco escreve notes.txt primeiro e depois o lê de volta, para ter um arquivo com que trabalhar. Um caminho como 'notes.txt' é relativo ao diretório de trabalho atual; numa aplicação web, monte o caminho a partir da pasta do próprio script com __DIR__ . '/notes.txt'.

Escrever e acrescentar com file_put_contents()

O file_put_contents() retorna o número de bytes escritos, ou false em caso de falha. Por padrão ele sobrescreve o arquivo. A flag FILE_APPEND acrescenta no fim, que é como logs simples funcionam, e LOCK_EX impede que duas requisições escrevam no mesmo momento:

Saída:

Wrote 8 bytes
started
step 1 done
step 2 done

replaced

abc
5 bytes

Para guardar um array e recebê-lo de volta como array, escreva-o como JSON com json_encode() e leia com json_decode().

Ler um arquivo linha por linha com file()

O file() lê um arquivo para um array com uma linha por elemento. Cada linha mantém a quebra de linha no fim, a menos que você passe FILE_IGNORE_NEW_LINES, e FILE_SKIP_EMPTY_LINES descarta as linhas em branco (só funciona junto com FILE_IGNORE_NEW_LINES):

Saída:

string(9) "Buy milk
"
1. Buy milk
2. Call Ada
3. Write docs
3 tasks

file() e file_get_contents() carregam o arquivo inteiro na memória. Isso não é problema para arquivos de configuração e logs de alguns megabytes. Para um arquivo de centenas de megabytes, leia uma linha por vez com fopen() e fgets().

Verificar se um arquivo existe antes de lê-lo

Quando o arquivo não existe, o file_get_contents() retorna false e o PHP imprime um aviso:

Warning: file_get_contents(missing.txt): Failed to open stream: No such file or directory in /home/index.php on line 2

Verifique antes com is_file() (um arquivo que existe e não é diretório) ou file_exists() (um arquivo ou um diretório), e sempre compare o resultado com === false, porque um arquivo vazio retorna "", que também é falso:

Saída:

empty.txt   exists file 
missing.txt missing 
.           exists directory 
Cannot read missing.txt, using defaults
bool(false)
bool(true)
0 bytes

Não esconda o aviso com @file_get_contents(). Verificar antes, ou tratar o false, mantém o erro visível quando outra coisa der errado.

Ler parte de um arquivo

O quarto e o quinto argumentos são o offset em bytes onde começar e o número de bytes a ler. Um offset negativo conta a partir do fim do arquivo. Argumentos nomeados deixam você pular os dois argumentos do meio:

Saída:

HEADER
line 2
last line

Offsets contam bytes, não caracteres. Em UTF-8, um caractere japonês tem 3 bytes, então um offset no meio de um o corta ao meio. Para trabalhar com caracteres, leia a string inteira e use mb_substr().

Mostrar um arquivo de texto numa página web

O conteúdo de um arquivo é texto, e texto impresso em HTML precisa ser escapado, senão um < no arquivo vira uma tag. O htmlspecialchars() o escapa e o nl2br() transforma as quebras de linha em tags <br>. Rode e olhe a aba Page:

Tire o htmlspecialchars() e rode de novo: a página agora termina em "v1.2: Fixed", porque o navegador lê <title> como uma tag de verdade e engole tudo o que vem depois como título da página. A página sobre htmlspecialchars() explica por que isso importa para tudo o que um usuário pode escrever.

Ler uma URL com file_get_contents()

Com allow_url_fopen habilitado (o padrão no php.ini), o file_get_contents() também lê URLs e retorna o corpo da resposta. Um contexto de stream adiciona um método, cabeçalhos, um corpo e um timeout:

<?php
$html = file_get_contents('https://example.com/');

$context = stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n",
        'content' => json_encode(['name' => 'Ada']),
        'timeout' => 5,
        'ignore_errors' => true,   // return the body of 4xx/5xx responses too
    ],
]);

$response = file_get_contents('https://api.example.com/users', false, $context);
if ($response === false) {
    // DNS failure, timeout, or a refused connection
}

Para novas tentativas, redirecionamentos com limite e códigos de erro claros, o cURL ou uma biblioteca de cliente HTTP como o Guzzle são a ferramenta melhor.

file_get_contents, file() ou fopen()

Você querUseMemória
O arquivo inteiro como uma stringfile_get_contents()O arquivo inteiro
As linhas como arrayfile($path, FILE_IGNORE_NEW_LINES)O arquivo inteiro
Escrever ou substituir um arquivo numa chamadafile_put_contents()Os dados que você escreve
Adicionar uma linha a um logfile_put_contents($path, $line, FILE_APPEND | LOCK_EX)Uma linha
Ler um arquivo grande linha por linha, ou linhas de CSVfopen() com fgets() ou fgetcsv()Uma linha
Ler e escrever no mesmo arquivo abertofopen() com r+, a+ ou c+O que você lê

As funções de uma chamada abrem, leem ou escrevem e fecham o arquivo para você, então são o padrão certo. Use o fopen() quando o arquivo for grande demais para caber na memória ou você precisar mantê-lo aberto entre operações.

Perguntas frequentes

Como leio um arquivo numa string no PHP?

Chame file_get_contents('path/to/file.txt'). Ele retorna o arquivo inteiro como string, ou false se o arquivo não puder ser lido, então compare o resultado com === false antes de usá-lo.

Como acrescento conteúdo a um arquivo no PHP?

Passe a flag FILE_APPEND: file_put_contents('log.txt', "new line\n", FILE_APPEND);. Sem ela, o file_put_contents() substitui o arquivo inteiro. Adicione LOCK_EX (FILE_APPEND | LOCK_EX) quando várias requisições puderem escrever ao mesmo tempo.

Como leio um arquivo linha por linha no PHP?

Para arquivos pequenos, file('data.txt', FILE_IGNORE_NEW_LINES) retorna um array com uma linha por elemento. Para arquivos grandes, abra com fopen() e leia uma linha por vez com fgets() num loop while, o que mantém só uma linha na memória.

Por que o file_get_contents retorna false?

O arquivo não existe, o caminho é relativo a um diretório diferente do que você pensa, ou o PHP não tem permissão para lê-lo. O PHP também imprime um aviso como Failed to open stream: No such file or directory. Verifique com is_file() e is_readable(), e monte os caminhos a partir de __DIR__.

O file_get_contents consegue ler uma URL?

Sim, quando allow_url_fopen está habilitado no php.ini: file_get_contents('https://example.com/') retorna o corpo da resposta. Para cabeçalhos, dados POST ou um timeout, passe um contexto de stream_context_create(); para qualquer coisa mais elaborada, o cURL trata erros melhor.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR