Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
useruser
63 / 63 / 30
Регистрация: 29.06.2015
Сообщений: 675
1

PHPExcel некорректно работает на сервере

12.02.2016, 13:40. Просмотров 1772. Ответов 8
Метки нет (Все метки)

PHPExcel работает на Open Server и некорректно работает на Linux Debian.
Создает файл с расширением xlsl, потом его удаляет и снова создает но пустой. При открытии excel - ошибка.


На сервере Linux Debian конфиг php.ini почти не правил. Дополнительные расширения, кроме Zend не ставил.
php_info если надо...
https://jsfiddle.net/842aoorc/

PHPExcel требует
PHP version 5.2.0 or higher
PHP extension php_zip enabled *)
PHP extension php_xml enabled
PHP extension php_gd2 enabled (if not compiled in)

Код
PHP
1
2
3
echo "GD: ", extension_loaded('gd') ? 'OK' : 'MISSING', '<br>';
echo "XML: ", extension_loaded('xml') ? 'OK' : 'MISSING', '<br>';
echo "zip: ", extension_loaded('zip') ? 'OK' : 'MISSING', '<br>';
Выводит везде Ok. Т.е. получается всё установлено?

Подскажите, почему PHPExcel работает на Open Server и некорректно работает на Linux Debian?

Сам код если что. Работает без ошибок на Openserver и выдает правильный результат - excel таблицу.
На сервере вызывает ошибку 500, через некоторое время. Т.е. все сделал (создал файлы, обновил бд..), дошел до создания excel файла и выдал ошибку 500.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
error_reporting(E_ERROR);
 
include 'addons/PHPExcel/PHPExcel.php';
include 'addons/PHPExcel/PHPExcel/Writer/Excel2007.php';
$objPHPExcel = new PHPExcel();
 
$path_to_xlsx_file=$_SERVER['DOCUMENT_ROOT'].'/'.$sitedir."/files/TABLE1/1.xlsx";
//Заголовок
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0,1,'F1');
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1,1,'F2');
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(2,1,'F3');
 
