fopen()
A função fopen() é uma função PHP integrada usada para abrir um arquivo e retorna um ponteiro de arquivo para leitura ou escrita.
O que é a Função fopen()?
A função fopen() é uma função PHP integrada que abre um arquivo (ou uma URL) e retorna um ponteiro de arquivo — um identificador de recurso que você passa para funções como fread(), fwrite(), fgets() e fclose() para efetivamente ler, escrever e fechar o fluxo. Em caso de falha, retorna false e emite um E_WARNING.
Quase toda operação de arquivo em PHP que lê ou escreve de forma incremental começa com fopen(). (Para leituras e escritas únicas, normalmente você usa file_get_contents() e file_put_contents() — veja Quando não usar fopen().)
Sintaxe
fopen(string $filename, string $mode, bool $use_include_path = false, $context = null): resource|false| Parâmetro | Descrição |
|---|---|
$filename | Caminho para o arquivo, ou uma URL (ex.: https://…, php://stdin) quando wrappers estão habilitados. |
$mode | Como abrir o arquivo — leitura, escrita, acréscimo, etc. Consulte a tabela abaixo. |
$use_include_path | Se true, o PHP também pesquisa o include_path pelo arquivo. |
$context | Um contexto de fluxo opcional criado com stream_context_create(). |
Retorna um recurso de ponteiro de arquivo em caso de sucesso, ou false em caso de falha.
Modos do fopen()
O argumento $mode é a parte que as pessoas erram com mais frequência. Ele controla se o arquivo é lido, escrito ou ambos, onde o ponteiro interno começa e se o arquivo é truncado ou se deve existir previamente.
| Modo | Leitura | Escrita | Ponteiro começa em | Trunca? | Se o arquivo não existe |
|---|---|---|---|---|---|
r | sim | não | início | não | aviso, retorna false |
r+ | sim | sim | início | não | aviso, retorna false |
w | não | sim | início | sim | cria o arquivo |
w+ | sim | sim | início | sim | cria o arquivo |
a | não | sim | fim | não | cria o arquivo |
a+ | sim | sim | fim (escritas sempre acrescentam) | não | cria o arquivo |
x | não | sim | início | não | cria o arquivo; falha se existir |
x+ | sim | sim | início | não | cria o arquivo; falha se existir |
Você pode acrescentar b (binário, ex.: 'rb') ou t (texto) a qualquer modo. Sempre use 'b' para arquivos não textuais como imagens ou executáveis — no Windows, o modo texto traduz silenciosamente as terminações de linha e corrompe dados binários. No Unix, os dois são idênticos, portanto 'b' é o padrão seguro em qualquer ambiente.
Exemplo básico: lendo um arquivo
Abra um arquivo no modo de leitura, leia seu conteúdo e feche-o. Sempre verifique o valor de retorno antes de usar o identificador, e sempre use fclose() ao terminar para que o sistema operacional possa liberar o descritor.
<?php
$filename = 'myfile.txt';
$file = fopen($filename, 'r');
if ($file === false) {
echo "Unable to open file!";
} else {
echo fread($file, filesize($filename));
fclose($file);
}Abrimos myfile.txt no modo somente leitura e verificamos o identificador com uma comparação estrita === false — isso importa porque um recurso válido é verdadeiro, mas alguns valores sem erro também são, então verificações soltas podem te prejudicar mais tarde.
Escrevendo em um arquivo
Abrir com 'w' cria o arquivo se não existir e o trunca para comprimento zero se existir. Use 'a' quando quiser adicionar ao final sem apagar o que já existe (útil para arquivos de log).
<?php
$file = fopen('log.txt', 'w'); // create / overwrite
fwrite($file, "First line\n");
fwrite($file, "Second line\n");
fclose($file);
$file = fopen('log.txt', 'a'); // append, keep existing content
fwrite($file, "Appended later\n");
fclose($file);
echo file_get_contents('log.txt');Isso imprime as três linhas porque 'a' adicionou ao arquivo em vez de substituí-lo. Consulte fwrite() para o lado da escrita e feof() para detectar o fim do arquivo em loops.
Lendo linha por linha
Para arquivos grandes, não leia tudo na memória de uma vez. Combine fopen() com fgets() e feof() para transmitir uma linha por vez:
<?php
$file = fopen('myfile.txt', 'r');
if ($file) {
while (!feof($file)) {
$line = fgets($file);
if ($line !== false) {
echo $line;
}
}
fclose($file);
}Armadilhas comuns
- Esquecer de verificar
false. Se o caminho estiver errado ou as permissões negarem o acesso,fopen()retornafalsee emite um aviso. Chamarfread()emfalselança umTypeErrorno PHP 8+. - Não fechar o identificador. Descritores abertos são um recurso limitado; vazá-los em um processo de longa duração eventualmente esgota o limite do sistema operacional. Sempre use
fclose(), preferencialmente em um blocofinally. - Modo errado. Usar
'w'quando pretendia'r'apaga silenciosamente o arquivo. Use'x'quando quiser especificamente que a criação falhe se o arquivo já existir. - Caminhos relativos. Eles são resolvidos em relação ao diretório de trabalho atual do script, que nem sempre é o que você espera. Prefira caminhos absolutos ou
__DIR__ . '/file.txt'.
Quando não usar fopen()
Se você apenas precisa do arquivo inteiro como uma string, ou despejar uma string em um arquivo com uma única chamada, evite a dança de abrir/ler/fechar:
| Objetivo | Função mais simples |
|---|---|
| Ler um arquivo inteiro em uma string | file_get_contents() |
| Escrever uma string em um arquivo com uma chamada | file_put_contents() |
| Ler um arquivo em um array de linhas | file() |
| Transmitir um arquivo diretamente para a saída | readfile() |
Use fopen() quando precisar de controle incremental e detalhado — lendo arquivos grandes em blocos, acrescentando a um log ou trabalhando com fluxos que não são arquivos, como php://stdin.
Conclusão
fopen() é a base do tratamento de arquivos de baixo nível em PHP: retorna um ponteiro de arquivo que você lê com fread() / fgets(), escreve com fwrite() e sempre libera com fclose(). Escolha o modo correto, verifique o valor de retorno e feche o identificador, e o restante das funções de tratamento de arquivos do PHP seguirá naturalmente.