PHP XDEBUG 扩展 | 文档

Xdebug 内置的垃圾回收统计分析器可以让你找出什么时候触发了 PHP 内部的垃圾回收器,有多少变量被清理,花了多长时间,以及实际释放了多少内存。


说明

Xdebug 2.6 中的新功能

PHP 中的垃圾回收(GC)对内存和性能有严重的影响,所以明白其何时触发和每次运行的效率如何,可以优化你的程序。PHP 引擎不能提供有关垃圾回收的收集统计机制,但是现在 Xdebug 可以。

机器可读的这类报告

目前,垃圾回收统计仅以人类可读的表格格式收集,因为没有工具可以生成机器可读的输出报告。未来的版本可能包括其他格式的报告以允许机器处理。

使用

这里有两种方法以两种不同的案例开启回收 GC 统计信息。第一种完全是通过 INI 设置,主要用例是收集单独的 CLI 脚本运行的统计信息(GC 通常是个问题)。

php -dxdebug.gc_stats_enable=1 your_script.php

如果你希望为你执行的每个脚本回收垃圾回收统计信息,你可以在系统上或者目录级别设置 xdebug.gc_stats_enable INI 设置。请注意,即使垃圾回收器没有运行,全局激活回收会为每个可执行脚本生成输出文件。

第二种开启回收的方法是直接在 PHP 脚本中调用函数 xdebug_start_gcstats()。这使你可以更好地控制何时开启统计回收。

通过 INI 设置和基于函数式的调用 xdebug_stop_gcstats() 的方法都可以停止回收。

表格文字(人类可读)

默认的(且是目前仅支持的)垃圾回收统计信息输出格式是一个人类可读的表格文字输出。

Garbage Collection Report
version: 1
creator: xdebug 2.6.0 (PHP 7.2.0)

Collected | Efficiency% | Duration | Memory Before | Memory After | Reduction% | Function
----------+-------------+----------+---------------+--------------+------------+---------
    10000 |    100.00 % |  0.00 ms |       5539880 |       579880 |    79.53 % | bar
    10000 |    100.00 % |  0.00 ms |       5540040 |       580040 |    79.53 % | Garbage::produce
     4001 |     40.01 % |  0.00 ms |       2563048 |       578968 |    77.41 % | gc_collect_cycles

头部包含报告的版本和生成它的 Xdebug 的版本。

这个表格本身包含每个垃圾回收运行的一行数据,每行有 7 个报告的变量:

  • Collected — 在运行期间被垃圾收集的所谓的 “根”的数量。一个“根”是一个 PHP 对象(实例)或者垃圾收集器正在观察的数组,用于潜在清理。
  • Efficiency% — 是被清理的跟数量除以 10000 - 当一个不可思议的“根”数量达到时会触发 PHP 内部的垃圾回收器自动运行。
  • Duration — 表示垃圾回收运行所花费的以毫秒表示的持续时间。
  • Memory Before — 包含在 GC 运行激活前由 memory_get_usage() 测量的内存。
  • Memory After — 包含在 GC 运行完成后由 memory_get_usage() 测量的内存。
  • Reduction% — 由于 GC 运行内存减少量的百分比。
  • Function — GC 运行被触发的函数或方法名称。如果这里是 gc_collect_cycles() 那么表示这个垃圾回收器是被显示触发的。其他所有的值表示 GC 运行是被隐式触发的,由于 10000 个“根”达到了 PHP 引擎的度量标准。

关于 PHP 垃圾回收如何运行的细节请查看 PHP 手册的垃圾回收章节


相关设置


xdebug.gc_stats_enable
类型: bool,默认值: false,由 Xdebug >= 2.6 引入

如果这个设置启用,垃圾回收运行的统计信息会自动收集到 xdebug.gc_stats_output_dir 设置给出的目录,以及有一个由 xdebug.gc_stats_output_name 配置的自动生成的名称。


xdebug.gc_stats_output_dir
类型:字符串,默认值:/tmp
垃圾回收统计信息输出被写入的目录,需要确保运行 PHP 的用户有这个目录的写入权限。这个设置不能在脚本中用 ini_set() 设置。

xdebug.gc_stats_output_name
类型:字符串,默认值: gcstats.%p

这个设置决定了被用来转储垃圾回收统计信息的文件名称。这个设置由指定标识符指定格式,与 sprintf() 和 strftime() 非常相似。这里有几个格式标识符可以用来格式化文件名。

查看 xdebug.trace_output_name 支持的标识符的文档。


相关函数


int xdebug_get_gc_run_count()
返回目前为止垃圾回收运行被触发的数量。
由 2.6 版本引入

这个函数返回当前运行脚本被触发的垃圾回收的次数。

即使 xdebug.gc_stats_enable INI 设置设为 false,这个数也可以用。


int xdebug_get_gc_total_collected_roots()
返回目前为止被收集的可变的根的数量。
由 2.6 版本引入

这个函数返回,在当前脚本中的所有垃圾回收器运行期间收集的,垃圾回收可变根的数量。

即使 xdebug.gc_stats_enable INI 设置为 false,这个数也可用。


string xdebug_get_gcstats_filename()
返回垃圾回收统计信息文件名
由 2.6 版本引入

返回被用来保存垃圾回收统计信息的文件名。


string xdebug_start_gcstats( [ string $gcstats_file ] )
开启垃圾回收统计信息的收集
由 2.6 版本引入

从这个点尝试开始垃圾回收跟踪到 gcstats_file 参数放入文件。如果函数名没有给出,那么垃圾回收统计文件将会被放置在由 xdebug.gc_stats_output_dir 配置设置的目录中。

如果给出一个文件名作为第一个参数,则名称是相对于当前工作目录的。当前工作目录可能和你所预期的不同,所以如果你指定文件名的话请使用绝对路径。使用 PHP 函数 getcwd() 能确定当前工作目录是什么。

如果 xdebug.gc_stats_enable 开启,那么文件名依赖于 xdebug.gc_stats_output_name 设置。

这个函数会返回 Xdebug 收集的统计信息的全路径和文件名。这将是你传入的文件名,或者没有传入文件名时自动生成的文件名。


string xdebug_stop_gcstats()
停止当前的垃圾回收统计信息的收集
由 2.6 版本引入

停止垃圾回收统计信息的收集并且关闭输出文件。

这个函数返回统计信息被写入的文件的文件名。