PHP垃圾收集器统计信息
我正在做一些
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统计信息. 我错过了什么吗? 解决方法
我在这里预感,因为我没有证实这一点,但是,通过阅读你提供的GC链接上的文字,我不会觉得memory_get_peak_usage()应该返回基于使用DGC_BENCH编译PHP的附加信息旗.手册说它返回一个int,所以我怀疑它总是返回一个int.
然而它说的是:
这不是很清楚,但我的印象是,额外的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执行脚本,您将获得基准信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |