За последние 24 часа нас посетил 22591 программист и 1558 роботов. Сейчас ищут 893 программиста ...

Загрузка файлов.Останавливается на 122мб. скачанного объема

Тема в разделе "Прочие вопросы по PHP", создана пользователем Riddick, 7 июн 2010.

  1. Riddick

    Riddick Активный пользователь

    С нами с:
    13 июн 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Россия
    Доброго времени суток.

    Разрабатываем сайт, предоставляющий для скачивания аудио в формате mp3 и видео файлы.

    Проблема: файлы, размером больше 120 мегабайт перестают качаться, все после одного и того же скачаного объема данных.

    PHP:
    1.  
    2. <?php
    3. /**
    4.      * give file to download
    5.      * @return void
    6.      */
    7.     function download()
    8.     {
    9.         $model = $this->getModel('mp3');
    10.         $path = $model->getPath();
    11.         //register_shutdown_function(array('Mp3Controller', 'delete_download'));
    12.         if($path !== 0 && $path !== -1 && $path !== -2 && $path !== -3 && $path !== -4) {
    13.           @set_time_limit(0);
    14.             @session_write_close();
    15.           $fp = @fopen(JPATH_BASE.$path, 'rb');
    16.             if ($fp !== false) {
    17.             $entryid = $model->down_start();
    18.                 $name = substr($path, strrpos($path, '/')+1);
    19.                     $size = filesize(JPATH_BASE.$path);
    20.                 /* BY SALE83 15/5/2010 */
    21.                   header("Content-Type: application/force-download; name=\"$name\"");
    22.                   header("Content-Transfer-Encoding: binary");
    23.                   header('Content-Length: ' . $size);
    24.                 header("Content-Disposition: attachment; filename=\"$name\"");
    25.                 header("Expires: 0");
    26.                   header("Cache-Control: no-cache, must-revalidate");
    27.                   header("Pragma: no-cache");
    28.             readfile(JPATH_BASE.$path);
    29.             exit;
    30.                  /* BY SALE83*/
    31.             } else {
    32.             echo JText::_('Sorry file is corrupted');
    33.           }/*
    34.         } elseif($path == -2) {
    35.           $url = 'index.php?option=com_user&view=register';
    36.           $this->setRedirect($url, JText::_('You should register to download music'));
    37.         } elseif($path == -3) {
    38.           $url = 'index.php?option=com_user&view=pay';
    39.           $this->setRedirect($url, JText::_('You can buy VIP account to download more music'));
    40.         } elseif($path == -4) {
    41.           $this->setRedirect('index.php?option=com_mp3&task=error');*/
    42.         } else {
    43.           echo "<script>if(window.opener) window.opener.location.href='index.php?option=com_mp3&task=error&ernum=".$path."';window.close();</script>";
    44.           //$this->setRedirect('/', JText::_('You have already exhausted music downloads for this month'));
    45.         }
    46.     }
    47. ?>
    48.  
    Пожалуйста помогите, может кто подскажет как реализовывал данный функционал? Заранее всем большое спасибо, жду ответа, столько времени уже голову ломаем...
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  3. fniit

    fniit Активный пользователь

    С нами с:
    7 июн 2010
    Сообщения:
    4
    Симпатии:
    0
    Похоже! В теме форума, по вашей ссылке речь идет о закачке файла на сервер, а в посте автора о скачивании.
    Столкнулся с подобной проблемой. Не подскажете, какие именно настройки php.ini за это отвечают?
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Не используйте readfile, т.к. он пытается загрузить весь файл в память и потом отдавать через PHP. Скорее всего вы просто упираетесь в лимит памяти.
    PHP:
    1. <?php
    2. $f = fopen('/path/to/file', 'r') or die('Error');
    3. while (!feof($f)) {
    4.     echo fread($f, 1024*1024); // Read 1 MB blocks
    5. }
    6. fclose($f);
    7.  
     
  5. fniit

    fniit Активный пользователь

    С нами с:
    7 июн 2010
    Сообщения:
    4
    Симпатии:
    0
    Насколько я знаю из радиотехники, flush - это именно отправка данных в среду. В Вашем решении его нет. Можете пояснить почему? Интересует принцип PHP :)
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Зато там есть echo.
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    fniit
    Потому что буффер этот не резиновый и если вы скажите "Выведи мне мегабайт", то этот мегабайт и пойдёт кусками, размером с буффер.
    Да и в конце концов я показал как, а детали это уже ваша забота :)