宝哥软件园

php-cli刷新令牌函数的方法及任务计划

编辑:宝哥软件园 来源:互联网 时间:2021-09-05

1.业务需求

我们需要实现这样一个功能:在第三方授权的认证中,我们会在用户第一次登录时得到一个有效期为25小时的access_token和一个有效期为30天的refresh_token。

只要我们保存这个refresh_token,我们就可以在30天内使用这个refresh_token请求一个api,它将返回一个新的access_token。这样,我们只需要让用户授权一次,就可以获得长达30天的授权期。

这里可以分为几点:

这应该是一项需要定期执行的任务。

25小时就过期了,所以我们12小时刷一次就够了,不需要经常刷新。我们假设一个情况:让一个页面连续运行,执行一个有一会儿无休止循环的任务,执行后长时间休眠,然后继续执行。这样做也是可能的,但是会占用更多的资源。他的行刑时间很短,但他的等待时间很长,所以没有必要一直等待。

这不应该是一个可访问的页面。

这是内部任务,不需要是每个人都能访问的页面。

这个页面也应该与框架集成,可以访问各种资源。

恐怕一个普通的php页面是不行的。我们需要一个与框架集成的页面,我们需要访问各种资源,比如redis,比如config等等。

2.在cli模式下运行codeigniter页面

1cli的页面特征

什么是cli模式?是命令行模式。我们可以使用命令行而不是url来访问php页面,这是可以的。

对于页面,不需要更改任何内容,例如:

如果也是普通控制器,应该从CI_Controller继承;

要定义路由器,还必须通过路由访问该页面;

你甚至可以添加这样的语句

已定义(' BASEPATH ')或退出('不允许直接脚本访问');

通过添加一个判断,您可以使该页面仅可供cli访问:

public function _ _ construct(){ parent :3360 _ _ construct();if(!Is_cli())退出('不正确的访问模式');}通过echo在命令行上打印,就像在页面上打印一样

2如何通过命令行访问它

Cd E:xxxxxxphpSite //网站的根目录,即index.php所在的目录

PHP index.php AAA BBB CCC//也就是访问像yourdomain.com/index.php/aaa/bbb/ccc这样的地址注意:

第一行是网站根目录的路径;

php的第二行调用php.exe,因为我们已经设置了php的环境变量;

Index.php是不可或缺的,因为我们不去服务器这里,我们不通过服务器的url重写,所以这个index.php是必不可少的。

我们可以将这两行代码放在一个文本文件中,将名称改为refresh.bat,双击bat文件,他会执行一次,相当于打开命令行执行

如果我们需要调试,不要让弹出的命令行自动关闭。我们可以添加第三行代码并添加一个词:暂停

他会停下来显示相关信息让我们调试。

3页调试

在下面的示例中,此页面通过在每次刷新页面时累积一个值并将其存储在redis中来验证页面是否被访问过:

?phpdefined('BASEPATH ')或exit('不允许直接脚本访问');/** *由PhpStorm创建。* date : 2017/2/20 * time : 2:18 */class Refresh _ token扩展了CI _ Controller { public function _ _ construct(){ parent : _ _ construct();if(!Is_cli())退出('不正确的访问模式');} public function index(){ $ old data=$ this-redis _ model-get _ access _ token(' 1234 ');if($ old data==null)$ old data=0;$ new data=$ old data 1;$ this-redis _ model-set _ access _ token(' 1234 ',$ new data);回显“其refresh_token页面!”;}}3.创建一个计划任务,让他运行bat文件

4.刷新令牌

1命名规则

刷新令牌的第一个想法是遍历redis。如何遍历这么多redis?我想为不同类型的redis设置不同的前缀。

例如,所有用户' refresh_token '的密钥编写如下:' refresh_token_ user id '。然后,使用redis的模式匹配,可以找出以‘refresh _ token _’开头的关键字,并逐一进行处理。

2双向遍历

首先,redis有模式识别的功能,参见手册:https://redis.io/commands/keys

其次,php的原生redis组件具有这种模式识别功能。原生用法大概是这样的:

//原生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上,但这种封装不包括这种模式识别。

我自己的自定义操作api是直接从框架api复制过来的,也是为了方便添加更多的方法。添加原生框架并不总是好的,比如未来的升级和移植。写自己的类库,想怎么改就怎么改。

下面是添加这个模式识别api:

公共功能键($ pattern){ return $ this-_ redis-keys($ pattern);}然后像这样调用模型:

公共函数get _ keys($ pattern){ return $ this-redis CLI-default-keys($ pattern);}然后在控制器中使用它:

//$ 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($ val!=null)//这里注意它是一个数组。如果返回0个匹配项,它将不是长度为0的空有效数组,但它确实是null。{ foreach($ val as $ val){ echo '/br ';echo $ val}}这样就可以完成特定前缀的遍历了!

注意:这里需要特别说明的是,我们写这个令牌的时候,会写有效期,所以只要有效期的值是正确的,就一定要获取这个令牌,用这个有效的令牌刷新,一定要成功。一般不会出现刷新失败的情况。因为一旦这个令牌过期,我们就拿不到了。

以上使用php-cli刷新令牌函数的方法和任务计划都是边肖分享的内容。希望能给大家一个参考,支持我们。

更多资讯
游戏推荐
更多+