Принудительная загрузка PHP - файлы размером более 100 МБ загрузят всего несколько кусков - PullRequest
0 голосов
/ 13 января 2012

После того, как мой хостинг-провайдер обновил сервер (Debian) и PHP (с 5.2.6 до 5.3.2), у меня возникли проблемы со скриптом загрузки файлов на нашем сайте. Файлы размером менее 100 МБ будут загружаться нормально, но файлы размером более 100 МБ будут загружаться только как файл размером 156 байт ... Вот мой сценарий загрузки:

class Download_Controller extends Website_Controller
{

    public function index()
    {
        if (isset($_GET['file'])) {
          $file     = $_GET['file'];
          $filORM   = ORM::factory('file')->where('filename', $file)->find();

          if ($filORM->loaded and $filORM->deleted=='N' and file_exists(APPPATH.'downloads/'.$file) ) {
            //we can serve file download
            $this->auto_render = false;

            $filORM->counter = $filORM->counter + 1;
            $filORM->save();

            $dl = ORM::factory('download');
            $dl->download_file_id = $filORM->id;
            $dl->created = time();
            $dl->country_id = $this->country->id;
            $dl->ip = $this->_getRealIpAddr();
            $dl->browser = Kohana::user_agent('browser');
            $dl->version = Kohana::user_agent('version');
            $dl->platform = Kohana::user_agent('platform');
            $dl->save();

            return download::force(APPPATH.'downloads/'.$file);
          }
          else {
            $this->download_error();
          }

        }
        else {
            //else here we load download center UI
            $this->section();
        }
    }   
}

Я использую фреймворк Kohana PHP. Версия 2.3.x.

Ответы [ 4 ]

2 голосов
/ 13 января 2012

В комментариях вы дали мне примеры ссылок, я попробовал одну и 156-байтовый файл, который я скачал, содержал следующее:

Неустранимая ошибка: допустимый объем памяти 134217728 байт исчерпан (попыталсявыделите 141637633 байт) в /home/www-data/system/helpers/download.php в строке 93

Это совершенно ясно - PHP исчерпал память.Я предполагаю, что при обновлении они также изменили memory_limit в php.ini.Краткосрочное решение состоит в том, чтобы изменить его обратно к исходному (более высокому) значению.

Для загрузки больших файлов вы должны изучить mod_xsendfile (также доступный для серверов, отличных от apache), чтовключает в себя установку специального http-заголовка и передачу работы веб-серверу вместо php.

0 голосов
/ 13 января 2012

Я не знаю, каков код download::force(), но я думаю, что он загружает весь файл в память, и PHP перестает работать с ошибкой вроде Allowed memory size is exhausted. Вам нужно загрузить и вывести ваш файл небольшими порциями, проверяя, прервал ли клиент соединение.

Обновление

Ваш файл содержит Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 141637633 bytes) in /home/www-data/system/helpers/download.php on line 93. Итак, как я написал, выведите его небольшими кусками.

0 голосов
/ 13 января 2012

Вы можете попробовать readfile(APPPATH.'downloads/'.$file), а затем exit() напрямую без return, тогда вы больше не будете связаны с проблемами с памятью

0 голосов
/ 13 января 2012

Если код Kohana download::force() работает так же, как, возможно, в любой другой среде - PHP просто не может или не может хранить в памяти более 100 МБ данных.

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