Какой-то глюк с памятью в логере/дебаге

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Maxxi
Сообщения: 29
Зарегистрирован: 2014.11.20, 22:39

Какой-то глюк с памятью в логере/дебаге

Сообщение Maxxi »

Обновил Yii 2.0.13.1 -> 2.0.43 и yii2-debug 2.0.9 -> 2.1.18 и сразу напоролся на непонятный баг.
На локальной машине (windows, php 7.4.16) скрипт отрабатывает нормально, а на сервере (centos, php 7.2.34) вываливается с ошибкой 500 и в логах сервера пишет про нехватку памяти.
Увеличение памяти для php проблему не решает.
Начал грешить на php, обновил до 7.3.32. Проблема осталась.
После некоторой локализации оказалось, что логер (включен) пытается сохранить какие-то огромные логи.
350Mb лога, который на локале занимает 250kb. Соответственно debug пытается сохранить такой же объем информации в свою папку (yii\log\FileTarget), но ему это не удается и файл не сохраняется.
При просмотре лога замечена такая особенность:

Строка

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

[info][yii\db\Command::execute] UPDATE `config` SET `updated_at`=1636110277, `config_value`='Array
прерывается на слове Array с незакрытой кавычкой. Затем следует много мегабайт пробелов (символы 0x20), а затем продолжение

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

5' WHERE `config_name`='quota'
Запрос UPDATE - это ActiveRecord->update()
Да, уже при локализации бага я заметил, что в свойство модели сохраняется array, другие свойства сериализуются перед сохранением. Но каким-то чудом это работает :) База MySql.
Есть идеи насчет такого поведения логера?
Maxxi
Сообщения: 29
Зарегистрирован: 2014.11.20, 22:39

Re: Какой-то глюк с памятью в логере/дебаге

Сообщение Maxxi »

В общем, дело было не в бобине..
Наткнулся я на эту фичу:
Внимание
Попытка записи в смещение за границами строки дополнит строку пробелами до этого смещения.
т.е. если обращаешься к переменной, думая, что там ассоциированный массив, а там оказывается строка, то получается такая засада.
упрощенный пример:

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

$data = 'abc';
$key = '10000';
$data[$key] = 1; // думаем, что здесь массив
echo strlen($data); // 10001
век живи - век учись.
Ответить