服务器性能优化(三):php调优

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  :  函数执行本身所花费的时间, 不包括子函数执行时间.


转载于:https://my.oschina.net/shyl/blog/523611

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值