Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспорт с помощью phpExcel 
:(
    Опции темы
wind1
  Дата 3.12.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 Мб памяти? Как можно обойти эту проблему?
Вот код:
Код

$oPhpExcel = new PHPExcel();
$oPhpExcel->setActiveSheetIndex(0);
for($i = 1; $i <= 2000; $i++) {
   for($j = 0; $j < 8; $j++) {
      $oPhpExcel->getActiveSheet()->setCellValueByColumnAndRow($j, $i, $aArray["records"][$i]["columns"][$j]["value"]);    
   }
                        
}

$oPhpExcel->getActiveSheet()->setTitle('Simple');
$oWriter = new PHPExcel_Writer_Excel2007($oPhpExcel);
$oWriter->save(str_replace('.php', '.xlsx', "D:/temp/123.php"));

PM MAIL   Вверх
Kypcop
Дата 27.12.2011, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.12.2011

Репутация: нет
Всего: нет



У меня была подобная проблема. решал сложно. Тут дело в нагрузке на сервак + в используемой памяти. Допустим какие то проблемы решит просто увеличение max_execution_time = 300, max_input_time = 600, memory_limit = 4000M. Но вот проблему с нагрузкой на сервак всё равно не обойти, если у хостинга автоматом обрубаются подобные скрипты, требующие много ресурсов. Долго я бился над этой проблемой и решил. =)

Наверняка Вам заранее известно сколько в Вашем Excel документе будет строк в таблице. Таким образом запускаем ваш скрипт (например script.php) и не заполняем таблицу, а пока только форматируем (рамки, высота и ширина ячеек, тип данных в ячейке итп) - короче подгатавливаем косметически ваш будущий файл. и на этом закончить работу скрипта, т.е. сохраняем ваш ваш файл в XLS на диск. Так как headers никакие не передавались, то пишем редирект в другой скрипт и передаём методом GET нужные переменные (ну либо в сессии их держим, но мне так не нравится):
Код

$redir="script2.php?file=".$filename."&row=0&id=".$id;
header("Location: ".$redir); exit();

и тем самым у нас начинает работать уже другой скрипт который открывает наш уже отформатированный файл по средствам phpexcel, загоняет в него первые например 10-15 строк, так же сохраняет это всё в файл и опять редирект и на этот раз такой, чтоб передать с какой строки начать работу следующему скрипту: 
Код

$redir="script3.php?file=".$filename."&row=".$row."&id=".$id; //  $row у нас уже равен например 15ти.
header("Location: ".$redir); exit();

этот скрипт по сути точно такой же как и предыдущий с той лишь разницей, что он будет пересылать после обработки своих 10-15 строк и записи их в файл, не в самого себя, а в предыдущий скрипт script2.php с уже новым $row. 

так же нужно чтоб и в script3.php и в script2.php постоянно велась проверка не закончена ли работа, нужно ли вообще ещё что-то в файл записывать, либо таблица завершена, и если закончен, то редиректить на какой то завершающий скрипт, либо вывод информации юзеру о том, что всё готово. У меня например после заполнения полностью таблицы редиректится на скрипт заталкивающий в xls файл разные картинки, логотипы итп, а потом редиректит на страницу где пишется что всё готово и автоматом начинается закачка с сервака созданного файла.

Кроме всего тут нужно учесть вот что:
1. Весь скрипт должен быть максимально оптимизирован под быстродействие. Все ненужные переменные стирать (unset(var);) итп.
2. Нужно рассчитать методом проб и ошибок сколько ваш скрипт гарантированно может максимально запихать в файл за 1 этап. 10-15 я написал для примера.
3. В середине каждого этапа я удаляю файл созданный в предыдущем этапе, чтоб их небыло после работы мильён, а в каждом этапе я создаю новый файл с новым названием.
4. Я ещё сделал между этапами редирект на скрипт просто выводящий инфу и тут же редиректю опять на следующий этап. Таким образом я вижу сколько уже обработано строк и тем самым ещё не плохо замедляю и разгружаю тем самым нагрузку на сервак.

Таким образом вы получите возможность создавать любого размера xls файлы, любой сложности. главное рассчитать всё сколько за 1 этап позволяет сделать ваш сервак без ошибок.  У меня вся эта схема уложилась в 6 файлов, но по идее можно и меньше. Просто я отточил её до идеала. =)
PM MAIL   Вверх
DeLuxis
Дата 13.6.2012, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.6.2012

Репутация: нет
Всего: нет



Попробуйте еще используя кеширование.
Код


        $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
        PHPExcel_Settings::setCacheStorageMethod($cacheMethod);



PM MAIL   Вверх
MoLeX
Дата 13.6.2012, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: нет
Всего: 140



некрофилы. на дату темы посмотрите


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Libraries | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.