Страница 1 из 1

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

Добавлено: 2019.04.25, 03:18
a.k.
Доброго дня.
Суть - есть небольшой парсер на 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

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

Добавлено: 2019.04.25, 05:48
kawabanga
Это все Yii плохой виноват. Используйте Symphony!

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

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

Добавлено: 2019.04.25, 08:46
SiZE
Это просто невнимательность при чтении документации, но все на этом попадаются.

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

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

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

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

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

$rows = (new \yii\db\Query())
            ->select(['timestamp'])
            ->from('transaction')
            ->where(['exchange_pair_id'=>1])
            ->orderBy(['timestamp' => SORT_DESC])
            ->limit(1)
            ->one();

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

Добавлено: 2019.04.25, 09:39
a.k.
@someweb @SiZE спасибо за тычок носом в документацию, всё снова работает как часы.