sábado, 7 de junho de 2008

Trabalhando com arquivos

Vou demonstrar aqui duas formas muito comuns de manipulação de arquivos em PHP e suas diferenças.

A primeira e mais comum, que o PHP herdou da linguagem C, é através do comando fopen. Onde são passados quatro parâmetros (sendo que o terceiro e o quarto parâmetro quase nunca são utilizados, por isso não irei citá-los): o primeiro parâmetro obrigatório é uma string com o caminho e nome do arquivo que será manipulado, e o segundo é o método de abertura do arquivo, que irá variar de acordo com a funcionalidade do programa que está sendo desenvolvido. A função irá retornar um ponteiro (recurso) para o arquivo que será manipulado, e esse ponteiro será utilizado nas outras funções de manipulação de arquivo.

Exemplo de manipulação com fopen():

<?php
// O símbolo "@" é para suprimir os possíveis erros
$fp = @fopen("arquivo.txt""r");
// Testa se o arquivo foi aberto corretamente
if (!$fp) {
    echo 
"Nao foi possivel abrir o arquivo.";
    exit(
1);
}
// o função feof irá retornar TRUE quando o ponteiro $fp estiver no final do arquivo
while (!feof($fp)) {
    
// A função fgets lê 4096 bytes do ponteiro $fp ou até chegar no final da linha.
    
$buffer fgets($fp4096);
    
// Imprime na tela o linha
    
echo $buffer;
}
// Fecha o ponteiro do arquivo e evita que o mesmo seja corrompido
fclose($fp);

?>

A segunda forma e também a mais fácil é através da função file que recebe como argumento três valores, sendo que os dois últimos são utilizados em casos específicos e por isso não os abordarei aqui. O primeiro argumento passado é o arquivo ou recurso que será aberto. O valor retornado pela função é um array onde cada índice do array é correspondente a uma linha do arquivo.

Exemplo de manipulação com file()

<?php
// a função abre o arquivo e retorna em forma de array
$arquivo_linhas file("arquivo.txt");
// loop em todas as linhas do arquivo
foreach ($arquivo_linhas as $linha) {
    
// Imprime a linha
    
echo $linha;
}
?>

Nos dois exemplos o arquivo "arquivo.txt" será aberto, e o seu conteúdo será exibido através do comando echo. A principal diferença entre os dois é que ao abrir o arquivo com o fopen, apenas o valor retornado pela função fgets estará na memória, ou seja, 4096 bytes (4Kb) por iteração do loop; já com a função file a variável $arquivo_linhas terá todo o conteúdo do arquivo, consumindo muito mais memória. Talvez em um arquivo pequeno essa diferença não seja percebida, mas com um arquivo maior a diferença de performance é claramente percebida. É bom lembrar que se o arquivo aberto for muito grande talvez não seja possível ser aberto em virtude da configuração memory_limit do arquivo de configuração do PHP (php.ini).

Cada função tem um propósito diferente, sendo que em alguns casos uma pode ser mais adequada que a outra, a intenção do post foi dar uma explicação genérica utilizando as duas funções e mostrar a principal diferença com relação ao funcionamento de cada uma.

Espero que seja útil!!! t+