我们有一个复杂的 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
在调用此函数之前 has refcount=2 和 3 当捕获\Throwable
导致回滚不会自动回滚时。
如何确定哪个代码获得了对 $transaction 的引用?