[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Закачка с подкачкой
Страницы: 1, 2
Владимир55
Задача - скачать в файл на компьютере содержимое выбранных таблиц базы данных. Для этой цели производится построчная выборка из базы и формирование переменной $myCsvFile, которая затем передается на компьютер путем вызова следующей формы:
header("Content-Description: File Transfer\r\n");  
header("Pragma: public\r\n");
header("Expires: 0\r\n");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0\r\n");
header("Cache-Control: public\r\n");
header("Content-Type: text/plain; charset=UTF-8\r\n");
header("Content-Disposition: attachment; filename=\"myfile.csv\"\r\n");
echo $myCsvFile;
exit;
Поскольку объем выборки получатся довольно большим, то и переменная $myCsvFile требует очень много памяти.

А нельзя ли сделать так, чтобы инфа из базы, которая считывается построчно, также построчно передаваась бы на компьютер? Как бы дописывая файл на компе подобно тому, как дописывается файл на сервере функцией
file_put_contents('myfile.csv', $myCsvFile, FILE_APPEND); 
Игорь_Vasinsky
Цитата
Как бы дописывая файл на компе


user posted image

упаковывайте в zip

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
выводи без добавления в переменную.

while(($row = mysql_query($res))) {

echo toCsv($ow);
}
killer8080
Владимир55
если информация обновляется не сильно часто, лучше просто генерить файл, и отдавать обычную статику.
PS и уберите \r\n из header()
kaww
Цитата (killer8080 @ 17.05.2013 - 06:29)
PS и уберите \r\n из header()
это я так посоветовал, ну то есть нагуглил овет и поленился исправить biggrin.gif
Владимир55
Цитата (kaww @ 17.05.2013 - 06:14)
выводи без добавления в переменную.

Что-то я не пойму, как инфа попадет в файл...

Можете пояснить Вашу мысль?
kaww
Владимир55
т.е. сначала пишете в файл? Я думал отдаете динамически. Тогда простто дописывайте в файл, как и сам же привели пример
Цитата
file_put_contents('myfile.csv', $myCsvFile, FILE_APPEND);

только по строчно:
while(($row = mysql_query($res))) {

file_put_contents('myfile.csv', toCsv(row), FILE_APPEND);
}

затем перенаправляйте на файл пользователя для загрузки
Владимир55
Цитата (kaww @ 17.05.2013 - 06:37)
Владимир55
т.е. сначала пишете в файл? Я думал отдаете динамически.

Вы правильно подумали - желательно именно отдавать динамически, не записывая в файл.

Как это осуществить "без дополнения в переменную", как Вы предложили?
kaww
Цитата (Владимир55 @ 17.05.2013 - 06:43)
Как это осуществить "без дополнения в переменную"

вместо $myCsvFile .= toCsv($row) делать echo toCsv($row)
Владимир55
Практика показала неожиданный результат - объем занимаемой памяти точно такой же, как и при полном считывании файла! То есть, никакой подкачки не происходит, а инфа просто накапливается в оперативной памяти.

И это естественно, ведь echo не выполняется до тех пор, пока не отработают все директивы РНР.

Так что, похоже, задача не имеет решания...
killer8080
Цитата (Владимир55 @ 18.05.2013 - 12:17)
То есть, никакой подкачки не происходит

А что в твоем понимании означает "подкачка"? rolleyes.gif
Цитата (Владимир55 @ 18.05.2013 - 12:17)
И это естественно, ведь echo не выполняется до тех пор, пока не отработают все директивы РНР.

глупости
Владимир55
Цитата
А что в твоем понимании означает "подкачка"?
Это написано в теме.
killer8080
Цитата (Владимир55 @ 18.05.2013 - 12:39)
Это написано в теме.

Где? Я не вижу там ни какой подкачки, просто отдача контента в поток.
Владимир55
Тама звучит:
Цитата
сделать так, чтобы инфа из базы, которая считывается построчно, также построчно передаваась бы на компьютер? Как бы дописывая файл на компе подобно тому, как дописывается файл на сервере функцией
file_put_contents('myfile.csv', $myCsvFile, FILE_APPEND); 
killer8080
Цитата (Владимир55 @ 18.05.2013 - 13:02)
Тама звучит:
Цитата сделать так, чтобы инфа из базы, которая считывается построчно, также построчно передаваась бы на компьютер?

ну так echo и будет выводить построчно, отключи буферизацию, и всё, проблем с нехваткой памяти не будет smile.gif
Быстрый ответ:

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