《PHP学习:利用php-cli和任务计划实现刷新token功能的方法》要点:
本文介绍了PHP学习:利用php-cli和任务计划实现刷新token功能的方法,希望对您有用。如果有疑问,可以联系我们。
1、业务需求PHP编程
需要实现这样一个功能:在第三方授权的认证当中,在用户首次登录授权我们会得到一个access_token,有效期为25小时,还会得到一个refresh_token,有效期为30天.PHP编程
我们只要保存好这个refresh_token,在30天内我们都可以用这个refresh_token去请求一个api,他会返回一个新的access_token.这样我们只需要让用户授权一次,我们就可以获得长达30天的一个授权期限.PHP编程
这里可以分为几个点:PHP编程
<1>这个应该是要定期执行的一个任务.PHP编程
25小时才会过期,那么我们12小时刷一次就足够了,并不需要很频繁的刷新.假设这样一种情况:让一个页面持续的运行,用一个while的死循环去执行一个任务,执行完之后sleep很长一段时间,然后再继续执行.这样做也是可以的,但是比较占资源.他执行的时间很少,等待的时间却很长,没必要这样一直等待.PHP编程
<2>这个应该不需要是一个可以访问到的页面.PHP编程
是我们内部执行的一个任务,不需要是人人可以访问到的一个页面.PHP编程
<3>这个页面应该也要和框架融合在一起,可以访问到各种资源.PHP编程
一个普通的php页面恐怕是不行的,我们需要跟框架融合的一个页面,需要可以访问到各种资源,比如说redis,比如说config,等等.PHP编程
2、用cli模式运行codeigniter的页面PHP编程
<1>cli的页面特性PHP编程
什么是cli模式?就是命令行模式.我们可以不用url来访问php页面,而使用命令行来访问,这是可以的.PHP编程
对页面来说,什么都不需要改变,比如:PHP编程
>同样要是一个普通的controller,要继承自CI_Controller;PHP编程
>要定义路由器,这个页面必须也是经由路由访问得到;PHP编程
>甚至仍然可以添加这样的声明PHP编程
defined('BASEPATH') OR exit('No direct script access allowed');PHP编程
>可以通过添加一个判断让页面只能让cli访问:
PHP编程
public function __construct() { parent::__construct(); if (!is_cli()) exit("不正确的访问方式"); }
>通过echo打印在命令行上面,就如打印在页面上一样PHP编程
<2>怎么通过命令行访问PHP编程
cd E:\xxx\xxx\phpSite //网站的根目录,即index.php所在目录PHP编程
php index.php aaa bbb ccc //即访问网址为yourdomain.com/index.php/aaa/bbb/ccc这样的地址注意:PHP编程
>第一行是转到网站根目录这个路径;PHP编程
>第二行php是调用了php.exe这个是因为我们有设置php的环境变量;PHP编程
>index.php不可以缺少,因为这里我们没有走服务器了,没有经过服务器的url-rewrite,所以这个index.php是必不可少的.PHP编程
我们可以将这两行代码放在一个文本文件里面,将名字改为refresh.bat,双击这个bat文件,他就会执行一次,相当于打开命令行来执行PHP编程
如果我们需要调试的话,不要让弹出的命令行自动关掉,我们可以在加上第三行代码,加一个单词就可以了:pausePHP编程
他就会停住并且显示相关的信息方便我们调试.PHP编程
<3>页面调试PHP编程
如下例子,此页面通过把一个值每刷新页面一次累加一次,存在redis里,来验证页面是否有被访问过:PHP编程
<?php defined('BASEPATH') OR exit('No direct script access allowed'); /** * Created by PhpStorm. * Date: 2017/2/20 * Time: 23:18 */ class Refresh_token extends CI_Controller { public function __construct() { parent::__construct(); if (!is_cli()) exit("不正确的访问方式"); } public function index() { $oldData = $this->redis_model->get_access_token('1234'); if ($oldData == null) $oldData = 0; $newData = $oldData + 1; $this->redis_model->set_access_token('1234',$newData); echo 'its refresh_token page!'; } }
3、创建计划任务让他运行bat文件
PHP编程
PHP编程
PHP编程
PHP编程
PHP编程
4、刷新tokenPHP编程
<1>命名的规则PHP编程
刷新token首先想到的是遍历redis.redis那么多应该怎么遍历?我想到的是给不同类型redis设定不同的前缀.PHP编程
比如说,所有用户的refresh_token的key都这样写:"refresh_token_用户id".然后用redis的模式匹配就可以把以"refresh_token_"开头的key找出来,然后一条条处理.PHP编程
<2>redis遍历PHP编程
首先,redis是有模式识别的功能,参见手册:https://redis.io/commands/keysPHP编程
其次,php原生的redis组件是有这个模式识别的功能.原生的用法大概是这样:PHP编程
// 原生redis类库,不需要config/redis.php $redis = new Redis(); $redis->connect('127.0.0.1',6379); //$redis->set('key10','xx10',20);//第三个参数是存续时间,单位是秒,如果不填则为永久 echo $redis->get('key10');
大致说一下,ci框架的redis操作api呢是在php原生的api上面进行了一层封装,而他这个封装呢不包括这个模式识别.PHP编程
本人的自定义操作api是从框架api直接拷贝过来的,也是为了方便添加更多方法.在原生的框架上面添加总归不太好,比如说将来要升级、移植等问题.写成自己的类库想怎么改怎么改.PHP编程
下面是添加这个模式识别api:PHP编程
public function keys($pattern) { return $this->_redis->keys($pattern); }
然后在model里面这样调用:PHP编程
public function get_keys($pattern) { return $this->rediscli->default->keys($pattern); }
然后在controller里面使用:PHP编程
// $this->redis_model->set_redis('hello'.'1','my_hello_1',12345); // $this->redis_model->set_redis('hello'.'2','my_hello_2',12345); // $this->redis_model->set_redis('hello'.'3','my_hello_3',12345); $vals = $this->redis_model->get_keys('hello'.'*'); if ($vals != null)//注意这里,他是一个array,如果返回的是匹配到0个,那么不会是一个空的有效的0长度的array,而确实是一个null. { foreach ($vals as $val) { echo '</br>'; echo $val; } }
这样就可以完成对特定前缀的遍历了! PHP编程
注意:这里要特别说明一下,我们在写入这个token的时候,会将有效期写进去,那么只要这个有效期的值是正确的,我们取到这个token必定是有效的,那么我们拿这个有效的token去刷新,必然是成功的.一般不存在刷新失败的情况.因为这个token一旦失效我们也就取不到了.PHP编程
以上这篇利用php-cli和任务计划实现刷新token功能的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持维易PHP.PHP编程
转载请注明本页网址:
http://www.vephp.com/jiaocheng/873.html