Qual é a diferença entre readfile e file_get_contents em PHP?
O PHP é uma linguagem que tem uma grande quantidade de funções que, as vezes, parecem fazer as mesmas coisas. Um bom exemplo disso é funções que manipulam arquivos.
Por exemplo, para ler um arquivo, você poderia escolher entre as funções file_get_contents
, fopen
, readfile
, file
ou a classe SplFileObject
. É claro que cada uma delas é usado em cenários diferentes.
Por exemplo, das funções que citei acima, eu costumo utilizar muito readfile
e file_get_contents
. E é importante sabermos a diferença entre delas, para saber melhor em qual centário utilizadas.
Como funciona a função file_get_contents?
A função file_get_contents
tem como finalidade ler todo o conteúdo de um arquivo para uma string
, sendo possível, por exemplo, armazenar todo valor de um arquivo de texto em uma variável.
Por exemplo:
$json_contents = file_get_contents('config.json');
No exemplo acima, ao fazer essa chamada, você obteria toda o valor de config.json
em uma string
e tratar conforme desejar (por exemplo, você poderia usar json_decode
para transformar os dados em um array
ou object
).
É importante lembrar que esta função não serve apenas para ler arquivos. Além de fazer isso, o file_get_contents
também pode fazer outras coisas, como enviar requisições GET ou POST, como escrevi em Exemplos de uso do file_get_contents.
Como funciona a função readfile?
Ela lê e exibe todo o conteúdo de um arquivo. Diferentemente do file_get_contents
, que retorna a string
, a função readfile
envia para a saída todo o conteúdo do arquivo. Ela retorna um valor int
, contendo o número de bytes contido no arquivo lido.
É como se o PHP tivesse percorrido cada linha e executado um echo
em cada uma delas.
Você pode achar que isso é alguma desvantagem, mas em alguns casos você precisará apenas enviar o conteúdo de um arquivo direto para o output, sem guardar esses valores na memóriaDas funções que citei acima, eu costumo utilizar muito readfile
e file_get_contents
. É necessário informar que ess.
Por exemplo, se quiser imprimir uma imagem através de um script PHP, você poderá fazer assim:
header('Content-Type: image/png');
readfile('/protegido/imagens/arquivo.jpg');
No caso acima, o readfile
poderia ser vantajoso em relação ao file_get_contents
, pois evitaria, por exemplo, sobrecarregar o servidor, no caso de carregar um arquivo muito grande, uma vez que file_get_contents
armazena o valor para uma string.
Conclusão
Resumindo todo o artigo, a diferença entre file_get_contents
e readfile
é que a primeira retorna o conteúdo de um arquivo em uma string
e a segunda apenas lê o conteúdo de um arquivo.
Sendo assim, use file_get_contents
quando precisar trabalhar com os conteúdo do arquivo diretamente. Por exemplo, file_get_contents
será ideal ser você precisar realizar substituições, desserializações, ou qualquer outra necessidade que seja o conteúdo inteiro do arquivo.
No caso do readfile
, utilize-o se você precisar de apenas exibir o conteúdo do arquivo para o cliente, ou mesmo escrevê-lo na saída do seu terminal/shell/console.