Я пытаюсь обновить старое приложение, которое в настоящее время все еще использует функции 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...
mysql
иmysqli
, поэтому я не ожидал такой огромной разницы в использовании памяти. - person Josh   schedule 20.03.2017query
использует. Я пробовал как store_result, так и use_result, и не было никакой разницы. - person Josh   schedule 20.03.2017mysqli
использует память, а не какую-то другую часть PHP, не знаю, как это проверить. Все, что я знаю, это то, что я заметил: при использованииmysqli
он использует намного больше памяти, чем при использованииmysql
... - person Josh   schedule 20.03.2017