缓存

本项目使用 doctrine/cache 来完成缓存工作,它支持基本目前所有的缓存引擎。

在我们的 SDK 中的所有缓存默认使用文件缓存,缓存路径取决于 PHP 的临时目录,如果你需要自定义缓存,那么你需要做如下的事情:

你可以参考doctrine/cache官方文档来替换掉应用中默认的缓存配置:

以 redis 为例请先安装 redis 拓展:https://github.com/phpredis/phpredis

  1. use Doctrine\Common\Cache\RedisCache;
  2. $cacheDriver = new RedisCache();
  3. // 创建 redis 实例
  4. $redis = new Redis();
  5. $redis->connect('redis_host', 6379);
  6. $cacheDriver->setRedis($redis);
  7. $options = [
  8. 'debug' => false,
  9. 'app_id' => $wechatInfo['app_id'],
  10. 'secret' => $wechatInfo['app_secret'],
  11. 'token' => $wechatInfo['token'],
  12. 'aes_key' => $wechatInfo['aes_key'], // 可选
  13. 'cache' => $cacheDriver,
  14. ];
  15. $wechatApp = new Application($options);

Laravel 中使用

在 Laravel 中框架使用 predis/predis,那么我们就得使用 Doctrine\Common\Cache\PredisCache

  1. use Doctrine\Common\Cache\PredisCache;
  2. $predis = app('redis')->connection();// connection($name), $name 默认为 `default`
  3. $cacheDriver = new PredisCache($predis);
  4. $app->cache = $cacheDriver;

上面提到的 app('redis')->connection($name), 这里的 $name 是 laravel 项目中配置文件 database.phpredis 配置名 defaulthttps://github.com/laravel/laravel/blob/master/config/database.php#L118如果你使用的其它连接,对应传名称就好了。如果你在使用Laravel 5.4,应将$predis = app('redis')->connection();修改为:$predis = app('redis')->connection()->client();

使用自定义的缓存方式

如果你发现 doctrine 提供的几十种缓存方式都满足不了你的需求的话,那么你可以自己建立一个类来完成缓存操作,前提这个类得实现接口:Doctrine\Common\Cache\Cache

该接口有以下方法需要实现:

  1. public function fetch($id); // 读取缓存
  2. public function contains($id); // 检查是否存在缓存
  3. public function save($id, $data, $lifeTime = 0); // 设置缓存
  4. public function delete($id); // 删除缓存
  5. public function getStats(); // 获取状态

下面为一个示例:

  1. <?php
  2. use Doctrine\Common\Cache\Cache as CacheInterface;
  3. class MyCacheDriver implements CacheInterface
  4. {
  5. public function fetch($id)
  6. {
  7. // 你自己从你想实现的存储方式读取并返回
  8. }
  9. public function contains($id)
  10. {
  11. // 同理 返回存在与否 bool 值
  12. }
  13. public function save($id, $data, $lifeTime = 0)
  14. {
  15. // 用你的方式存储该缓存内容即可
  16. }
  17. public function delete($id)
  18. {
  19. // 删除并返回 bool 值
  20. }
  21. public function getStats()
  22. {
  23. // 这个你可以不用实现,返回 null 即可
  24. }
  25. }

然后实例化你的缓存类并在 EasyWeChat 里使用它:

  1. $myCacheDriver = new MyCacheDriver();
  2. $config = [
  3. //...
  4. 'cache' => $myCacheDriver,
  5. ];
  6. $wechatApp = new Application($options);

OK,这样就完成了自定义缓存的操作。