Я использую DataTables Server Side для обработки таблиц на моем веб-сайте отчетов. Я также использую PHPExcel для экспорта отчетов в Excel. Мои php-скрипты для создания таблиц для просмотра в браузере работают нормально, но когда я пытаюсь заставить работать скрипт PHPExcel, я получаю ошибку нехватки памяти, такую как:
Я вижу, что это ошибка в том же месте, где была, и с той же ошибкой, что и при попытке обработать отчеты на стороне клиента. Вот почему я пытаюсь сделать это на сервере. Я искал вокруг, но я не видел ничего о такой ситуации.
Есть идеи, что я могу попробовать?
РЕДАКТИРОВАТЬ
Когда я поднимаю память до 512, я получаю ту же ошибку, но в другом месте:
РЕДАКТИРОВАТЬ 2
Это не повторение вопроса, упомянутого ниже. Я знаю, что мой сервер имеет необходимую память, он использует ее при представлении данных в браузер. Только когда я отправляю те же данные в файлы PHPExcel, у меня возникает эта проблема. Было упомянуто, чтобы попробовать что-то с кэшированием ячеек, но я не знаю, что это такое в отношении PHPExcel. Это первый раз, когда я пытался его использовать. Я даже попытался уменьшить количество отправляемых строк до 11 вместо 12 000+, и все равно получаю ошибку.
ОБНОВИТЬ
Я думаю, что я знаю кое-что, в чем проблема теперь после большого тестирования.
Первоначальный розыгрыш для заполнения экрана браузера — это только откат того, что необходимо для экрана, начинается с 25, до 150. Когда я пытаюсь экспортировать, он пытается вытащить все это. самый большой отчет, который у меня сейчас есть, это 65000+ строк и 35 столбцов, хотя у меня есть и более крупные. Я обновил ограничение памяти до ini_set('memory_limit', '-1');
так что он будет использовать все, что ему нужно, и он делает.
Теперь время истекает через 300 секунд (5 минут). Я пытался исправить это с ini_set('MAX_EXECUTION_TIME', 10);
, но это, похоже, ничего не делает (возможно, у меня неправильная настройка, я проведу дополнительные исследования).
Теперь мне нужно выяснить, какой метод кэширования из библиотеки PHPExcel будет наиболее эффективным. Я сейчас пользуюсь cache_in_memory_gzip
, но я также проверяю других, когда читаю о них, и они, возможно, кажутся лучше. Я сделаю еще одно обновление или отвечу на вопрос, когда закончу тестирование.
Я нашел свою проблему. Я неправильно сохранял критерии сортировки и фильтрации из исходного запроса ajax, поэтому возвращались все данные из таблицы сервера вместо ограниченного набора результатов, который отображался на экране. Я пытался установить печенье, как это setcookie("KeepPost",$PostKept,time() + (60*60*24*7));
, Но обнаружили, что существует ограничение (4097 МБ) на то, что может храниться в cookie-файлах браузера. Я превышал его, у того, что я тестировал, было 7800 Мб +, поэтому я не смог установить cookie. Это заставляло мои php-файлы использовать исходный запрос ajax, который извлекал все данные без каких-либо фильтров. Как только я понял это, я обновил свой код, чтобы отправить необходимую информацию на сервер, где предел намного выше. Тогда я просто вытягиваю его обратно, когда я готов к использованию, а все остальное работает нормально Вот что мой KeepPost.php Файл выглядит так:
<?php
if( isset($_POST['draw']))
{
include 'DBConn.php';
//echo "Here";
//print_r($_POST);
$KeepPost = $_POST;
$KeepPost['length'] = -1;
$PostKept = serialize($KeepPost);
$TSQL = "UPDATE PostKept set Value = '" .$PostKept. "'";
$sth = $conn->prepare($TSQL);
//print_r($sth);
$sth->execute();
}
function Convert_From_Array($array)
{
echo serialize($array);
}
?>
Теперь, когда я не пытаюсь вернуть 150k + строк, я могу создать файл Excel и загрузить его на клиент без проблем (это занимает около 30 секунд).
Других решений пока нет …