После загрузки файла сайт становится невосприимчивым. Что я делаю неправильно?

У меня есть код ниже, который я использую для загрузки файла с жесткого диска. Проблема, которую я получаю, заключается в том, что если я остановлю загрузку посередине или после окончания загрузки, сайт перестанет отвечать на запросы. Любая идея почему? Окружающая среда - LAMP.

.
.
.
// get mime type
if ($dwld_allowed_ext[$fext] == '') {
    $mtype = '';
    // mime type is not set, get from server settings
    if ($file_type == null) {
        if (function_exists('mime_content_type')) {
            $mtype = mime_content_type($file_path);
        }
        else if (function_exists('finfo_file')) {
            $finfo = finfo_open(FILEINFO_MIME); // return mime type
            $mtype = finfo_file($finfo, $file_path);
            finfo_close($finfo);
        }
    }
    else {
        $mtype = $file_type;
    }
    if ($mtype == '') {
        $mtype = "application/force-download";
    }
}
else {
    // get mime type defined by admin
    $mtype = $dwld_allowed_ext[$fext];
}

$asfname = $fname;

// set headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mtype");
header("Content-Disposition: attachment; filename=\"$asfname\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);

// download
// @readfile($file_path);
$file = @fopen($file_path,"rb");
if ($file) {
    while(!feof($file)) {
        print(fread($file, 1024*8));
        flush();
        if (connection_status()!=0) {
            @fclose($file);
            die();
        }
    }
    @fclose($file);
}

Ответ 1

Вызовите session_write_close() прямо перед отправкой заголовков загрузок.

См. этот комментарий:

Возможно, стоит отметить, что если ваш сайт использует фронтальный контроллер с сессий, и вы отправляете большой файл в Пользователь; вы должны завершить сеанс перед отправкой файла, иначе пользователь не сможет продолжить просмотр сайта пока файл загружается.

Ответ 2

Становится ли он полностью безответственным? Недоступен для других пользователей? другие браузеры? Я спрашиваю, потому что у меня есть несколько сайтов, где остановка большой загрузки страницы будет долгое время зависеть FireFox. Другие браузеры (на одном компьютере) и другие пользователи могут получить доступ к сайту. По-видимому, в моем случае FF висит, но сайт в порядке.

Изменить: после прочтения кода кажется немного подозрительным, что команда закрытия файла находится внутри цикла while, проверяющего eof. Попробуйте команду readfile, чтобы заменить всю эту вещь, которую вы делаете: http://us2.php.net/manual/en/function.readfile.php

Ответ 3

Попробуйте добавить exit(); после того, как вы напечатаете файл (после последнего } в предоставленном сжатии). Это остановит PHP на анализе остальной части вашего кода, что является одной из причин, по которым вы можете столкнуться с проблемами, которые вы описываете.