Существует существенная разница между fread()
и readfile()
.
Во-первых, readfile()
делает ряд вещей, которые fread()
не делает. readfile()
открывает файл для чтения, читает его, а затем печатает его в выходной буфер в одном go. fread()
выполняет только одно из этих действий: читает байты из заданного дескриптора файла .
Кроме того, readfile()
имеет некоторые преимущества, которых нет у fread()
. Например, он может использовать преимущества сопоставленного с памятью ввода-вывода , где это возможно, а не более медленное чтение с диска. Это значительно повышает производительность чтения файла, поскольку он делегирует процесс от самого PHP и более на вызовы операционной системы.
Ошибки
Я ранее отмечал, что readfile()
может работать без PHP (это исправлено ниже).
Для действительно больших файлов (например, несколько гигов, таких как медиа-файлы или резервные копии больших архивов), вы можете рассмотреть вместо этого делегировать чтение файла из PHP полностью с заголовками X-Sendfile
на ваш веб-сервер (чтобы вы не держали своего работника PHP привязанным к продолжительности загрузки, которая потенциально может занять часы).
Так что вы могли бы сделать что-то подобное вместо readfile()
:
<?php
/* process some things in php here */
header("X-Sendfile: /path/to/file");
exit; // don't need to keep PHP busy for this