php缓存

php中常规缓存主要有:"file", "database", "apc", "memcached", "redis", "array"等。

1、

APC 缓存

I. APC安装配置 

参考我的文章 

II. php.ini配置项[APC]段详解 

引用
[apc] 
; alternative php cache 用于缓存和优化php中间代码 

apc.cache_by_default = on 
;sys 
; 是否默认对所有文件启用缓冲。 
; 若设为off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。 

apc.enable_cli = off 
;sys 
; 是否为cli版本启用apc功能,仅用于测试和调试目的才打开此指令。 

apc.enabled = on 
; 是否启用apc,如果apc被静态编译进php又想禁用它,这是唯一的办法。 

apc.file_update_protection = 2 
;sys 
; 当你在一个运行中的服务器上修改文件时,你应当执行原子操作。 
; 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。 
; 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。 
; 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。 
; 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。 
; 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。 
; 如果你的系统由于大量的io操作导致更新缓慢,你就需要增大此值。 

apc.filters = 
;sys 
; 一个以逗号分隔的posix扩展正则表达式列表。 
; 如果源文件名与任意一个模式匹配,则该文件不被缓存。 
; 注意,用来匹配的文件名是传递给include/require的文件名,而不是绝对路径。 
; 如果正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存, 
; 如果第一个字符是"-"则任何匹配项都不会被缓存。"-"是默认值,可以省略掉。 

apc.ttl = 0 
;sys 
; 缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~36000。 
; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。 

apc.user_ttl = 0 
;sys 
; 类似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。 
; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。 

apc.gc_ttl = 3600 
;sys 
; 缓存条目在垃圾回收表中能够存在的秒数。 
; 此值提供了一个安全措施,即使一个服务器进程在执行缓存的源文件时崩溃, 
; 而且该源文件已经被修改,为旧版本分配的内存也不会被回收,直到达到此ttl值为止。 
; 设为零将禁用此特性。 

apc.include_once_override = off 
;sys 
; 关于该指令目前尚无说明文档,参见:http://pecl.php.net/bugs/bug.php?id=8754 
; 请保持为off,否则可能导致意想不到的结果。 

apc.max_file_size = 1m 
;sys 
; 禁止大于此尺寸的文件被缓存。 

apc.mmap_file_mask = 
;sys 
; 如果使用–enable-mmap(默认启用)为apc编译了mmap支持, 
; 这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为"/tmp/apc.xxxxxx")。 
; 该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。 
; 对于直接的file-backed内存映射,要设置成"/tmp/apc.xxxxxx"的样子(恰好6个x)。 
; 要使用posix风格的shm_open/mmap就需要设置成"/apc.shm.xxxxxx"的样子。 
; 你还可以设为"/dev/zero"来为匿名映射的内存使用内核的"/dev/zero"接口。 
; 不定义此指令则表示强制使用匿名映射。 

apc.num_files_hint = 1000 
;sys 
; web服务器上可能被包含或被请求的不同源文件的大致数量(建议值为1024~4096)。 
; 如果你不能确定,则设为 0 ;此设定主要用于拥有数千个源文件的站点。 

apc.optimization = 0 
; 优化级别(建议值为 0 ) 。 
; 正整数值表示启用优化器,值越高则使用越激进的优化。 
; 更高的值可能有非常有限的速度提升,但目前尚在试验中。 

apc.report_autofilter = off 
;sys 
; 是否记录所有由于early/late binding原因而自动未被缓存的脚本。 

apc.shm_segments = 1 
;sys 
; 为编译器缓冲区分配的共享内存块数量(建议值为1)。 
; 如果apc耗尽了共享内存,并且已将apc.shm_size指令设为系统允许的最大值, 
; 你可以尝试增大此值。 

apc.shm_size = 30 
;sys 
; 每个共享内存块的大小(以mb为单位,建议值为128~256)。 
; 有些系统(包括大多数bsd变种)默认的共享内存块大小非常少。 

apc.slam_defense = 0 
;sys(反对使用该指令,建议该用apc.write_lock指令) 
; 在非常繁忙的服务器上,无论是启动服务还是修改文件, 
; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。 
; 这个指令用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。 
; 比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存,从而减少碰撞几率。 
; 鼓励设为 0 来禁用这个特性。 

apc.stat = on 
;sys 
; 是否启用脚本更新检查。 
; 改变这个指令值要非常小心。 
; 默认值 on 表示apc在每次请求脚本时都检查脚本是否被更新, 
; 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。 
; 如果设为 off 则表示不进行检查,从而使性能得到大幅提高。 
; 但是为了使更新的内容生效,你必须重启web服务器。 
; 这个指令对于include/require的文件同样有效。但是需要注意的是, 
; 如果你使用的是相对路径,apc就必须在每一次include/require时都进行检查以定位文件。 
; 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。 

apc.user_entries_hint = 100 
;sys 
; 类似于num_files_hint指令,只是针对每个不同用户而言。 
; 如果你不能确定,则设为 0 。 

apc.write_lock = on 
;sys 
; 是否启用写入锁。 
; 在非常繁忙的服务器上,无论是启动服务还是修改文件, 
; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。 
; 启用该指令可以避免竞争条件的出现。 

apc.rfc1867 = off 
;sys 
; 打开该指令后,对于每个恰好在file字段之前含有apc_upload_progress字段的上传文件, 
; apc都将自动创建一个upload_的用户缓存条目(就是apc_upload_progress字段值)。



III. 函数: 

apc_cache_info        - retrieves cached information (and meta-data) from apc's data store 
apc_clear_cache       - clears the apc cache 
apc_define_constants  - defines a set of constants for later retrieval and mass-definition 
apc_delete            - removes a stored variable from the cache 
apc_fetch             - fetch a stored variable from the cache 
apc_load_constants    - loads a set of constants from the cache 
apc_sma_info          - retrieves apc's shared memory allocation information 
apc_store             - cache a variable in the data store 

apc的用法比较简单,只有几个函数,列举如下。 
apc_cache_info () 返回缓存信息 
apc_clear_cache() 清除apc缓存内容。 
默认(无参数)时,只清除系统缓存,要清除用户缓存,需用‚user‘参数。 
apc_define_constants ( string key, array constants [, bool case_sensitive] ) 将数组constants以常量加入缓存。 
apc_load_constants (string key)。 
取出常量缓存。 
apc_store ( string key, mixed var [, int ttl] )。 
在缓存中保存数据。 
apc_fetch ( string key )。 
获得apc_store保存的缓存内容 
apc_delete ( string key )。 
删除apc_store保存的内容。 

IV. apc的管理 
到pecl.php.net下载apc源码包有个apc.php,copy到你的web server可以访问到的地方,浏览即可访问。 
管理界面功能有: 
   1. refresh data 
   2. view host stats 
   3. system cache entries 
   4. user cache entries 
   5. version check 
 
重视第四小节这个工具,非常有用

2、redis

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。 

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。 

I.快速运行Redis 

一、下载安装 
进入redis.io官方网站: 

Linux代码  收藏代码
  1. $ wget http://redis.googlecode.com/files/redis-2.4.15.tar.gz  
  2. $ tar xzf redis-2.4.5.tar.gz //这里假设解压缩到/usr/local/redis  
  3. $ cd redis-2.4.5  
  4. $ make  
  5. $ make install  
  6. $ cd utils  
  7. $./install_server  



就会自动安装到/usr/local/bin目录下。在该目录下生成几个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat、redis-check-aof,它们的作用如下: 
    redis-server:Redis服务器的daemon启动程序 
    redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作 
    redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能 
    redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况 
    redis-check-aof: 

二.启动服务器 
安装时的最后一步install_server脚本会生成启动命令文件(试试就知道),下面就是一个执行例子 

Linux代码  收藏代码
  1. Welcome to the redis service installer  
  2. This script will help you easily set up a running redis server  
  3.   
  4.   
  5. Please select the redis port for this instance: [6379]  
  6. Selecting default: 6379  
  7. Please select the redis config file name [/etc/redis/6379.conf]  
  8. Selected default - /etc/redis/6379.conf  
  9. Please select the redis log file name [/var/log/redis_6379.log]  
  10. Selected default - /var/log/redis_6379.log  
  11. Please select the data directory for this instance [/var/lib/redis/6379]  
  12. Selected default - /var/lib/redis/6379  
  13. Please select the redis executable path [/usr/local/bin/redis-server]  
  14. Copied /tmp/6379.conf => /etc/init.d/redis_6379  
  15. Installing service...  
  16. Successfully added to chkconfig!  
  17. Successfully added to runlevels 345!  
  18. Starting Redis server...  
  19. Installation successful!  


