关于PHP加速器APC的使用

PHP加速器APC除了缓存字节码,还有一个很重要的应用就是 apc_store, 通常会将配置信息使用apc 缓存起来,更多时候是我们发现配置信息的数组太大了,才考虑将整个数组使用apc缓存起来。

下面我们明确一点基本的知识: apc缓存PHP的数组是序列化之后存储的,

下面我们做一个测试:
测试代码:

 
  1. <?php
  2. test_exec_code();
  3. test_unserialize();
  4. test_apc_fetch_arr();
  5. test_apc_fetch_str();
  6. test_apc_fetch_str_then_unserialize();
  7. function test_exec_code() {
  8.         $s = microtime(1);
  9.         while($i++<1000) {
  10.                 $arr = getData();
  11.         }
  12.         echo "exec time:", microtime(1) – $s , "s\n";
  13. }
  14. function test_unserialize() {
  15.         $arr = getData();
  16.         $str = serialize($arr);
  17.         $s = microtime(1);
  18.         $i = 0;
  19.         while($i++<1000) {
  20.                 $arr = unserialize($str);
  21.         }
  22.         echo "unserialize time:", microtime(1) – $s , "s\n";
  23. }
  24. function test_apc_fetch_arr() {
  25.         $arr = getData();
  26.         apc_store("arr"$arr);
  27.         $s = microtime(1);
  28.         $i = 0;
  29.         while($i++<1000) {
  30.                 $arr = apc_fetch("arr");
  31.         }
  32.         echo "apc_fetch_arr time:", microtime(1) – $s , "s\n";
  33. }
  34. function test_apc_fetch_str() {
  35.         $arr = getData();
  36.         $str = serialize($arr);
  37.         apc_store("str"$str);
  38.         $s = microtime(1);
  39.         $i = 0;
  40.         while($i++<1000) {
  41.                 $str = apc_fetch("str");
  42.         }
  43.         echo "apc_fetch_str time:", microtime(1) – $s , "s\n";
  44. }
  45. function test_apc_fetch_str_then_unserialize() {
  46.         $arr = getData();
  47.         $str = serialize($arr);
  48.         apc_store("str"$str);
  49.         $s = microtime(1);
  50.         $i = 0;
  51.         while($i++<1000) {
  52.                 $str = apc_fetch("str");
  53.                 $arr = unserialize($str);
  54.         }
  55.         echo "apc_fetch_str_then_unserialize time:", microtime(1) – $s , "s\n";
  56. }
  57. function getData() {
  58.         $arr = array(
  59.             ‘220.181.7.41’,
  60.             ‘113.5.32.130’,
  61.             //…  共 9000 个IP
  62.         );
  63.         return $arr;
  64. }

测试结果:
$ php test.php
exec time:5.3702118396759s
unserialize time:7.4545278549194s
apc_fetch_arr time:50.132069826126s
apc_fetch_str time:0.18340110778809s
apc_fetch_str_then_unserialize time:7.9918370246887s

分析:
1. 不做缓存,每次都执行字节码的效率是最高的,大约每次执行需要 5ms 的时间
2. PHP 反序列话的速度也赶不上执行字节码的速度(至少在这种情况下是这样的)
3. 使用apc缓存数组的效率是相当低的, 每次约 50ms,不如不缓存
4. 使用apc缓存字符串的速度还是不错的,这里的数据量约为260KB,fetch一次的时间约0.18ms
5. 如果说apc的序列化和反序列化使用的是php标准的序列化和反序列化函数,则: apc_fetch_arr 的时间应该基本和 apc_fetch_str_then_unserialize time 的时间一样,但是,这里差别太大了,有些不太理解; 如此看来,如果真要使用apc,则最好先显式地序列化然后在存储,fetch后在显式地反序列化一下

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据