PHP laravel框架Redis门面的误用
使用laravel的Redis时候乱用Facades踩了一个坑。。。
判断Redis是否有某个key值得时候是可以这样写,
Redis::exists(key值)
因为使用了Redis门面,所以可以直接使用Redis::exists而不用先建立实例,就是文档中介绍的“Facade 基类使用魔术方法 __callStatic() 从你的门面中调用解析对象”。
简单说就是没有exists这个静态方法,使用的时候会调用__callStatic(),建立实例:
$instance = static::getFacadeRoot();
使用Redis时候没有使用默认库0,所以按照文档上的例子指定服务,
代码如下:
Redis::connection('users');
Redis::exists(key值)
这么做不能判断key值是否存在,测试以后发现第二行Redis::exists连接的仍然是默认库0。
乱用Facades踩到坑了!
我用的是laravel5.2,redis使用Predis。
虽然Redis的Facades是一个静态代理,在使用时候"Redis::"也是静态唯一的,BUT connection并不是一个静态方法。
Redis对应的Facades底层类 Illuminate\Redis\Database,connection方法如下
/*** Get a specific Redis connection instance.** @param string $name* @return \Predis\ClientInterface|null*/public function connection($name = 'default'){return Arr::get($this->clients, $name ?: 'default');}
返回redis的链接实例。
实际上$this->clients在Redis::调用__callStatic()建立实例的时候就已经初始化,
/*** Create a new Redis connection instance.** @param array $servers* @return void*/public function __construct(array $servers = []){$cluster = Arr::pull($servers, 'cluster');$options = (array) Arr::pull($servers, 'options');if ($cluster) {$this->clients = $this->createAggregateClient($servers, $options);} else {$this->clients = $this->createSingleClients($servers, $options);}}
打印发现 $this->clients 是将 redis的所有配置都初始化,当connection传入配置名的时候选择这个配置链接实例。
虽然Redis实例是静态的,但是这个redis链接并不是。
Redis::exists()更是和connection()方法无关,redis门面调用__callStatic()后会执行 Illuminate\Redis\Database 的exists方法,但是Database没有这个方法,所以触发__call()方法。
/*** Dynamically make a Redis command.** @param string $method* @param array $parameters* @return mixed*/public function __call($method, $parameters){return $this->command($method, $parameters);}
而command() 方法使用的是default配置,也就是说Redis::所有方法除了connection都是默认库。
/*** Run a command against the Redis database.** @param string $method* @param array $parameters* @return mixed*/public function command($method, array $parameters = []){return call_user_func_array([$this->clients['default'], $method], $parameters);}
所以要使用非默认配置的同一个redis链接时候必须保存redis实例,
$redis = Redis::connection("user");
$redis->exists(key值);
$redis->exists 不会调用database的command方法,redis继续使用connection选择的初始化链接,不会选择default配置。
这其实还涉及到Predis底层的实现,已经超出我的理解范围。
看完代码感觉还是有点晕。。。
反正Redis门面还是不要乱用。
转载于:https://blog.51cto.com/daweilang/1911917
PHP laravel框架Redis门面的误用相关推荐
- (最全laravel面试必备)面试官问:你对laravel 框架了解多少,为什么说是优雅的框架?
下面是自己的一些总结,面试的时候可以适用回答. laravel 框架的特点和优秀是集合了php语言的特点,和很多的设计模式.loc模式.依赖注入形成了自己的特定特性. 第一点:Laravel 的亮点 ...
- Laravel中Redis的配置和使用
引入redis composer require predis/predis 会在composer.json中引入最新版本的predis composer update 把下载predis 库加入到v ...
- laravel框架的基础学习路线(不带composer的)
首先,博主这里一直用的都是laravel的一键安装包,所以一直没有用composer来操作过laravel.很多事情不用composer也能完成.这里主要是写给公司同事的一个laravel框架入手顺序 ...
- laravel框架中文手册_Laravel框架的这些你都懂的话,它核心架构基本就懂了
使用过arave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器.视图.模型)之外,还有中间件.门面.契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一下 ...
- laravel框架应用和composer扩展包开发
laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,laravel框架思想前卫,跟随时代潮 ...
- php框架所用到的核心概念,【PHP】PHP现代框架代表-Laravel框架核心技术特性
一.php语言特点及发展现状 1.服务端脚本语言,自由度太大 ,一个业务逻辑可言写在模型里,控制器里,也可以单独封装成一个类,甚至可以嵌入到html里,这样势必会造成混乱,业务逻辑散落在各处,尤其对于 ...
- php 框架源码分析,Laravel框架源码解析之模型Model原理与用法解析
本文实例讲述了Laravel框架源码解析之模型Model原理与用法.分享给大家供大家参考,具体如下: 前言 提前预祝猿人们国庆快乐,吃好.喝好.玩好,我会在电视上看着你们. 根据单一责任开发原则来讲, ...
- laravel框架 APP 支付宝支付
首先去 支付宝 下载sdk 我下载的SDK放在第三方vendor中如下: 放入地址以后给alipay权限: sudo chmod -R 777 alipay 放入vendor以后在composer.j ...
- laravel框架基础知识总结
一.laravel简介 laravel是一套优雅简介的PHP开发框架,受欢迎程度非常之高,功能强大,工具齐全:以下是本人在学习过程中记录的laravel比较基础的资料,权当学习笔记,请大神们多多指教 ...
最新文章
- MVC4项目中验证用户登录一个特性就搞定
- 再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像
- Java并发教程–线程池
- 服务器需要哪些芯片,云计算的服务器需要芯片
- 什么导致了android.os.NetworkOnMainThreadException异常
- RUBY常用类库文档翻译以及使用示例
- Verilog 7人投票表决器
- 修改Eclipse配色方案
- OP-TEE内核学习笔记(一)(安全存储)—— 安全文件基础操作(创建、读、写)
- 【ModelScope】KAN-TTS搭建SAMBERT个性化语音合成开发环境
- 教你微信怎么加更多好友的绝佳方法
- 如何提高学生对计算机英语的兴趣论文,如何培养小学生英语学习的兴趣_英语论文.doc...
- SWUST OJ 1012: 哈希表(链地址法处理冲突)
- 解决:el-input添加clearable属性后出现2个×清除图标
- 根据视频地址获取视频的第一帧画面做为封面 IllegalArgumentException
- 视频编码起源历史发展及现状
- 简易51单片机密码锁
- 聊一聊龙蜥硬件兼容性 SIG 那些事儿 | 龙蜥 SIG
- R 数据可视化 03 | 圈图
- AM335x(TQ335x)学习笔记——Nandamp;amp;网卡驱动移植
热门文章
- mysqlinnodb教程_MySQL创建数据表时设定引擎MyISAM/InnoDB操作
- wxpython开发实例_Python中使用wxPython开发的一个简易笔记本程序实例
- 20210310 20210311 :栈、队列、堆类题目合集
- (补)20200328:两两交换链表中的节点(leetcode24)
- cmd怎么使用post请求’_flutter中dio的post请求方式使用总结
- c2665 “initgraph”: 2 个重载中没有一个可以转换所有参数类型_一个使用延迟候选项生成的用于自动化程序修复方法的工具...
- python接收邮件内容启动程序_如何使用python获取电子邮件的文本内容?
- 总结之前有道笔记的内容--对于Touch 的不同讲解
- 光影之路 GPU架构发展史(3/4)
- ICLR 2019提交截止,近1600篇论文已全部上线