加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP垃圾收集器统计信息

发布时间:2020-12-13 16:43:34 所属栏目:PHP教程 来源:网络整理
导读:我正在做一些 PHP内存基准测试,我想获得垃圾收集器静态. 我在官方文档:http://www.php.net/manual/en/features.gc.performance-considerations.php中遵循了本教程 我通过使用此CFLAGS环境变量重新编译PHP,重现了所描述的确切过程: export CFLAGS=-DGC_BENC
我正在做一些 PHP内存基准测试,我想获得垃圾收集器静态.

我在官方文档:http://www.php.net/manual/en/features.gc.performance-considerations.php中遵循了本教程

我通过使用此CFLAGS环境变量重新编译PHP,重现了所描述的确切过程:

export CFLAGS=-DGC_BENCH=1
./config.nice
make clean
make
make install

我在Debian Squeeze 6.0.4 64bits上使用PHP 5.3.9:http://fr.php.net/get/php-5.3.9.tar.bz2/from/a/mirror完成了这项工作.

然后我尝试在命令行中执行他们提供php gc.php的示例脚本:

<?php
class Foo
{
    public $var = '3.1415962654';
}

for ( $i = 0; $i <= 1000000; $i++ )
{
    $a = new Foo;
    $a->self = $a;
}

echo memory_get_peak_usage(),"n";
?>

正如他们所说,这应该显示在脚本的末尾,附加的gc统计数据,例如:

GC Statistics
-------------
Runs:               110
Collected:          2072204
Root buffer length: 0
Root buffer peak:   10000

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL   7175487   1491291    1241690   3611871
ZOBJ  28506264   1527980     677581   1025731

事实是,不显示此gc统计信息.
看起来用这个CFLAGS编译PHP并没有做任何事情.

我错过了什么吗?

解决方法

我在这里预感,因为我没有证实这一点,但是,通过阅读你提供的GC链接上的文字,我不会觉得memory_get_peak_usage()应该返回基于使用DGC_BENCH编译PHP的附加信息旗.手册说它返回一个int,所以我怀疑它总是返回一个int.

然而它说的是:

When you run the above example code again with the newly built PHP
binary,you will see the following being shown after PHP has finished
execution:

这不是很清楚,但我的印象是,额外的GC细节将打印到stdout或stderr而不是返回到memory_get_peak_usage()或作为额外输出打印到PHP脚本.

尝试从命令行调用新构建的PHP可执行文件,并在脚本完成时查看是否将GC信息打印到控制台.

您可以尝试调用它:/ path / to / custom / php testfile.php

如果您将PHP作为Apache模块或FastCGI处理程序运行,我不确定输出此信息是否有意义所以我怀疑您可能只能通过从控制台调用脚本来查看它,但我可能完全错了.

更新:

我已经检查过以确保GC_BENCH编译标志仍处于活动状态,它是.

Zend公司/ zend.c

905 #if GC_BENCH
906     fprintf(stderr,"GC Statisticsn");
907     fprintf(stderr,"-------------n");
908     fprintf(stderr,"Runs:               %dn",GC_G(gc_runs));
909     fprintf(stderr,"Collected:          %dn",GC_G(collected));
910     fprintf(stderr,"Root buffer length: %dn",GC_G(root_buf_length));
911     fprintf(stderr,"Root buffer peak:   %dnn",GC_G(root_buf_peak));
912     fprintf(stderr,"      Possible            Remove from  Markedn");
913     fprintf(stderr,"        Root    Buffered     buffer     greyn");
914     fprintf(stderr,"      --------  --------  -----------  ------n");
915     fprintf(stderr,"ZVAL  %8d  %8d  %9d  %8dn",GC_G(zval_possible_root),GC_G(zval_buffered),GC_G(zval_remove_from_buffer),GC_G(zval_marked_grey));
916     fprintf(stderr,"ZOBJ  %8d  %8d  %9d  %8dn",GC_G(zobj_possible_root),GC_G(zobj_buffered),GC_G(zobj_remove_from_buffer),GC_G(zobj_marked_grey));
917 #endif

接下来,我为Apache2和CLI编译了PHP 5.3.9.在决定安装测试版之前,我从控制台运行了新的PHP CLI应用程序:

./sapi/cli/php -v

PHP 5.3.9 (cli) (built: Feb 22 2012 19:03:02) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0,Copyright (c) 1998-2012 Zend Technologies
GC Statistics
-------------
Runs:               0
Collected:          0
Root buffer length: 0
Root buffer peak:   7

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL        15         7          7         0
ZOBJ         0         0          0         0

即使我没有调用PHP,它也有GC输出.接下来我grep了libphp5.so,看到它已经编译了GC Statistics位,所以我决定安装它并从Apache拨打电话.浏览器,error_log,access_log或任何其他日志文件中没有GC输出.

现在有趣的部分,我创建了一个test.php文件,它输出一个字符串并创建一个释放一些变量……

root@vm:/php539# php test.php
This is a test

root@vm:/php539# php < test.php
This is a test
GC Statistics
-------------
Runs:               0
Collected:          0
Root buffer length: 0
Root buffer peak:   7

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL        16         7          7         0
ZOBJ         0         0          0         0

root@vm:php539#

结论:

使用GC_BENCH选项编译PHP时,从浏览器调用时,或使用-f选项解析PHP文件或传递要解析的文件名时,将无法访问基准信息.如果您以交互模式调用php,或者通过从stdin读取它来通过PHP执行脚本,您将获得基准信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读