$result = mysql_query("SELECT * FROM `TABLE1`");
$select_amt = mysql_num_rows($result);
for($i=2; $i<$select_amt+2; $i++)
{
//Данные
$row=mysql_fetch_assoc($result);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0,$i,$row[F1]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1,$i,$row[F2]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(2,$i,$row[F3]);
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save($path_to_xlsx_file);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2016, 13:40
Ответы с готовыми решениями:

Некорректно работает выборка из БД
Всем доброго времени. Прошу прощения, что задаю такие глупые вопросы. Но я...

Некорректно работает date() на денвере
почему на денвере date('H:i:s',3600) добавляется 4 часа php ...

Не работает POST запрос на сервере...
Есть код: $fp = fsockopen($parts, isset($parts)?$parts:80, ...

Пример с одного сайта у меня на сервере не работает
В учебнике: http://ru.html.net/tutorials/php/lesson5.php , я нашел вот такой...

PHPExcel и графики
В общем есть вот код который записывает массив данных в Excel ...

8
pav1uxa
1858 / 1712 / 802
Регистрация: 23.01.2014
Сообщений: 6,082
Завершенные тесты: 1
12.02.2016, 19:11 2
Цитата Сообщение от useruser Посмотреть сообщение
PHPExcel работает на Open Server и некорректно работает на Linux Debian.
Цитата Сообщение от useruser Посмотреть сообщение
Подскажите, почему PHPExcel работает на Open Server и некорректно работает на Linux Debian?
Как то странно вы сравниваете. Open Server это некая платформа, по большей степени используется как веб-сервер (с PHP). Он не может работать автономно, без операционной системы. Linux Debian это операционная система. Она сама по себе не может исполнять код PHP без PHP-интерпретатора (или веб-сервера с php).

Ну да бог с ним. По поводу ошибки. Сама о себе она не говорит ни о чем, лишь о том что возникли проблемы с настройками веб-сервера или его модулями. Нужно смотреть - что пишется в логах веб-сервера на этот момент.
1
useruser
63 / 63 / 30
Регистрация: 29.06.2015
Сообщений: 675
15.02.2016, 08:55  [ТС] 3
Что пишется в логах веб-сервера на этот момент.
-----------------------------------
[Mon Feb 15 10:13:19 2016] [error] [client 10.1.140.26] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 9946728 bytes) in /var/www/1/addons/PHPExcel/PHPExcel/Writer/Excel2007.php on line 304, referer: http://10.1.140.36/1/admin/admin.php?upload_handbook&handbook_name=1
[Mon Feb 15 10:13:20 2016] [notice] child pid 4526 exit signal Segmentation fault (11)
-----------------------------------
На сервере в это время создается exel файл, но он некорректный. Должен создаться большой exel файл (перебор строк из БД в цикле, см. 1 пост).
В то же время, если запустить другой скрипт, создающий маленький-тестовый Exel файл, то все создастся без проблем.
И все будет корректно.

Впринципе понимаю, что PHPExcel не хватило памяти. Вопрос - что делать?
Капитан очевидность подсказывает увеличить объем памяти, доступной PHP скрипту.
Сейчас у меня в php.ini memory_limit = 128M. На сервере около 2ГБ оперативной памяти.

Ошибка в логах выше возникла при создании exel файла из "информации" (назовем это так) объемом 4 Мб.
В таблицу был загружен текстовый файл (парсинг), размером 4 Мб.
У меня есть объем "информации" 20 Мб. И соответственно таблица побольше.

Вопрос такой - на сколько нужно увеличить объем памяти и как это лучше сделать - через php.ini или .htaccess?
0
Jodah
Эксперт PHP
2850 / 2481 / 1057
Регистрация: 01.08.2012
Сообщений: 8,772
15.02.2016, 09:05 4
Цитата Сообщение от useruser Посмотреть сообщение
В таблицу был загружен текстовый файл (парсинг), размером 4 Мб.
У меня есть объем "информации" 20 Мб. И соответственно таблица побольше.
PHPExcel - тяжеловесная штука, её потребности нельзя измерить весом одних только обрабатываемых данных.

Цитата Сообщение от useruser Посмотреть сообщение
Вопрос такой - на сколько нужно увеличить объем памяти
А нам откуда знать? Тестируйте, постепенно увеличивая макс. память, пока весь скрипт не отработает без ошибок.

Цитата Сообщение от useruser Посмотреть сообщение
как это лучше сделать - через php.ini или .htaccess?
Без разницы.

Я обычно в самом скрипте указываю (функция ini_set), чтобы выдавать много памяти только определённым функциям.
1
useruser
63 / 63 / 30
Регистрация: 29.06.2015
Сообщений: 675
15.02.2016, 10:27  [ТС] 5
Цитата Сообщение от Jodah Посмотреть сообщение
Я обычно в самом скрипте указываю (функция ini_set), чтобы выдавать много памяти только определённым функциям.
Сделал так же
PHP
1
ini_set("memory_limit", "512M");
Создались все файлы, кроме одного - самого большого (в этой таблице 100 тыс. строк).
Оптимизировать код, впринципе сложно. Там простой цикл - выборка из базы.
Давать ещё больше памяти?

Openserver c командой ini_set("memory_limit", "512M"); говорит

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 1032 bytes) in C:\OpenServer\domains\site.ru\addons\PHPExcel\PHPExcel\Cell.php on line 1228
0
Jodah
Эксперт PHP
2850 / 2481 / 1057
Регистрация: 01.08.2012
Сообщений: 8,772
15.02.2016, 11:15 6
useruser, ну 100 тысяч - это внушительные размеры..., поэтому да, 512 может не хватить.
А этот файл для каких целей генерируется? Для скачивания пользователями?
0
useruser
63 / 63 / 30
Регистрация: 29.06.2015
Сообщений: 675
15.02.2016, 11:44  [ТС] 7
Цитата Сообщение от Jodah Посмотреть сообщение
А этот файл для каких целей генерируется? Для скачивания пользователями?
Да. В базе MySQl есть таблица. Из этой базы/таблицы создается 2 файла.
Первый xml - обычный текстовик. Создается быстро.
Второй Excel 2007 xlsx. Вот он долго.

Пользователям надо именно Excel 2007 xlsx. Нет, конвертировать xml в Excel 2007 xlsx религия не позволяет.
(Там свои заморочки с софтом)

Выдал скрипту 1гиг памяти.
0
Jodah
Эксперт PHP
2850 / 2481 / 1057
Регистрация: 01.08.2012
Сообщений: 8,772
15.02.2016, 11:55 8
useruser, можно ещё вывести обычную HTML-таблицу и отправить в заголовке, что это xls. Решение кривое, но часто используемое, ресурсов кушать будет меньше.
0
useruser
63 / 63 / 30
Регистрация: 29.06.2015
Сообщений: 675
15.02.2016, 12:02  [ТС] 9
Цитата Сообщение от Jodah Посмотреть сообщение
useruser, можно ещё вывести обычную HTML-таблицу и отправить в заголовке, что это xls. Решение кривое, но часто используемое, ресурсов кушать будет меньше.
Тут выяснилось....что у меня апач скушал 700 мб памяти и не отдает её назад.
С каждым запуском скрипта ест по 1-2 мб памяти и не освобождает.
Создам отдельную тему.
0
15.02.2016, 12:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2016, 12:02

PHPExcel функционал!?
Добрый день, начал работать с PHPEXCEL и скажем есть задача еженедельно парсить...

Как исправить кодировку в PHPExcel?
Здравствуйте, подскажите пожалуйста. Есть строка, которая несёт в себе имя...

PHPExcel как сформировать файл
$xls = new PHPExcel(); $xls-&gt;setActiveSheetIndex(0); $sheet =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru