Skip to main content

PHP之Apc缓存浅析

一、APC介绍

APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”,它为我们提供了缓存和优化PHP的中间代码的框架。

也就是优化Opcache,也就是PHP的字节码。

APC的缓存分两部分:系统缓存和用户数据缓存,

系统缓存:它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存3600s(一小时)。但是这样仍会浪费大量CPU时间,因此可以在php.ini中设置system缓存为永不过期(apc.ttl=0)。不过如果这样设置,改运php代码后需要重启WEB服务器。目前使用较多的是指此类缓存。

用户数据缓存:缓存由用户在编写PHP代码时用apc_store和apc_fetch函数操作读取、写入的。如果数据量不大的话,可以一试。如果数据量大,使用类似memcache此类的更加专著的内存缓存方案会更好。

二、APC模块安装

1.安装

 wget http://pecl.php.net/get/APC-3.1.8.tgz
 tar -zxvf APC-3.1.8.tgz cd APC-3.1.8
 /usr/local/php/bin/phpize
 ./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex --with-php-config=/usr/local/php/bin/php-config
 make && make install
在php.ini加入:extension=apc.so
 service php-fpm5 restart

2.编译出现的问题

 configure.in:1347: warning: AC_CACHE_VAL(lt_prog_compiler_pic_works, …): suspicious cache-id, must contain _cv_ to be cached
 aclocal.m4:3548: AC_LIBTOOL_COMPILER_OPTION is expanded from…
 aclocal.m4:8133: AC_LIBTOOL_PROG_COMPILER_PIC is expanded from…
 configure.in:1347: warning: AC_CACHE_VAL(lt_prog_compiler_pic_works_CXX, …): suspicious cache-id, must contain _cv_ to be cached
 aclocal.m4:6549: _LT_AC_LANG_CXX_CONFIG is expanded from…
 aclocal.m4:5605: AC_LIBTOOL_LANG_CXX_CONFIG is expanded from…
 aclocal.m4:4737: _LT_AC_TAGCONFIG is expanded from…
 解决方法:
 wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
 tar -zvxf m4-1.4.9.tar.gz
 cd m4-1.4.9/
 ./configure && make && make install
 wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
 tar -zvxf autoconf-2.62.tar.gz
 cd autoconf-2.62/
 ./configure && make && make install
 export PHP_AUTOCONF=/usr/bin/autoconf
 export PHP_AUTOHEADER=/usr/bin/autoheader

 

三、APC使用

<?php 
if 
class Apc{ 

    /**
     * Apc缓存-设置缓存
     * 设置缓存key,value和缓存时间
     * @param  string $key   KEY值
     * @param  string $value 值
     * @param  string $time  缓存时间
     */ 
    public function set_cache($key, $value, $time = 0) {  
        if ($time == 0) $time = null; //null情况下永久缓存 
        return apc_store($key, $value, $time);; 
    } 

     
    /**
     * Apc缓存-获取缓存
     * 通过KEY获取缓存数据
     * @param  string $key   KEY值
     */ 
    public function get_cache($key) { 
        return apc_fetch($key); 
    } 

    /**
     * Apc缓存-清除一个缓存
     * 从memcache中删除一条缓存
     * @param  string $key   KEY值
     */ 
    public function clear($key) { 
        return apc_delete($key); 
    } 

    /**
     * Apc缓存-清空所有缓存
     * 不建议使用该功能
     * @return
     */ 
    public function clear_all() { 
        apc_clear_cache('user'); //清除用户缓存 
        return apc_clear_cache(); //清楚缓存 
    } 

    /**
     * 检查APC缓存是否存在
     * @param  string $key   KEY值
     */ 
    public function exists($key) { 
        return apc_exists($key); 
    } 

    /**
     * 字段自增-用于记数
     * @param string $key  KEY值
     * @param int    $step 新增的step值
     */ 
    public function inc($key, $step) { 
        return apc_inc($key, (int) $step); 
    } 

    /**
     * 字段自减-用于记数
     * @param string $key  KEY值
     * @param int    $step 新增的step值
     */ 
    public function dec($key, $step) { 
        return apc_dec($key, (int) $step); 
    } 

    /**
     * 返回APC缓存信息
     */ 
    public function info() { 
        return apc_cache_info(); 
    } 
}

四、忠告

笔者是在面试的时候,碰到面试官问apc,倒是有一点懵逼,不过仔细研究一下,apc就是相当于PHP自带的缓存,适用于一些系统设置等PHP变量,生命周期是整个应用(从httpd守护进程到httpd守护进程关闭),使用apc比memcache更好,因为(不需要经过网络传输协议),但是现实来讲的话,系统变量都是写到文件,那么这个apc,又是否是有些多余那?

看了一下apc的项目发布事件流,最近一次发布更新,是在2012年,似乎没人维护的节奏,果真是”可选PHP 缓存”,可用可不用。

发表评论

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

23 + = 29