Ситуация: мы храним файлы на Amazon S3 и записываем информацию в нашу базу данных. Теперь пользователь может загружать файлы по ссылке для скачивания, например www.myserver.de/downloadFile?id=1234.
Это работает довольно хорошо, но мы получаем несколько ошибок «Превышено максимальное время выполнения 800 секунд».
Наш текущий код для скачивания:
header("Pragma: public");
header("Expires: -1");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
if($mimeType)
{
header("Content-Type: ".$mimeType);
}
else
{
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename.";");
}
header("Content-length: ".$filesize);
$s3Client = new s3Client();
//download the file from s3 to local server
$s3Client->getFile($folder, $filename, $tempFolder.$filename);
$filehandle = fopen($tempFolder.$filename, "rb");
while(!feof($filehandle))
{
print(@fread($filehandle, 1024*8));
ob_flush();
flush();
if(connection_status() != 0)
{
@fclose($filehandle);
unlink($tempFolder.$filename);
exit;
}
}
@fclose($filehandle);
unlink($tempFolder.$filename);
exit;
Ошибка максимального времени выполнения происходит даже с очень маленькими файлами (всего несколько КБ). Похоже, что есть проблема в цикле, и это не будет завершено?
Странная вещь: загрузка все равно работает?
Когда в нашем журнале появляется ошибка тайм-аута, мы сами пытаемся загрузить файл, и он работает отлично.
Источник для этого способа загрузки файлов: http://www.media-division.com/the-right-way-to-handle-file-downloads-in-php/
Задача ещё не решена.
Других решений пока нет …