1

我们有一个复杂的 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如果\ThrowabledoStuffWithTransaction(). _ 但是,$transaction在调用此函数之前 has refcount=2 和 3 当捕获\Throwable导致回滚不会自动回滚时。

如何确定哪个代码获得了对 $transaction 的引用?

4

0 回答 0