首页 > 代码库 > 学习PHP精粹,编写高效PHP代码之性能

学习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的限制。这时你需要开始在多台计算机上缩放应用程序。