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.