php include文件太慢,php使用apc为include大文件数组提速

最近在重写某系统, 有个地方需要include一大数组文件,差不多有1.2M,PHP程序每次跑到这块代码都需要从硬盘读取内容,站点访问量达了势必会造成过量的IO. 考虑使用redis,memcache等KV存储,但是担心IO过大造成网络阻塞。那安装到本地呢,每台都需要安装岂不是太麻烦了.于是觉得尝试将数组存入本机内存中.eaccelerator与APC二选一,eaccelerator 0.6.5.1之后的版本不支持eaccelerator_put方法,索性直接使用apc,如何安装以及如何配置APC我就不详细讲解了. 例子很简单,废话太多,进入正题.

APC简介

APC全称Alternative PHP Cache是一个免费开源的php缓存插件,它的目标是提供一个自由,开放和强大的框架用于缓存和优化PHP中间代码.

APC配置、php.ini

[apc]

extension = php_apc.dll

apc.enabled = on

apc.cache_by_default = off  //一定要off,否则所有php都会被cache

apc.shm_segments = 2

apc.shm_size = 128M // 单位M或者G,网上很多没写,会报错

apc.ttl = 7200

apc.user_ttl = 7200

apc.num_files_hint = 1024

apc.write_lock = On

apc.gc_ttl=3600

apc.ttl=0

apc.max_file_size=2M //最大单个文件大小

1

2

3

4

5

6

7

8

9

10

11

12

13

[apc]

extension=php_apc.dll

apc.enabled=on

apc.cache_by_default=off //一定要off,否则所有php都会被cache

apc.shm_segments=2

apc.shm_size=128M// 单位M或者G,网上很多没写,会报错

apc.ttl=7200

apc.user_ttl=7200

apc.num_files_hint=1024

apc.write_lock=On

apc.gc_ttl=3600

apc.ttl=0

apc.max_file_size=2M//最大单个文件大小

APC VS include方法

大文件数组内容:

arrFile.php

$arr = array(

"aaaa"=>11,

"BBBBB"=>11,

....忽略几万个

"CCCCC"=>11

)

1

2

3

4

5

6

7

$arr=array(

"aaaa"=>11,

"BBBBB"=>11,

....忽略几万个

"CCCCC"=>11

)

include文件代码片段

include_once 'arrFile.php';

print_r($arr);

?>

1

2

3

4

include_once'arrFile.php';

print_r($arr);

?>

APC加速文件代码片段

$arr=apc_fetch('key'); # 读取apc缓存

$arr=unserialize($arr);

?>

1

2

3

4

$arr=apc_fetch('key');# 读取apc缓存

$arr=unserialize($arr);

?>

include与apc性能对比

全部代码如下

/**

* 站点:www.ttlsa.com

* 作者:凉白开

* QQ群:3951405

*/

# include array file

$ti1 = microtime ( true );

include_once 'arrFile.php';

$ti2 = microtime ( true );

$ti3=(($ti2 - $ti1) * 1000);

echo "加载文件数组耗时:".$ti3. 'ms
';

# apc save

$arrSeri=serialize($arr);   //将上面include的数组序列化

apc_add("key",$badSeri,300); //序列化后的文件保存到apc缓存中,键为key,过期时间300秒

# 写入一次即可,后续都直接在内存中获取.

# apc fetch

$ta1 = microtime ( true );

$a=apc_fetch('key'); // 从apc中取出内容

$arr=unserialize($a);

$ta2 = microtime ( true );

$ta3=(($ta2 - $ta1) * 1000);

echo "加载apc数组耗时:".$ta3 . 'ms
';

# result 对比结果

echo round(($ti3-$ta3)/$ta3*100,2) .'%'; // APC比include快百分之几

?>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/**

* 站点:www.ttlsa.com

* 作者:凉白开

* QQ群:3951405

*/

# include array file

$ti1=microtime(true);

include_once'arrFile.php';

$ti2=microtime(true);

$ti3=(($ti2-$ti1)*1000);

echo"加载文件数组耗时:".$ti3.'ms
';

# apc save

$arrSeri=serialize($arr);  //将上面include的数组序列化

apc_add("key",$badSeri,300);//序列化后的文件保存到apc缓存中,键为key,过期时间300秒

# 写入一次即可,后续都直接在内存中获取.

# apc fetch

$ta1=microtime(true);

$a=apc_fetch('key');// 从apc中取出内容

$arr=unserialize($a);

$ta2=microtime(true);

$ta3=(($ta2-$ta1)*1000);

echo"加载apc数组耗时:".$ta3.'ms
';

# result 对比结果

echoround(($ti3-$ta3)/$ta3*100,2).'%';// APC比include快百分之几

?>

测试截图如下:

d83671f842a13e5988aab1253e1262fc.png

apc与include速度比较

最后

代码很简单,简单的将apc当做memcached来使用,相比include时间要缩短2倍左右,最慢的情况下时间也缩短一倍. 下回测试redis存储大数组需要多少时间. 本文不是告诉大家非要使用apc、使用apc读写大数组不一定是最好的方法,但是这个方法或许大家的工作可以用上,这边抛出的仅仅是一个思路,望大家可以用上.

参考文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值