学习PHP精粹,编写高效PHP代码之性能
一、采用基准测试,检测代码的性能
基准测试涉及Web应用程序时,通常指“压力测试”,即在你的代码中尽可能多地加载流量,然后衡量它的执行能力。
推荐两种基准测试的工具:ApacheBench(ab)和JMeter。
要进行压力测试,我们需要两个东西:同时在线的用户和大量的请求。使用这些工具后,很多同时运行的应用程序线程便代表了用户。因此我们只需记住:并发线程=并发用户。
1、ApacheBench超级简单,通常包含了Apache安装,或是作为Apache开发包的一部分——一个被称为简单ab的二进制文件。要使用ab,只需指定请求的总数(-n),以及并发线程的数量(-c),然后让它开始工作。
例如:我们在这里使用-n 1000 -c 20生成20个并发线程执行1000个请求。
$ ab -n 1000 -c 20 http://example.org/
ab使用参考:http://httpd.apache.org/docs/2.0/programs/ab.html
2、JMeter是另一个具备GUI的Apache项目,而且具备更多功能。若要使用JMeter,你需要创建一个测试计划,添加线程组、添加采样器、指定JMeter的配置、添加Cookie处理器这样的其他选项、增加监听器处理结果。
JMeter网站:http://jmeter.apache.org/
二、利用缓存提高代码性能
1、对于Apache服务器,利用apc实现代码缓存。
从PECL(PHP Extension Community Library,PHP扩展共享类库)中获取APC进行编译,然后安装该扩展。
$ pecl install apc
在这之后,根据设置,需要编辑php.ini文件并添加它:
extension = apc.so
重新启动Apache,然后就可以了。
apc使用参考:http://www.php.net/manual/en/book.apc.php
2、对于Windows/IIS服务器,利用微软的WinCache实现代码缓存。
WinCache网站:http://www.iis.net/downloads/microsoft/wincache-extension
3、利用memcached实现会话数据缓存,memcached是基于内存的、群集友好的键/值对存储。如果你启用memcached扩展,就可以自动使用memcached代替磁盘存储回话。
memcached网站:http://memcached.org/
memcached使用参考:http://www.php.net/manual/zh/book.memcached.php
安装memcached:
$ pecl install memcache # Install ext/memcache $ memcached -d -m 128 # Start memcached
设置php.ini:
session.save_handler = ‘memcache‘ session.save_path = ‘tcp://localhost:11211‘
三、进行程序概要分析,寻找问题在哪里?
程序概要分析(profiling)是采用精确的时间或内存检测代码运行每个动作的行为。通过分析,找到问题的位置,然后进行优化。
我们有两个常用的profiling工具:
1、由Derick Rethans编写的可靠的Xdebug工具,并由KCachegrind或QCachegrind审核结果。
Xdebug网站:http://xdebug.org/
KCachegrind网站:http://sourceforge.jp/projects/freshmeat_kcachegrind/releases/
QCachegrind网站:http://sourceforge.jp/projects/freshmeat_kcachegrind/releases/
2、新开发的XHProf工具,是来自Facebook的一个应用,由Paul Reinheimer编写XHGui Web前段部分。
XHProf网站:http://pecl.php.net/package/xhprof
XHGui网站:https://github.com/perftools/xhgui
总结:
首先我们要解决性能下降这个最大的难题,这样便可获得整体性能的更好提升。如果一个SQL查询花费10秒,而你将它的执行速度提高了50%,这样你为自己节省了5秒;然而,如果执行一个PHP函数花费5秒,你同样将它的执行速度提高了50%,你实际上却只节省了半秒钟。在某些时候,你将受到硬件性能的绝对限制,以我们的经验你更有可能受到磁盘或网络I/O的限制,而不是CPU或RAM的限制。这时你需要开始在多台计算机上缩放应用程序。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。