![]() |
|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]()
|
|
| wind1 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.6.2007 Репутация: нет Всего: нет |
Работаю с библиотекой 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 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 27.12.2011 Репутация: нет Всего: нет |
У меня была подобная проблема. решал сложно. Тут дело в нагрузке на сервак + в используемой памяти. Допустим какие то проблемы решит просто увеличение 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 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Попробуйте еще используя кеширование.
|
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: нет Всего: 140 |
некрофилы. на дату темы посмотрите
-------------------- Amazing |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Libraries | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |