При запросе к БД Fatal error: Allowed memory size of 268435456 bytes exhausted

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
a.k.
Сообщения: 56
Зарегистрирован: 2014.11.29, 10:39

При запросе к БД Fatal error: Allowed memory size of 268435456 bytes exhausted

Сообщение a.k. » 2019.04.25, 03:18

Доброго дня.
Суть - есть небольшой парсер на yii2 basic.
Не понимаю, где проблема - консольный скрипт падает, жалуясь на отжор памяти:
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes) in /home/***vendor/yiisoft/yii2/db/Command.php on line 1290
PHP Fatal Error 'yii\base\ErrorException' with message 'Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes)'

in /home/***/vendor/yiisoft/yii2/db/Command.php:1290

Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleFatalError()
#1 {main}
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 32768 bytes) in /home/***/vendor/yiisoft/yii2/helpers/BaseFileHelper.php on line 385


Подскажите, пожалуйста, где может быть проблема.

Таблица выглядит так (основные поля):
  • id - ID записи. PK
  • exchange_pair_id - валютная пара. Индекс.
  • volume - объем.
  • timestamp - timestamp, индекс.
Запрос:

Код: Выделить всё

$rows = (new \yii\db\Query())
            ->select(['timestamp'])
            ->from('transaction')
            ->where(['exchange_pair_id'=>1])
            ->orderBy(['timestamp' => SORT_DESC])
            ->one();
Этот запрос роняет сервер. Записей в базе порядка 2М (последний ID: 2 186 125), все было нормально, но сейчас работать никак не хочет.
PhpMyAdmin выполняет запрос за 0.01 секунды:

Код: Выделить всё

SELECT * FROM transaction WHERE exchange_pair_id = 1 ORDER BY timestamp LIMIT 1
Не понимаю куда Yii2 съедает столько памяти и дохнет :shock:
PS сначала искал по AR

Код: Выделить всё

public static function getLastTransaction($exchangePairId) {
        return self::find()->where(['exchange_pair_id'=>$exchangePairId])->orderBy(['timestamp'=>SORT_DESC])->one();
    }
Начал скрипт дохнуть, переписал на Query Builder - все снова заработало, и вот опять всё печально.

Хостинг timeweb, версия yii 2.0.16.1

kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: При запросе к БД Fatal error: Allowed memory size of 268435456 bytes exhausted

Сообщение kawabanga » 2019.04.25, 05:48

Это все Yii плохой виноват. Используйте Symphony!

С чего вы решили что проблема в этом запросе?

Аватара пользователя
SiZE
Сообщения: 2691
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: При запросе к БД Fatal error: Allowed memory size of 268435456 bytes exhausted

Сообщение SiZE » 2019.04.25, 08:46

Это просто невнимательность при чтении документации, но все на этом попадаются.

one() выбирает первую запись из результата. Простыми словами: вы выбираете 2М записей и возвращаете только первую.

Решение очень простое, поэтому можно вернуться обратно на AR добавив ->limit(1)
в поиске работы

someweb
Сообщения: 535
Зарегистрирован: 2017.03.09, 10:12

Re: При запросе к БД Fatal error: Allowed memory size of 268435456 bytes exhausted

Сообщение someweb » 2019.04.25, 08:46

У вас не равнозначные запросы с phpmyadmin - one() не добавлят limit(), попробуйте так:

Код: Выделить всё

$rows = (new \yii\db\Query())
            ->select(['timestamp'])
            ->from('transaction')
            ->where(['exchange_pair_id'=>1])
            ->orderBy(['timestamp' => SORT_DESC])
            ->limit(1)
            ->one();
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

a.k.
Сообщения: 56
Зарегистрирован: 2014.11.29, 10:39

Re: При запросе к БД Fatal error: Allowed memory size of 268435456 bytes exhausted

Сообщение a.k. » 2019.04.25, 09:39

@someweb @SiZE спасибо за тычок носом в документацию, всё снова работает как часы.

Ответить