/etc/init.d/redis_6379 start 
将启动服务到默认端口6379 

三.客户端访问 

Linux代码  收藏代码
  1. $ redis-cli  
  2. redis> set foo bar  
  3. OK  
  4. redis> get foo  
  5. "bar"  



四.关闭服务器 

Linux代码  收藏代码
  1. $ /etc/init.d/redis_6379 stop  


以上摘官方文档http://redis.io/download。如果想使用Windows版的Redis请去http://code.google.com/p/servicestack/wiki/RedisWindowsDownload下载(其版本滞后于官方版本,不建议在生产环境使用Win32.)。 

II. 定制服务器启动参数 
在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件(在redis解压缩目录下有一个redis.con可以作为范本),下面是redis.conf的主要配置参数的意义: 

引用
    daemonize:是否以后台daemon方式运行 
pidfile:pid文件位置 
port:监听的端口号 
timeout:请求超时时间 
loglevel:log信息级别 
logfile:log文件位置 
databases:开启数据库的数量 
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。 
rdbcompression:是否使用压缩 
dbfilename:数据快照文件名(只是文件名,不包括目录) 
dir:数据快照的保存目录(这个是目录) 
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。 
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步) 



下面是一个略做修改后的配置文件内容: 

Redis.conf代码  收藏代码
  1. daemonize yes  
  2. pidfile /usr/local/redis/var/redis.pid  
  3. port 6000  
  4. timeout 300  
  5. loglevel debug  
  6. logfile /usr/local/redis/var/redis.log  
  7. databases 16  
  8. save 900 1  
  9. save 300 10  
  10. save 60 10000  
  11. rdbcompression yes  
  12. dbfilename dump.rdb  
  13. dir /usr/local/redis/var/  
  14. appendonly no  
  15. appendfsync always  
  16. glueoutputbuf yes  
  17. shareobjects no  
  18. shareobjectspoolsize 1024  


重启服务器 

Linux代码  收藏代码
  1. redis-server /usr/local/redis/redis.conf  


试试看读写是否有问题.如果服务器启动到了指定非默认端口,那么客户端连接则需要-p参数 
如: 

Linux代码  收藏代码
  1. $redis-cli -p 6380  



* 开放服务器端口供其他主机连接 
vi /etc/sysconfig/iptables #需要具备其修改权限 
可能需要增加一行: 
# redis 
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT 
保存后重启iptables: 
service iptables restart (PATH中加入了/sbin/)或者 /etc/init.d/iptables restart 

III. PHP客户端 
Redis的php客户端库非常之多,code.google.com上就有: 
* phpredis 
http://code.google.com/p/phpredis/ 是C客户端作为php模块 

* php-predis 
http://code.google.com/p/php-redis/ 纯php客户端 
以上两个都不在Redis官方推荐推荐之列。 

Redis推荐客户端链接是:http://redis.io/clients,如下图: 


纯php库Predis(便于hack),但是性能不高。https://github.com/nrk/predis 
下载该库文件后运行bin/createSingleFile.php可以生成一个类库文件Predis.php,非常方便使用。下面是最简单的一个Hello World应用: 

Php代码  收藏代码
  1. <?php  
  2. require('Predis.php');  
  3. $single_server = array(  
  4.     'host'     => '192.168.1.101',  
  5.     'port'     => 6379,  
  6.     'database' => 15  
  7. );  
  8.   
  9. $client = new Predis\Client($single_server);  
  10.   
  11. $client->set('library''predis');  
  12. $retval = $client->get('allen ');  
  13.   
  14. var_dump($retval);  



我推荐使用的客户端是:phpredis  https://github.com/nicolasff/phpredis 
windows版的dll从这里下载https://github.com/char101/phpredis/downloads 

IV . Redis管理工具 
1. phpRedisAdmin 
https://github.com/ErikDubbelboer/phpRedisAdmin/ 
要求PHP C Module : https://github.com/nicolasff/phpredis 
比较弱 

2. redis-admin 
http://code.google.com/p/redis-admin/ 
更弱 

选phpRedisAdmin是不得不的做法.

 

 

3、memcached分布式键值对缓存。非常常用在分布式系统。

 

 

posted @ 2014-02-26 14:23  火腿骑士  阅读(148)  评论(0编辑  收藏  举报