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ê quer | Use | Memória |
|---|---|---|
| O arquivo inteiro como uma string | file_get_contents() | O arquivo inteiro |
| As linhas como array | file($path, FILE_IGNORE_NEW_LINES) | O arquivo inteiro |
| Escrever ou substituir um arquivo numa chamada | file_put_contents() | Os dados que você escreve |
| Adicionar uma linha a um log | file_put_contents($path, $line, FILE_APPEND | LOCK_EX) | Uma linha |
| Ler um arquivo grande linha por linha, ou linhas de CSV | fopen() com fgets() ou fgetcsv() | Uma linha |
| Ler e escrever no mesmo arquivo aberto | fopen() 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.