[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скачивание больших файлов из БД PostgreSQL
Страницы: 1, 2
Xakep
Добрый день

В общем проблема в том, что при скачивании больших файлов (> 130 мб) выходит ошибка:
br />
<b>Fatal error</b>: Allowed memory size of 134217728 bytes exhausted (tried to allocate 157360713 bytes) in <b> .... <b>223</b><br />


Подскажите пример как правильно скачивать файлы с БД PostgreSQL так что бы не срабатывало ограничение на размер файла

Мой код:

$query = getQuery("select lob,filename from test.files_table where id=:id");
$query->BindValue('id', $lob_id);
$query->Stmt->BindColumn('lob', $file, PDO::PARAM_LOB);
$query->Stmt->BindColumn('filename', $file_name, PDO::PARAM_STR);
if ($query->Execute()) {
$query->Stmt->fetch(PDO::FETCH_BOUND);
header("Content-Disposition: attachment; filename=\"$file_name\"");
fpassthru($file);
}
walerus
ini_set('memory_limit', '2048M');
побалуйся с выделением памяти, только не сильно :D
Xakep
Цитата (walerus @ 20.12.2017 - 20:51)
ini_set('memory_limit', '2048M');
побалуйся с выделением памяти, только не сильно :D

Это не вариант. И плохой пример. Так делать нельзя. Должен быть выход передать файл потоком
twin
Цитата (Xakep @ 20.12.2017 - 18:09)
Должен быть выход передать файл потоком
Прежде чем передать, нужно его получить из базы. А вот тут то и не хватает памяти. Если файл записан в базу целиком, то вряд ли можно придумать что-либо адекватное. Как можно считать поле BLOB частями... Так что без увеличения лимита не обойтись. Ну или пересмотреть логику и не хранить файлы в базе, что рассово намного вернее.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
killer8080
Xakep
раздавать файлы через php изначально ущербная идея, ну а ещё и хранить их в БД - полный трындец! Единственное верное решение - менять архитектуру приложения.
Контролируемое скачивание делается другими методами, если конечно речь об в этом, иначе вообще не понятно, зачем было так извращаться wink.gif
vagrand
Xakep
Правильно не хранить файлы в БД. Хоспади, 2017 год заканчивается, а кто-то это еще делает

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Guest
Цитата (vagrand @ 21.12.2017 - 10:28)
Xakep
Правильно не хранить файлы в БД. Хоспади, 2017 год заканчивается, а кто-то это еще делает

Это коммерческое приложение. Тут это необходимо
twin
Цитата (Guest @ 21.12.2017 - 06:35)
Это коммерческое приложение. Тут это необходимо
Необходимо делать глупости? Чем конкретно вызвана необходимость? Обычно в 99,99% случаев такая необходимость вызвана банальной некомпетентностью.


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Xakep
База используется postgreSQL а не MySQL. в постгре хранение файлов предусмотрена и есть специальная для этого таблица BLOBS

PDO и PG умеет отдавать большие файлы потоком напрямую в браузер и никакие лимиты не помешают. Тему можно закрывать. Решение найдено
AllesKlar
Цитата (vagrand @ 21.12.2017 - 08:28)
Xakep
Правильно не хранить файлы в БД. Хоспади, 2017 год заканчивается, а кто-то это еще делает

Конечно же делают, более того, даже целые базы данных придумывают под это и не только. Уже целый зоопарк NoSql баз, выбирай под конкретные потребности.

Xakep
Но вот Postgre не самое удачное решение для хранения файлов. BLOB не для файлов, а для BLOB данных, каковыми файлы так же являются. Но это не значит, что в поле BLOB можно безнаказанно шарахнуть гигабайт данных.

Да и вообще, как уже сказали, хоть и не совсем корректно, файлы хранить в базе нужно осторожно. Если у меня CDN картинок, не превышающих 10 мб, то база (специфичная, НЕ реляционная) - отличное решение.
Видеоконтент же я даже в пьяном угаре не запихну в базу.

_____________
[продано копирайтерам]
twin
Цитата (Xakep @ 21.12.2017 - 08:39)
База используется postgreSQL а не MySQL. в постгре хранение файлов предусмотрена и есть специальная для этого таблица BLOBS
Это не важно, кто что умеет. Важна целесообразность. Ты не ответил на вопрос, чем вызвана необходимость хранения файлов (особенно больших) в базе. Ведь минусы очевидны, а плюсы ты не озвучил. Тебе не все еще понятно пока, впереди столько интересного))) Допустим плановые бэкапы такой распухшей базы.
Цитата (Xakep @ 21.12.2017 - 08:39)
Тему можно закрывать. Решение найдено
Поделись, быть может мы тут все не правы и решение действительно достойно внимания.


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Xakep
Это не моя инициатива и "хотелка". Это конкретное требование заказчика. Я же сказал что это коммерческий проект. в БД хранятся документы графичесие, текстовые, твбличные, pdf и т.д.
максимальный размер файла 300 мб.

Цитата
Поделись, быть может мы тут все не правы и решение действительно достойно внимания.

я же сказал
Цитата
PDO и PG умеет отдавать большие файлы потоком напрямую в браузер

Например PDO или PG
walerus
Xakep
В твоем первом "коде", есть использование PDO, таким образом получается, что ты сам не попробовал прочесть мануал по PDO и его возможности, а сразу написал на форум... ?

Ладно-понятно, спасибо за "тык носом" на случай если вдруг понадобится решение cool.gif
Xakep
Цитата
В твоем первом "коде", есть использование PDO

PDO то там есть, но вот использован не правильно. Не мог понять в чем дело. А теперь я понял как его надо было правильно использовать. В мануале есть.
vagrand
AllesKlar
Цитата
Конечно же делают, более того, даже целые базы данных придумывают под это и не только. Уже целый зоопарк NoSql баз, выбирай под конкретные потребности.


Реальный пример подскажите, где обосновано хранить файлы в БД (реляционная или нет не имеет значения), а не в файловой системе? Ну и пример NoSQL базы, заточенной под хранение файлов настолько, что производительность выше хранения их в файловой системе, а то я вдруг действительно не знаю каких-то хороших инструментов.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.