Доброго времени суток. Разрабатываем сайт, предоставляющий для скачивания аудио в формате mp3 и видео файлы. Проблема: файлы, размером больше 120 мегабайт перестают качаться, все после одного и того же скачаного объема данных. PHP: <?php /** * give file to download * @return void */ function download() { $model = $this->getModel('mp3'); $path = $model->getPath(); //register_shutdown_function(array('Mp3Controller', 'delete_download')); if($path !== 0 && $path !== -1 && $path !== -2 && $path !== -3 && $path !== -4) { @set_time_limit(0); @session_write_close(); $fp = @fopen(JPATH_BASE.$path, 'rb'); if ($fp !== false) { $entryid = $model->down_start(); $name = substr($path, strrpos($path, '/')+1); $size = filesize(JPATH_BASE.$path); /* BY SALE83 15/5/2010 */ header("Content-Type: application/force-download; name=\"$name\""); header("Content-Transfer-Encoding: binary"); header('Content-Length: ' . $size); header("Content-Disposition: attachment; filename=\"$name\""); header("Expires: 0"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); readfile(JPATH_BASE.$path); exit; /* BY SALE83*/ } else { echo JText::_('Sorry file is corrupted'); }/* } elseif($path == -2) { $url = 'index.php?option=com_user&view=register'; $this->setRedirect($url, JText::_('You should register to download music')); } elseif($path == -3) { $url = 'index.php?option=com_user&view=pay'; $this->setRedirect($url, JText::_('You can buy VIP account to download more music')); } elseif($path == -4) { $this->setRedirect('index.php?option=com_mp3&task=error');*/ } else { echo "<script>if(window.opener) window.opener.location.href='index.php?option=com_mp3&task=error&ernum=".$path."';window.close();</script>"; //$this->setRedirect('/', JText::_('You have already exhausted music downloads for this month')); } } ?> Пожалуйста помогите, может кто подскажет как реализовывал данный функционал? Заранее всем большое спасибо, жду ответа, столько времени уже голову ломаем...
Похоже! В теме форума, по вашей ссылке речь идет о закачке файла на сервер, а в посте автора о скачивании. Столкнулся с подобной проблемой. Не подскажете, какие именно настройки php.ini за это отвечают?
Не используйте readfile, т.к. он пытается загрузить весь файл в память и потом отдавать через PHP. Скорее всего вы просто упираетесь в лимит памяти. PHP: <?php $f = fopen('/path/to/file', 'r') or die('Error'); while (!feof($f)) { echo fread($f, 1024*1024); // Read 1 MB blocks } fclose($f);
Насколько я знаю из радиотехники, flush - это именно отправка данных в среду. В Вашем решении его нет. Можете пояснить почему? Интересует принцип PHP
fniit Потому что буффер этот не резиновый и если вы скажите "Выведи мне мегабайт", то этот мегабайт и пойдёт кусками, размером с буффер. Да и в конце концов я показал как, а детали это уже ваша забота