缓存
这一章,将从简单的缓存、再到高速缓存、最后延伸到多级缓存,逐步进行说明。
简单本地缓存
这里所指的简单缓存,主要是存储在单台服务器上的缓存,例如使用系统文件的文件缓存,PHP语言提供的APCU缓存。因为实现简单,且部署方便。但其缺点也是明显的,如文件I/O读写导致性能低,不能支持分布式。所以在没有集群服务器下是适用的。
文件缓存
例如,当需要使用文件缓存时,先在DI容器中注册对文件缓存到\PhalApi\DI()->cache
。
$di->cache = new PhalApi\Cache\FileCache(array('path' => API_ROOT . '/runtime', 'prefix' => 'demo'));
初始化文件缓存时,需要传入配置数组,其中path为缓存数据的目录,可选的前缀prefix,用于区别不同的项目。
然后便可在适当的场景使用缓存。
// 设置
PhalApi\DI()->cache->set('thisYear', 2015, 600);
// 获取,输出:2015
echo PhalApi\DI()->cache->get('thisYear');
// 删除
PhalApi\DI()->cache->delete('thisYear');
可以看到,在指定的缓存目录下会有类似以下这样的缓存文件。
$ tree ./runtime/cache/
./runtime/cache/
└── 483
└── 11303fe8f96da746aa296d1b0c11d243.dat
APCU缓存
安装好APCU扩展和设置相关配置并重启PHP后,便可开始使用APCU缓存。APCU缓存的初始化比较简单,只需要简单创建实例即可,不需要任何配置。
$di)->cache = new PhalApi\Cache\APCUCache();
其他使用参考缓存接口,这里不再赘述。
高速集群缓存
这里的高速集群缓存,是指备分布式存储能力,并且进驻内存的缓存机制。高速集群缓存性能优于简单缓存,并且能够存储的缓存容量更大,通常配置在其他服务器,即与应用服务器分开部署。其缺点是需要安装相应的PHP扩展,另外部署缓存服务,例如常见的Memcached、Redis。若需要考虑缓存落地,还要进一步配置。
Memcache/Memcached缓存
若需要使用Memcache/Memcached缓存,则需要安装相应的PHP扩展。PHP 7中已经逐渐不支持Memcache,因此建议尽量使用Memcached扩展。
如使用Memcached:
$di->cache = new PhalApi\Cache\MemcachedCache(array('host' => '127.0.0.1', 'port' => 11211, 'prefix' => 'demo_'));
初始化Memcached时,需要传递一个配置数组,其中host为缓存服务器,port为缓存端口,prefix为可选的前缀,用于区别不同的项目。配置前缀,可以防止同一台MC服务器同一端口下key名冲突。对于缓存的配置,更好的建议是使用配置文件来统一管理配置。例如调整成:
$di->cache = new PhalApi\Cache\MemcachedCache(DI()->config->get('sys.mc'));
相应的配置,则在./config/sys.php中的mc选项中统一维护。
完成了Memcached的初始化和注册后,便可考缓存接口进行使用,这里不再赘述。Memcache的初始化和配置和Memcached一样。
如何配置多个Memcache/Memcached实例?
实际项目开发中,当需要连接多个Memcache/Memcached实例,可以在单个实例配置基础上采用以下配置:
$config = array(
'host' => '192.168.1.1, 192.168.1.2', //多个用英文逗号分割
'port' => '11211, 11212', //多个用英文逗号分割
'weight' => '20, 80', //(可选)多个用英文逗号分割
);
$di->cache = new PhalApi\Cache\MemcachedCache($config);
上面配置了两个MC实例,分别是:
- 192.168.1.1,端口为11211,权重为20
- 192.168.1.2,端口为11212,权重为80
其中,权重是可选的。并且以host域名的数量为基准,即最终MC实例数量以host的个数为准。端口数量不足时取默认值11211,多出的端口会被忽略;同样,权重数量不足时取默认值0,多出的权重会被忽略。
如下,是一份稀疏配置:
$config = array(
'host' => '192.168.1.1, 192.168.1.2, 192.168.1.3',
'port' => '11210',
);
相当于:
- 192.168.1.1,端口为11210,权重为0(默认值)
- 192.168.1.2,端口为11211(默认值),权重为0(默认值)
- 192.168.1.3,端口为11211(默认值),权重为0(默认值)
请注意,通常不建议在权重weight使用稀疏配置,即要么全部不配置权重,要么全部配置权重,以免部分使用默认权重为0的MC实例不生效。
Redis缓存
当需要使用Redis缓存时,需要先安装对应的Redis扩展。
简单的Redis缓存的初始化如下:
$config = array('host' => '127.0.0.1', 'port' => 6379);
$di->cache = new PhalApi\Cache\RedisCache($config);
关于Redis的配置,更多选项如下。
Redis配置项 | 是否必须 | 默认值 | 说明 |
---|---|---|---|
type | 否 | unix | 当为unix时使用socket连接,否则使用http连接 |
socket | type为unix时必须 | 无 | unix连接方式 |
host | type不为unix时必须 | 无 | Redis域名 |
port | type不为unix时必须 | 6379 | Redis端口 |
timeout | 否 | 300 | 连接超时时间,单位秒 |
prefix | 否 | phalapi: | key前缀 |
auth | 否 | 空 | Redis身份验证 |
db | 否 | 0 | Redis库 |
扩展:添加新的缓存实现
当需要实现其他缓存机制时,例如使用COOKIE、SESSION、数据库等其他方式的缓存,可以先实现具体的缓存类,再重新注册\PhalApi\DI()->cache
即可。
首先,简单了解下PhalApi中的缓存接口PhalApi\Cache。
<?php
namespace PhalApi;
interface Cache {
public function set($key, $value, $expire = 600);
public function get($key);
public function delete($key);
}
此PhalApi\Cache
缓存接口,主要有三个操作:设置缓存、获取缓存、删除缓存。设置时,缓存不存在时添加,缓存存在时则更新,过期时间单位为秒。当获取失败时,约定返回NULL。
所以,新的缓存实现类应按规约层的接口签名完成此缓存接口的实现。