Иногда нужно отдавать файлы не прямой ссылкой, а через скрипт — чтобы считать загрузки или скрывать реальную иерархию на сервере. Главная проблема тут — нагрузка на память. Если просто делать readfile(), php может «захлебнуться» на больших объемах, пытаясь прогнать файл через буфер.Правильный подход — полная очистка буферизации перед стартом и передача точных заголовков. Это позволяет браузеру корректно обработать поток данных и показать пользователю реальное время загрузки.
Пример реализации:
// Путь к защищенному ресурсу за пределами публичной папки
$target_file = $path_to_vault . $secure_filename;
if (file_exists($target_file)) {
// Сбрасываем все уровни буферизации
while (ob_get_level()) ob_end_clean();
header('Content-Description: file Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($target_file) . '"');
header('Content-Length: ' . filesize($target_file));
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile($target_file);
exit;
}
Такой метод позволяет полностью контролировать доступ. Скрипт выступает в роли шлюза: он проверяет права, считает статистику и только потом открывает поток. Это база для построения защищенных архивов, где важна не только скорость, но и скрытность расположения данных.
Ваш Админ