【问题标题】:Dump all variables in PHP转储 PHP 中的所有变量
【发布时间】:2014-09-07 16:57:14
【问题描述】:

我的脚本中存在内存泄漏,我在 2 天后找不到它。我找到了导致内存泄漏的循环;循环的每次迭代都会增加内存使用量。我将循环移动到一个函数中以隔离变量。在函数结束时,我取消了函数创建的每个变量的设置,以便 get_defined_vars() 返回一个空数组。这就是我的意思:

function the_loop(){
  $var="value";

  ... // processing, including using a library

  unset($var);
  print_r(get_defined_vars()); // prints empty array
}

while(true){
  the_loop();
  echo memory_get_usage()."\n"; // steadily increases until memory limit is reached
}

我猜the_loop() 中定义的一些变量仍在内存中。我尝试使用 XDebug 的跟踪工具,但没有帮助。它所显示的只是从长远来看,内存使用量平均会增加。我正在寻找一个可以显示 PHP 内存中所有值的工具。我将能够根据值识别变量。什么工具可以转储PHP的内存?

【问题讨论】:

  • unset 不会立即释放变量正在使用的内存,php 垃圾收集器会这样做
  • 您使用什么版本的 PHP? 5.3 之前的 PHP 没有循环收集机制。另请阅读:php.net/manual/en/features.gc.collecting-cycles.php
  • 我使用的是 5.5 版
  • @Dagon PHP 在函数结束时释放内存,因此the_loop()
  • @Linksku "PHP 在函数结束时释放内存" 你能找到该声明的来源吗?

标签: php memory memory-leaks xdebug


【解决方案1】:

正如 Dragon 所说,未设置不会立即释放内存。

What's better at freeing memory with PHP: unset() or $var = null

我会考虑重新评估您使用 PHP 的方式,它不是为长时间/持续运行的脚本而设计的,垃圾处理程序根本不是那么好。

如果您想进一步了解执行脚本,我建议您查看一些工具,例如:

https://github.com/jokkedk/webgrind

http://xhprof.io/

http://derickrethans.nl/xdebug-and-tracing-memory-usage.html

也值得一读:What gc_collect_cycles function is useful for?

【讨论】:

    【解决方案2】:

    调用 unset() 不会强制进行垃圾回收,因此当引用计数应该减少时,可能会有其他人引用它。在调用 unset 到 see how many references 之前使用 xdebug_debug_zval($var) 到它的实际值。

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多