разница между readfile () и fopen () - PullRequest
2 голосов
/ 09 января 2020

Оба этих кода выполняют одно и то же при чтении файлов, в чем же основное отличие?

1-первый код:

$handle = fopen($file, 'r');
$data = fread($handle, filesize($file));

2-второй код:

readfile($file);

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Существует существенная разница между 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
2 голосов
/ 09 января 2020

Чтение документов, readfile читает весь контент и записывает его в STDOUT.

$data = fread($handle, filesize($file));

Пока fread помещает контент в переменную $ data.

...