В настоящее время у меня возникают проблемы с загрузкой пользователем файла, хранящегося на моем сервере. У меня есть код для автоматической загрузки файла, как только пользователь нажимает кнопку загрузки. Он работает для всех файлов, но когда размер get превышает 30 МБ, у него возникают проблемы. Есть ли ограничение на загрузку пользователя? Кроме того, я предоставил свой пример кода, и мне интересно, есть ли более эффективная практика, чем использование функции PHP «file_get_contents».
Спасибо всем за помощь!
$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/'; $filename = 'filename.zip'; $filesize = filesize($path . $filename); @header("Content-type: application/zip"); @header("Content-Disposition: attachment; filename=$filename"); @header("Content-Length: $filesize") echo file_get_contents($path . $filename);
file_get_contents()
загрузит весь файл в память – используя его журнал.
И, в PHP, объем памяти, которую может использовать скрипт, ограничен (см. memory_limit
) – что может объяснить, что ваш сценарий загрузки не работает для больших файлов.
Использование readfile()
вместо этого может быть лучшим выбором: он будет читать файл и напрямую отправлять его содержимое в выходной буфер.
Это означает :
Просто использовать что-то вроде этого должно быть ОК:
$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/'; $filename = 'filename.zip'; $filesize = filesize($path . $filename); @header("Content-type: application/zip"); @header("Content-Disposition: attachment; filename=$filename"); @header("Content-Length: $filesize") readfile($path . $filename);
(Кстати: действительно ли вы хотите, чтобы эти ошибки были log_errors
с помощью оператора @
? Еще одним решением может быть не отображать их, а записывать их в файл – см. log_errors
, log_errors
и error_log
)
file_get_contents()
вытаскивает содержимое файла в виртуальную машину PHP. Используйте readfile()
для потоковой передачи файла без его чтения.