mysqli использует гораздо больше памяти, чем mysql, исчерпывает memory_limit

Я пытаюсь обновить старое приложение, которое в настоящее время все еще использует функции mysql. К сожалению, с mysqli приложению не хватает памяти в тех случаях, когда mysql этого никогда не было (и, честно говоря, не должно). С mysql процесс достигает, может быть, 50 МБ, что предполагает, что он выделяет 8-15 МБ сверх размера незанятого набора. С mysqli он исчерпал лимит (128) и даже достиг 256 МБ без мигания (просто загружая индексную страницу). Что-то не так. Я получаю эту ошибку, когда переключаюсь на mysqli:

Фатальная ошибка: исчерпан разрешенный объем памяти 134217728 байт (попытался выделить 9072253 байта)

Количество байтов, которое «пытается выделить», меняется каждый раз, оно непостоянно. В приложении есть класс абстракции, поэтому я начал с того, что выпотрошил его и заменил вызовы экземпляром mysqli (ООП, а не процедурный). Переписывание всех запросов займет много времени и сейчас нецелесообразно с точки зрения ресурсов. У меня установлен mysqlnd. В настоящее время это PHP 5.6.30.

Код сильно изменился из-за устранения неполадок, но вот одно из воплощений метода query:

$result = $connection->query($sql);
$data = Array();
$i = 0;
while ($r = $result->fetch_assoc())
    $data[$i++] = $r;

$ret = new stdClass();
$ret ->row = isset($data[0]) ? $data[0] : Array();
$ret ->rows = $data;
$ret ->num_rows = $i;

$result->free();
unset($data);
return $ret ;

Я пробовал использовать MYSQLI_USE_RESULT и несколько различных способов итерации/сбора результатов запроса, таких как fetch_all, присваивание ссылок, без цикла while, но ничего из этого не помогло.

Моим следующим шагом, вероятно, будет вместо этого попробовать экземпляр PDO...


person Josh    schedule 20.03.2017    source источник
comment
В вопросе отсутствует важная информация: какой запрос вы выполняете и сколько строк/столбцов (типов/размеров) вы ожидаете взамен?   -  person ccKep    schedule 20.03.2017
comment
Если вы используете glob, я предлагаю проверить в php.net/manual/en/ mysqli.store-result.php. Я столкнулся с той же ошибкой при обновлении своего кода, и эта функция спасла день на больших наборах данных. Известно, что I использует больше вычислительных ресурсов, но также освобождает память.   -  person Louis Loudog Trottier    schedule 20.03.2017
comment
Вы уверены, что mysqli потребляет память? Похоже на утечку памяти php для меня   -  person Theo    schedule 20.03.2017
comment
Да, попробовать PDO было бы отличной идеей   -  person Your Common Sense    schedule 20.03.2017
comment
@YourCommonSense Это не дубликат, поскольку я не использую столбцы с длинным текстом, поэтому я упомянул размер выделения.   -  person Josh    schedule 20.03.2017
comment
@ccKep Этот код используется для выполнения всех запросов в приложении. Запросы идентичны между mysql и mysqli, поэтому я не ожидал такой огромной разницы в использовании памяти.   -  person Josh    schedule 20.03.2017
comment
@LouisLoudogTrottier Из того, что я читал, результат хранения - это значение по умолчанию, которое query использует. Я пробовал как store_result, так и use_result, и не было никакой разницы.   -  person Josh    schedule 20.03.2017
comment
Неважно есть у вас лонгблоб или нет, проблема одна и та же: неправильное распределение. вы уже думали о PDO, который во многих отношениях лучше, чем mysqli, так что у вас есть знак   -  person Your Common Sense    schedule 20.03.2017
comment
@Theo Тео, я не уверен, что это mysqli использует память, а не какую-то другую часть PHP, не знаю, как это проверить. Все, что я знаю, это то, что я заметил: при использовании mysqli он использует намного больше памяти, чем при использовании mysql...   -  person Josh    schedule 20.03.2017
comment
Может быть немного, но может быть php.net/manual/en/mysqli.stat.php может помочь вам увидеть, что происходит. Если у вас есть root-доступ к вашему хосту, вы также можете использовать php.net/manual/en/ mysqli.debug.php и php.net/manual/ en/mysqli.dump-debug-info.php (также зависит от вашей сборки [он же установка])   -  person Louis Loudog Trottier    schedule 20.03.2017
comment
Точно такая же проблема с PDO...   -  person Josh    schedule 24.03.2017