Ler ou escrever arquivos com PHP

Se você tem acompanhado nosso curso gratuito de PHP, provavelmente já deve saber que utilizamos bases de dados (SGBDs) para salvar quaisquer informações que quisermos, como perfis de usuários, valores e descrições de produtos, e assim por diante. Essa é a forma mais segura para salvar dados, já que ninguém sem acesso ao seu servidor e a base de dados terá acesso aos valores. Por outro lado, outra forma de salvar texto permanentemente sem a necessidade de utilizar um SGBD, é utilizando arquivos de texto.

Essa não é uma forma segura para gerenciar valores importantes (como dados de usuários), porém, é uma excelente ferramenta para salvar coisas simples, como arquivos HTML, contadores de visitas, logs de erro, e demais arquivos que podem ser lidos por qualquer um com acesso à sua aplicação.

Neste artigo vamos aprender a ler ou escrever arquivos com PHP.

Vamos lá?

Abrindo um arquivo em PHP

Para abrir um arquivo para leitura ou escrita em PHP, utilize a função fopen.

Tal função aceita os seguintes parâmetros:

resource fopen ( string $filename , string $mode [, bool $use_include_path [, resource $context ]] )

Onde:

  • $filename é o caminho do arquivo que você está tentando abrir. Se você utilizar uma URL, com HTTP ou FTP, a opção {php}allow_url_fopen{/php} deverá estar ativa no php.ini. Caso contrário, estará abrindo um arquivo interno do servidor;
  • $mode é o modo que o PHP vai utilizar para abrir o arquivo (somente leitura, leitura e escrita, e assim por diante). Vou publicar uma tabela logo abaixo;
  • $use_include_path indica que o arquivo deve ser procurado nos diretórios especificados em {php}include_path{/php} do php.ini;
  • $contextVeja aqui.

Veja um exemplo de utilização:

<?php
// Meu arquivo
$arquivo = 'meu_arquivo.txt';

// Cria o recurso (abrir o arquivo)
$handle = fopen( $arquivo, 'r' );
?>

Perceba que fopen sozinha não faz nada, é necessário utilizar mais funções, que serão detalhadas mais adiante neste artigo.

Modos para fopen

Os modos disponíveis dizem ao PHP como manipular o arquivo, veja:

Lista dos possíveis modos de fopen() utilizando o modo
modo Descrição
'r' Abre somente para leitura; coloca o ponteiro no começo do arquivo.
'r+' Abre para leitura e escrita; coloca o ponteiro no começo do arquivo.
'w' Abre somente para escrita; coloca o ponteiro no começo do arquivo e apaga tudo o que estiver nele. Se o arquivo não existir, tenta criá-lo.
'w+' Abre para leitura e escrita; coloca o ponteiro no começo do arquivo e apaga tudo o que estiver nele. Se o arquivo não existir, tenta criá-lo.
'a' Abre somente para escrita; coloca o ponteiro no final do arquivo. Se o arquivo não existir, tenta criá-lo.
'a+' Abre para leitura e escrita; coloca o ponteiro no final do arquivo. Se o arquivo não existir, tenta criá-lo.
'x' Cria e abre o arquivo somente para escrita; coloca o ponteiro no começo do arquivo. Se o arquivo já existir, a chamada a fopen() falhará, retornando FALSE e gerando um erro de nível E_WARNING. Se o arquivo não existir, tenta criá-lo. Isto é equivalente a especificar as flags O_EXCL|O_CREAT para a chamada de sistema open(2).
'x+' Cria e abre o arquivo para leitura e escrita; coloca o ponteiro no começo do arquivo. Se o arquivo já existir, a chamada a fopen() falhará, retornando FALSE e gerando um erro de nível E_WARNING. Se o arquivo não existir, tenta criá-lo. Isto é equivalente a especificar as flags O_EXCL|O_CREAT para a chamada de sistema open(2).

Também é possível utilizar as letras "b" ou "t" depois do modo (ex.: wb). A letra "b" força o uso do modo binário e a letra "t" converte as linhas com "n" para "rn".

Lendo arquivos com PHP

Depois que você abre um arquivo em PHP, é possível realizar duas ações, ler ou escrever (dependendo do modo utilizado para abrir tal arquivo). Uma das funções do PHP que servem para a leitura dos dados que estão no arquivo, é a fread.

Essa função recebe dois parâmetros, o arquivo aberto por "fopen" e o tamanho onde a leitura será parada em bytes. Veja:

