У нас есть сложная PHP программа, которая пропускает один объект. Есть ли способ получить обратный вызов каждый раз, когда увеличивается число ссылок, чтобы я мог записывать трассировку стека всех местоположений, которые принимают ссылку? Программа использует модель программирования RAII, и эта утечка приводит к тому, что деструктор запускается гораздо позже, чем ожидалось (в худшем случае при выходе из процесса).
Код в основном равен
while (!$done)
{
# create database connection for each try (serializable transactions with fallback servers)
$connection = ...;
$transaction = $connection->newTransaction(...);
try
{
doStuffWithTransaction($transaction);
$transaction->commit();
$done = true;
...; # additional best-effort cleanup routines
}
catch (TransactionMustRetry $e)
{
$transaction->rollback();
}
catch (\Throwable $e)
{
...
}
$connection->disconnect();
}
и $transaction
должен автоматически откатываться, если \Throwable
выбрасывается какой-то вложенной подпрограммой в doStuffWithTransaction()
. Однако $transaction
имеет refcount = 2 перед вызовом этой функции и 3 при перехвате \Throwable
, что приводит к тому, что откат не выполняется автоматически.
Как определить, какой код получил ссылку на $ сделка?