| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Libraries > Экспорт с помощью phpExcel |
| Автор: wind1 3.12.2009, 09:07 | ||
| Работаю с библиотекой phpExcel. Нужно записать в excel-файл около 2000 строк (8 колонок в каждой). Но выскакивает ошибка "Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 2952 bytes)..." memory_limit в php.ini стоит 32 Мб. Неужели для того чтобы записать 2000 строк текста в файл, нужно больше 32 Мб памяти? Как можно обойти эту проблему? Вот код:
|
| Автор: Kypcop 27.12.2011, 16:46 | ||||
| У меня была подобная проблема. решал сложно. Тут дело в нагрузке на сервак + в используемой памяти. Допустим какие то проблемы решит просто увеличение max_execution_time = 300, max_input_time = 600, memory_limit = 4000M. Но вот проблему с нагрузкой на сервак всё равно не обойти, если у хостинга автоматом обрубаются подобные скрипты, требующие много ресурсов. Долго я бился над этой проблемой и решил. =) Наверняка Вам заранее известно сколько в Вашем Excel документе будет строк в таблице. Таким образом запускаем ваш скрипт (например script.php) и не заполняем таблицу, а пока только форматируем (рамки, высота и ширина ячеек, тип данных в ячейке итп) - короче подгатавливаем косметически ваш будущий файл. и на этом закончить работу скрипта, т.е. сохраняем ваш ваш файл в XLS на диск. Так как headers никакие не передавались, то пишем редирект в другой скрипт и передаём методом GET нужные переменные (ну либо в сессии их держим, но мне так не нравится):
и тем самым у нас начинает работать уже другой скрипт который открывает наш уже отформатированный файл по средствам phpexcel, загоняет в него первые например 10-15 строк, так же сохраняет это всё в файл и опять редирект и на этот раз такой, чтоб передать с какой строки начать работу следующему скрипту:
этот скрипт по сути точно такой же как и предыдущий с той лишь разницей, что он будет пересылать после обработки своих 10-15 строк и записи их в файл, не в самого себя, а в предыдущий скрипт script2.php с уже новым $row. так же нужно чтоб и в script3.php и в script2.php постоянно велась проверка не закончена ли работа, нужно ли вообще ещё что-то в файл записывать, либо таблица завершена, и если закончен, то редиректить на какой то завершающий скрипт, либо вывод информации юзеру о том, что всё готово. У меня например после заполнения полностью таблицы редиректится на скрипт заталкивающий в xls файл разные картинки, логотипы итп, а потом редиректит на страницу где пишется что всё готово и автоматом начинается закачка с сервака созданного файла. Кроме всего тут нужно учесть вот что: 1. Весь скрипт должен быть максимально оптимизирован под быстродействие. Все ненужные переменные стирать (unset(var);) итп. 2. Нужно рассчитать методом проб и ошибок сколько ваш скрипт гарантированно может максимально запихать в файл за 1 этап. 10-15 я написал для примера. 3. В середине каждого этапа я удаляю файл созданный в предыдущем этапе, чтоб их небыло после работы мильён, а в каждом этапе я создаю новый файл с новым названием. 4. Я ещё сделал между этапами редирект на скрипт просто выводящий инфу и тут же редиректю опять на следующий этап. Таким образом я вижу сколько уже обработано строк и тем самым ещё не плохо замедляю и разгружаю тем самым нагрузку на сервак. Таким образом вы получите возможность создавать любого размера xls файлы, любой сложности. главное рассчитать всё сколько за 1 этап позволяет сделать ваш сервак без ошибок. У меня вся эта схема уложилась в 6 файлов, но по идее можно и меньше. Просто я отточил её до идеала. =) |
| Автор: DeLuxis 13.6.2012, 12:56 | ||
Попробуйте еще используя кеширование.
|
| Автор: MoLeX 13.6.2012, 13:17 |
| некрофилы. на дату темы посмотрите |