readfile în PHP

Citește un fișier și îl trimite direct la ieșire (spre browser), fără să îl încarce în memorie.

Sintaxă
readfile(string $filename, bool $use_include_path = false, $context = null): int|false

Ce face readfile

readfile afișează conținutul unui fișier, bucată cu bucată, și returnează numărul de octeți trimiși. Spre deosebire de echo file_get_contents(...), nu păstrează tot fișierul în memorie, deci merge și pentru fișiere mari.

Este funcția folosită de obicei pentru descărcări: trimiți întâi antetele (Content-Type, Content-Disposition), apoi apelezi readfile.

Parametri

Parametru Descriere
$filename Fișierul trimis.
$use_include_path Opțional. true caută fișierul și în include_path.
$context Opțional. Un context de stream.

Ce returnează

Numărul de octeți citiți sau false la eroare.

Exemple

Exemplul 1: Afișarea unui fișier

<?php
file_put_contents("anunt.txt", "Magazinul este închis luni.\n");

$octeti = readfile("anunt.txt");
echo "($octeti octeți)";

Rezultat

Magazinul este închis luni.
(29 octeți)

Exemplul 2: Descărcarea unei facturi

Pe server, browserul primește fișierul ca descărcare cu numele ales.

<?php
$fisier = __DIR__ . "/facturi/factura-1024.pdf";

header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"factura-1024.pdf\"");
header("Content-Length: " . filesize($fisier));

readfile($fisier);
exit;

Rezultat în browser

Browserul descarcă fișierul factura-1024.pdf.

Greșeli frecvente

  • Afișezi text sau HTML înainte de readfile într-o descărcare. Textul intră în fișierul descărcat și îl strică. Nu afișa nimic altceva și oprește scriptul cu exit după.
  • Pui numele fișierului direct din $_GET. Oricine poate descărca orice fișier de pe server. Folosește basename și un director fix.

Comenzi înrudite

  • fpassthru: Trimite la ieșire tot restul unui fișier deschis, de la poziția curentă până la final.
  • file_get_contents: Citește tot conținutul unui fișier (sau al unei adrese URL) într-un text.
  • basename: Returnează doar numele fișierului dintr-o cale, fără directoare.
  • filesize: Returnează dimensiunea unui fișier, în octeți.