<?php
// Meu arquivo
$arquivo = 'meu_arquivo.txt';

// Cria o recurso (abrir o arquivo)
$handle = fopen( $arquivo, 'r' );

// Lê o arquivo (se existir) 
$ler = fread( $handle, filesize($arquivo) );

// Mostra dados na tela
echo $ler;

// Fecha o arquivo
fclose($handle);
?>

Perceba que ao invés de enviar o tamanho em bytes para opção fread, utilizei uma função para capturar o tamanho do arquivo por completo – filesize. Além disso, também utilizei uma função ao final, a fclose, ela é responsável por fechar o arquivo que estava aberto.

Um dos problemas que você pode encontrar aqui, é se o arquivo não existir… Veja os erros:

Warning: fopen(meu_arquivo.txt): failed to open stream: No such file or directory in E:caminho.php on line 6
Warning: filesize(): stat failed for meu_arquivo.txt in E:caminho.php on line 9
Warning: fread() expects parameter 1 to be resource, boolean given in E:caminho.php on line 9
Warning: fclose() expects parameter 1 to be resource, boolean given in E:caminho.php on line 15

Neste caso, sempre verifique se o arquivo existe com a função file_exists. Veja o mesmo exemplo, só que com a nossa correção:

<?php
// Meu arquivo
$arquivo = 'meu_arquivo.txt';

// Verifica se o arquivo existe
if ( file_exists( $arquivo ) ) {
	// Cria o recurso (abrir o arquivo)
	$handle = fopen( $arquivo, 'r' );

	// Lê o arquivo (se existir) 
	$ler = fread( $handle, filesize($arquivo) );

	// Mostra dados na tela
	echo $ler;

	// Fecha o arquivo
	fclose($handle);
}
?>

Além disso, você também pode utilizar a função fgets, que faz a leitura de apenas uma linha do arquivo (do ponteiro em diante).

<?php
// Meu arquivo
$arquivo = 'meu_arquivo.txt';

// Verifica se o arquivo existe
if ( file_exists( $arquivo ) ) {
	// Cria o recurso (abrir o arquivo)
	$handle = fopen( $arquivo, 'r' );

	// Lê uma linha do arquivo (se existir) 
	$ler = fgets( $handle, 4096 );

	// Mostra dados na tela
	echo $ler;

	// Fecha o arquivo
	fclose($handle);
}
?>

Se você quiser fazer um laço e ler linha por linha do arquivo, faça o seguinte:

<?php
// Meu arquivo
$arquivo = 'meu_arquivo.txt';

// Verifica se o arquivo existe
if ( file_exists( $arquivo ) ) {

	// Envia cada linha do array para um índice de um array
	$handle = file( $arquivo  );

	// Faz o laço
	foreach ($handle as $linha) {
		// Lê uma linha do arquivo (se existir) 
		$ler = $linha;

		// Mostra dados na tela
		echo $ler;
	}
}
?>

No trecho acima, utilizamos a função file para indexar cada linha do arquivo em um array, logo em seguida fizemos um laço para mostrar os dados na tela do navegador.

Além disso, também podemos jogar todos os dados de um arquivo em uma única variável com file_get_contents.

Veja:

<?php
// Meu arquivo
$arquivo = file_get_contents( 'meu_arquivo.txt' );
echo $arquivo;
?>

Escrever em arquivos utilizando PHP

Para escrever, utilize a função fwrite.

Tal função depende da função fopen (descrita anteriormente), veja:

<?php
// Meu arquivo
$arquivo = 'meu_arquivo.txt';

// Dados para escrever no arquivo
$html = '<p>Eu amo PHP.</p>';

// Cria o recurso (abrir o arquivo)
$handle = fopen( $arquivo, 'a+' );

// Escreve
$ler = fwrite( $handle, $html );

// Fecha o arquivo
fclose($handle);

// Mostra os dados do arquivo
echo file_get_contents( $arquivo );
?>

A função acima insere uma nova linha no arquivo com um parágrafo em HTML.

Apagando um arquivo com PHP

Para apagar, simplesmente utilize unlink com o caminho do arquivo, veja:

// Apaga o arquivo
unlink( $arquivo );

Concluindo

Existem milhares de funções para arquivos em PHP, portanto, recomendo a leitura do manual para aprofundar mais no assunto:

Não deixe de ver outras aulas do nosso curso gratuito de PHP.