Проблемы с памятью PHP с исключениями, поддерживающими __setPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Проблемы с памятью PHP с исключениями, поддерживающими __set

Сообщение Anonymous »

Существует специальный класс исключений (для этой публикации я сократил его до минимума): нигде не используется; в исходной версии оно просто выдает \Exception и было введено для предотвращения случайной записи в $e->nonexistingproperty, которое уже устарело и, надеюсь, скоро будет запрещено в любом случае.
И есть фрагмент кода (который встроен в гораздо большую часть программного обеспечения):

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

try {
var_dump(memory_get_usage());
echo "
";
$e = new MyException();
var_dump(memory_get_usage());
echo "
";
throw $e;
}
catch (\Throwable) {
var_dump(memory_get_usage());
echo "
";
var_dump(get_class($e));
echo "
";
unset($e);
var_dump(memory_get_usage());
}
Запустив его, я получаю следующий результат (фрагмент начинается со строки 407 в реальном файле):

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

contextlevel.php:408: int(3207080)
contextlevel.php:411: int(3216336)
contextlevel.php:416: int(3473200)
contextlevel.php:418: string(11) "MyException"
contextlevel.php:421: int(3463904)
Выброс (а не создание!) исключения требует много памяти.
Если я удалю (нерелевантное) __set выдача исключения по-прежнему требует много памяти, но теперь она освобождается с помощью unset($e). Почему? (Посмотрите на общее изменение объема памяти — всего лишь за счет удаления неиспользуемого метода защиты!)

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

contextlevel.php:408: int(2042552)
contextlevel.php:411: int(2051776)
contextlevel.php:416: int(2309016)
contextlevel.php:418: string(11) "MyException"
contextlevel.php:421: int(2057712)
Мне не удалось воспроизвести этот эффект на минимальном рабочем примере, потому что тогда числа (дрожания) были слишком низкими. Тем не менее, это на 100% воспроизводимо в моем реальном программном обеспечении.
Я могу и, конечно, откажусь от __set(), и, таким образом, проблема, которую я не смог правильно описать вчера, должна решить. Но все же мне было бы интересно, почему это происходит. Есть какие-нибудь идеи?
Обновление: после долгих экспериментов виновником, похоже, является xdebug, даже если он запускается только с активным режимом develop ; если модуль отключен, накладные расходы памяти исчезают немедленно, в противном случае они кажутся константой (по крайней мере, для данного класса), которая добавляется при каждом вызове.

Подробнее здесь: https://stackoverflow.com/questions/786 ... orting-set
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»