1) 使用APC模块(缓存opcodes)
安装APC模块
tar -zxvf APC-3.0.19.tar.gz
cd APC-3.0.19
/opt/php/bin/phpize
./configure
make
make install
APC模块配置参数:
apc.enabled=1
apc.shm_segmemnts = 1
apc.shm_size = 64
APC把数据缓存到内存里面,我们就有必要对内存资源进行限定,通过这二个配置可以限定APC可以使用的内存空间大小。
apc.shm_segments指定了使用共享内存块数,而apc.shm_size则指定了一块共享内存空间大小,单位是M。所以,允许APC使用的内存大小应该是 apc.shm_segments * apc.shm_size = 64M。
apc.num_files_hint = 1000
apc.user_entries_hint = 4096
这二配置指定apc可以有多少个缓存条目。apc.num_files_hint说明你估计可能会有多少个文件相应的opcodes需要被缓成,即大约可以有多少个apc_compiler_cache条目。另外apc.user_entries_hint则说明你估计可能会有多少个apc_userdata_cache条目需要被缓存。如果项目中不使用apc_store()缓存用户数据的话,该值可以设定得更小。也就是说apc.num_files_hint与apc.user_entries_hint之和决定了APC允许最大缓存对象条目的数量。准确地设置这二个值可以得到最佳查询性能.
apc.stat =1
apc.stat_ctime
这二个参数,只跟apc_compiler_cache缓存相关,并不影响apc_user_cache。apc_complier_cache,它缓存的对象是php源文件一一对应的opcodes(目标文件)。PHP源文件存放在磁盘设备上,与之相对应的Opcodes目标文件位置内存空间(共享内存),那么当php源文件被修改以后,怎么通知更新内存空间的opcodes呢?每次接收到请求后,APC都会去检查打开的php源文件的最后修改时间,如果文件的最后修改时间与相应的内存空间缓存对象记录的最后修改时间不一致的话,APC则会认为存放在内存空间的Opcode目标文件(缓存对象)已经过期了,acp会将缓存对象清除并且保存新解析得到的Opcode。我们关心的是,即便没有更新任何php源文件,每次接受到http请求后,APC都会请求系统内核调用stat()来获取php源文件最后修改时。我们可以通过将apc.stat设置为0,要求APC不去检查Opcodes相对应的php源文件是否更新了。这样可以获得最佳的性能,我们也推荐这么做。不过,这样做有一点不好的就是,一旦有PHP源文件更新了之后,需要重启httpd守护进程或者调用apc_cache_clear()函数清空APC缓存来保证php源文件与缓存在内存空间的Opcodes相一致。
apc.ttl =0
apc.user_ttl =0
apc.ttl作用于apc_compiler_cache。当apc.ttl大于0时,每次请求都会对比这次的请求时间与上一次请求时间之差是不是大于apc.ttl,如果大于apc.ttl,则会被认缓存条目过期了,会被清理。
推荐如果项目较为稳定,并且apc.stat设置为0。同时apc.shm_size、apc.num_files_hint设置合理的话,apc.ttl建议设置为0。即apc_compiler_cache永不回收,直到重启httpd守护进程或者调用函数apc_cache_clear()清缓存。至于apc.user_ttl,建议设置为0,由开发人员调用apc_store()函数的时候,设置$ttl来指定该缓存对象的生命周期。
apc.max_file_size = 1M
apc.filters = NULL
apc.cache_by_default=1
这三个配置放在一起,是因为他们都用于限制缓存。其中apc.max_file_size表示如果php源文件超过了1M,则与之对应的opcodes不被缓存。而apc.filters指定一个文件过滤列表,以逗号(,)隔开。当apc.cache_by_default等于1时,与apc.filters列表中指定的文件名相匹配的文件不会被缓存。相反,apc.cache_by_default等于0时,仅缓存与acp.filters列表中指定的文件相匹配的文件。
2)使用xhprof模块(性能分析工具)
xhprof安装:
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cp -r xhprof_html xhprof_lib /www/www.hx.com/xhprof/
cd extension/
/opt/php/bin/phpize
./configure –with-php-config=/opt/php/bin/php-config
make
make install
在php.ini中添加:
extension=xhprof.so
xhprof.output_dir=/opt/xhprof
xhprof的调用,在index.php中添加如下代码:
if ($config->php->xhprof && mt_rand(1, 10000) == 1) {
xhprof_enable();
$xhprof_on = true;
}
if(config->php->xhprof &&xhprof_on){
$xhprof_data = xhprof_disable();
$xhprof_root = '/opt/xhprof'
include_once $xhprof_root."xhprof_lib/utils/xhprof_lib.php";
include_once $xhprof_root."xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
runid=xhprof_runs->save_run($xhprof_data, "hx");
echo '<a href="http://www.test.com/xhprof_html/index.php?run='.$run_id.'&source=hx" target="_blank">统计信息</a>';
}
运行程序,底部出现统计信息字样,点过去就可以看到性能分析了。按运行时间排序,很容易找出化时间最长的函数。
Function Name
Calls
Calls%
Incl. Wall Time
(microsec)
IWall%
Excl. Wall Time
(microsec)
EWall%
mysql_query
165
0.6%
93,442
47.1%
93,442
47.1%
Memcache::get
32
0.1%
10,417
5.2%
10,417
5.2%
ezSQL_mysql::query
165
0.6%
117,153
59.0%
8,816
4.4%
fgets
10
0.0%
6,275
3.2%
6,275
3.2%
mysql_fetch_field
631
2.2%
2,692
1.4%
2,692
1.4%
表格中一些参数的解释:
Function_Name : 函数名
Calls : 调用次数
Calls % : 调用百分比
Incl.Wall Time : 调用包含子函数所有花费时间 以微妙计算
Excl. Wall time : 函数执行本身所花费的时间, 不包括子函数执行时间.