первый раз, поэтому извините, если я что-то не так.
Я пытаюсь создать безопасный магазин для скачивания файлов. На самом деле это работает, но только с небольшим файлом. У меня есть продукт на 1.9 Гб для загрузки, и он постоянно останавливается во время передачи. Несоответствующие размеры тоже, у меня было до 1 ГБ, но часто это 200-500 МБ.
Цель состоит в том, чтобы создать пространство, где только пользователи с зарегистрированной учетной записью могут скачать файл, поэтому прямая ссылка невозможна.
Я читал в другом месте на этом сайте, что сброс тайм-аута скрипта в цикле чтения файла должен обойти ограничение времени скрипта.
try
{
$num_bytes = filesize ("products/" . $filename);
$mp3content = fopen("products/" . $filename, "rb") or die("Couldn't get handle");
$bytes_read=0;
if ($mp3content) {
while (!feof($mp3content)) {
set_time_limit(30);
$buffer = fread($mp3content, 4096);
echo $buffer;
$bytes_read+=4096;
}
fclose($handle);
}
}
catch (Exception $e)
{
error_log("User failed to download file: " . $row['FILENAME'] . "(" . $row['MIMETYPE'] . ")\n" . $e, 1, getErrorEmail());
}
error_log("Bytes downloaded:" . $bytes_read . " of " . $num_bytes, 1, getErrorEmail());
Я не получаю окончательное сообщение об ошибке в журнале ошибок для больших файлов, которые терпят неудачу, но я получаю электронные письма для файлов меньшего размера, которые успешно выполняются, поэтому я знаю, что код работает в принципе.
Оказывается, мой хостинг является проблемой. PHP-код верен, но моя среда общего хостинга ограничивает все php-скрипты 30 секундами, что в случае с приведенным выше кодом занимает около 15 минут. Если кто-то не может придумать способ связать PHP в методах обработки файлов, которые не влияют на таймер, похоже, что он застрял.
Попробуй это
set_time_limit(0);