Почему мой PHP-скрипт не обрабатывается на сервере, когда у меня есть другие?

Я использую обработку на стороне сервера DataTables для таблиц на моем веб-сайте отчетов. Я также использую 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, но я также тестирую другие, когда читал о них, и они кажутся, возможно, лучше. Я сделаю еще одно обновление или отвечу на вопрос, когда закончу тестирование.


person Mike    schedule 18.01.2017    source источник
comment
Увеличьте объем памяти, который разрешено использовать PHP.   -  person Peon    schedule 18.01.2017
comment
Возможный дубликат увеличения ограничения памяти значения php   -  person giorgio    schedule 18.01.2017
comment
Поэтому увеличьте доступную память PHP или посмотрите на уменьшение потребностей PHPExcel с кэшированием ячеек.   -  person Mark Baker    schedule 18.01.2017
comment
@MarkBaker, где я могу узнать об этом кэшировании ячеек?   -  person Mike    schedule 18.01.2017
comment
Если вы получаете ошибку с 11 записями, вероятно, внутри вашего кода есть логическая ошибка, вызывающая бесконечный цикл или чрезмерное потребление памяти. Вам нужно будет отладить код, чтобы понять это. Никто здесь не может помочь вам без дополнительной информации.   -  person teynon    schedule 18.01.2017
comment
документация по PHPExcel — хорошее место для начала   -  person Mark Baker    schedule 18.01.2017


Ответы (1)


Я нашел свою проблему. Я неправильно сохранял критерии сортировки и фильтрации из исходного запроса ajax, поэтому все данные из таблицы сервера возвращались вместо ограниченного набора результатов, который отображался на экране. Я пытался установить такой файл cookie setcookie("KeepPost",$PostKept,time() + (60*60*24*7));. Но обнаружил, что существует ограничение (4097 МБ) на то, что может храниться в файлах cookie браузера. Я превышал его, тот, который я тестировал, имел 7800mb +, поэтому я не смог установить 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);
}
?>

Теперь, когда я не пытаюсь вернуть более 150 тыс. строк, я могу создать файл Excel и загрузить его клиенту без проблем (это занимает всего около 30 секунд).

person Mike    schedule 25.01.2017