关于改善xhprof使用情况的设想
自从去年将xhprof用在生产环境以来,对生产环境的程序调试,性能优化都带来很多便利。但是在使用过程中,还是有一些细节需要改善。
问题
自从去年将xhprof用在生产环境以来,对生产环境的程序调试,性能优化都带来很多便利。但是在使用过程中,还是有一些细节需要改善。
问题
xhprof是facebook开源出来的一个php性能测试工具,也可以称之为profile工具,这个词不知道怎么翻译才比较达意。跟之前一直使用的xdebug相比,有很多类似之处。以前对xdebug有一些记录还可以供参考,但是它的缺点是对性能影响太大,即便是开启了profiler_enable_trigger参数,用在生产环境中也是惨不忍睹,cpu立刻就飙到high。
而xhprof就显得很轻量,是否记录profile可以由程序控制,因此,用在生产环境中也就成为一种可能。在它的文档上可以看到这样一种用法:
最新的memcache pecl中,新增了一个memcache.php,这个php文件可以用来方便的查看memcache的状况,界面上与apc自带的apc.php风格一致。
如图:
应该算是最方便的监测memcache的办法了。
用apc_define_constants可以提升批量define的性能,但是每个请求,都免不了进行 读cache -> 批量define 这样一个过程,因此,这也算不上提升define性能的终极手段。
在翻看apc的手册时,无意中看到有这么一小段介绍:
For a better-performing solution, try the » hidef extension from PECL.
这里提到了一个叫hidef的扩展,看说明上的意思,应该是可以通过ini文件来批量定义常量。
php下的define()性能是很烂的,速度慢,尤其是当一个程序中有大量的常量需要定义,这个情况尤为明显。而apc这个扩展不仅仅提供了php的opcode缓存,同样也可以提供一些基本的cache功能,在apc 3.0.0版本之后,它甚至可以缓存常量。
一个用apc批量定义常量的例子
<?php
$constants = array(
在优化php代码执行效率过程中,有个好办法是利用xdebug生成profile文件,然后查看整个程序的瓶颈在哪里。现在xdebug profile的查看程序有好几个,在这里罗列一下.
Wincachegrind
Wincachegrind是windows下的profile查看程序,使用起来感觉还不错,profile文件太大的话偶尔会崩溃。
今天在高春辉的博客上看到这些:
我们知道,在php中使用require_once/include_once虽然方便,但是代价昂贵,据测试数据来看,require_once比require慢3-4倍,所以在php开发中,我们应该尽量使用require/include。
列一下俺常用的避免require/include的方法。
使用__autoload
php5可以使用__autoload来避免require,用的好的话,代码里头甚至看不到几个require,实在是安逸啊。测试结果表明,使用__autoload之后的new Foo; 比 require_once ‘foo.php’; new Foo; 大概要快3倍左右。
xdebug的2.0正式版已经发布了。这个工具用在php的代码调试,优化方面效果很不错。下面贴上俺使用过程中的几个小窍门。
xdebug生成profile文件,可以用KCachegrind来查看,但是这个工具只在linux下面可用,没有windows下的版本。这里推荐一个win下的免费工具——wincachegrind,也可以查看xdebug的profile文件,用来分析php代码运行情况足够用了(偶尔不太稳定)。
xdebug一般情况下只会对一个请求做profile记录,如果需要查看几个请求的运行情况合集,可以设置xdebug.ini的
对于一个访问量巨大的网站来说,使用awstats来分析其日志是一件很痛苦的事情,这往往需要耗费很多时间才能得到一个结果,偶尔还会让机器内存耗尽。在awstats的文档中,找到几个关于性能优化的建议,如下:
关掉DNSLookup(DNSLookup不能设置为1). 虽然这样你会丢失一些关于访问者的国家信息,但是我觉得这无关紧要,大部分网站的访问者集中在国内。这样能给awstats性能带来小小提升。
小心使用这三个参数: URLWithQuery, URLReferrerWithQuery ,URLWithAnchor (如果你不知道它们有什么作用最好设置为0)