Принудительная загрузка большого файла с php - PullRequest
3 голосов
/ 13 декабря 2010

Многие пользователи моего сайта сообщают о проблемах при загрузке большого файла (80 МБ).Я использую принудительную загрузку с использованием заголовков.Я могу предоставить дополнительные настройки PHP при необходимости.Я использую фреймворк CakePHP, но весь этот код - обычный php.Я использую php 5.2 с apache на выделенном виртуальном сервере из медиа храма, CentOS Linux.Видите ли вы какие-либо проблемы со следующим кодом:

        set_time_limit(1500);
        header("Content-Type: application/octet-stream");
        header("Content-Disposition: attachment; filename=\"" . basename($file_path) . "\"");
        header("Content-Length: ".$content_length);
        header("Content-Transfer-Encoding: binary");
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Cache-Control: private', false);
        header('Pragma: public');
        header('Expires: 0');

        //Change this part
        $handle = fopen($file_path, 'rb');
        while (!feof($handle))
        {
            echo fread($handle, 4096);
            ob_flush();
            flush();
        }
        fclose($handle);
        exit;

По существу, сообщаемая проблема заключается в том, что загрузка начинается, а затем останавливается в середине.Я думал, что это проблема с ограничением по времени, поэтому я добавил код set_time_limit.Раньше я использовал функцию php readfile, но она также не работала гладко.

Ответы [ 2 ]

4 голосов
/ 13 декабря 2010

Проблема с передачей http, инициированной PHP, заключается в том, что они редко поддерживают частичные запросы:

GET /yourfile HTTP/1.1
Range: bytes=31489531-79837582

Всякий раз, когда браузер сталкивается с проблемой передачи, он пытается возобновить загрузку. Ваш php-скрипт не подходит для этого (это не тривиально, так что никто не делает).

Так что действительно избегайте этого. Перенаправьте пользователей в статический файл, и пусть ваш веб-сервер справится с этим. Если вам нужно обработать авторизацию, используйте хитрости, такие как символические ссылки или перезаписывающие файлы, которые проверяют файлы cookie сеанса или даже статический файл разрешений (./allowed/178.224.2.55-file-1). Любые необходимые дополнительные HTTP-заголовки могут быть введены аналогичным образом или с файлом .meta.

1 голос
/ 13 декабря 2010

Я не вижу никаких проблем, но для S & G попробуйте поместить set_time_limit внутри цикла while.Это гарантирует, что они не достигнут жесткого предела и (до тех пор, пока клиент получит информацию) срок будет продлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...