利用php-cli和任务计划实现刷新token功能的方法
发布时间 - 2026-01-11 00:56:48 点击率:次1、业务需求

需要实现这样一个功能:在第三方授权的认证当中,在用户首次登录授权我们会得到一个access_token,有效期为25小时,还会得到一个refresh_token,有效期为30天。
我们只要保存好这个refresh_token,在30天内我们都可以用这个refresh_token去请求一个api,他会返回一个新的access_token。这样我们只需要让用户授权一次,我们就可以获得长达30天的一个授权期限。
这里可以分为几个点:
<1>这个应该是要定期执行的一个任务。
25小时才会过期,那么我们12小时刷一次就足够了,并不需要很频繁的刷新。假设这样一种情况:让一个页面持续的运行,用一个while的死循环去执行一个任务,执行完之后sleep很长一段时间,然后再继续执行。这样做也是可以的,但是比较占资源。他执行的时间很少,等待的时间却很长,没必要这样一直等待。
<2>这个应该不需要是一个可以访问到的页面。
是我们内部执行的一个任务,不需要是人人可以访问到的一个页面。
<3>这个页面应该也要和框架融合在一起,可以访问到各种资源。
一个普通的php页面恐怕是不行的,我们需要跟框架融合的一个页面,需要可以访问到各种资源,比如说redis,比如说config,等等。
2、用cli模式运行codeigniter的页面
<1>cli的页面特性
什么是cli模式?就是命令行模式。我们可以不用url来访问php页面,而使用命令行来访问,这是可以的。
对页面来说,什么都不需要改变,比如:
>同样要是一个普通的controller,要继承自CI_Controller;
>要定义路由器,这个页面必须也是经由路由访问得到;
>甚至仍然可以添加这样的声明
defined('BASEPATH') OR exit('No direct script access allowed');
>可以通过添加一个判断让页面只能让cli访问:
public function __construct()
{
parent::__construct();
if (!is_cli())
exit("不正确的访问方式");
}
>通过echo打印在命令行上面,就如打印在页面上一样
<2>怎么通过命令行访问
cd E:\xxx\xxx\phpSite //网站的根目录,即index.php所在目录
php index.php aaa bbb ccc //即访问网址为yourdomain.com/index.php/aaa/bbb/ccc这样的地址注意:
>第一行是转到网站根目录这个路径;
>第二行php是调用了php.exe这个是因为我们有设置php的环境变量;
>index.php不可以缺少,因为这里我们没有走服务器了,没有经过服务器的url-rewrite,所以这个index.php是必不可少的。
我们可以将这两行代码放在一个文本文件里面,将名字改为refresh.bat,双击这个bat文件,他就会执行一次,相当于打开命令行来执行
如果我们需要调试的话,不要让弹出的命令行自动关掉,我们可以在加上第三行代码,加一个单词就可以了:pause
他就会停住并且显示相关的信息方便我们调试。
<3>页面调试
如下例子,此页面通过把一个值每刷新页面一次累加一次,存在redis里,来验证页面是否有被访问过:
<?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文件
4、刷新token
<1>命名的规则
刷新token首先想到的是遍历redis。redis那么多应该怎么遍历?我想到的是给不同类型redis设定不同的前缀。
比如说,所有用户的refresh_token的key都这样写:"refresh_token_用户id"。然后用redis的模式匹配就可以把以"refresh_token_"开头的key找出来,然后一条条处理。
<2>redis遍历
首先,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:
public function keys($pattern)
{
return $this->_redis->keys($pattern);
}
然后在model里面这样调用:
public function get_keys($pattern)
{
return $this->rediscli->default->keys($pattern);
}
然后在controller里面使用:
// $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;
}
}
这样就可以完成对特定前缀的遍历了!
注意:这里要特别说明一下,我们在写入这个token的时候,会将有效期写进去,那么只要这个有效期的值是正确的,我们取到这个token必定是有效的,那么我们拿这个有效的token去刷新,必然是成功的。一般不存在刷新失败的情况。因为这个token一旦失效我们也就取不到了。
以上这篇利用php-cli和任务计划实现刷新token功能的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# 实现订单同步功能
# php版微信开发Token验证失败或请求URL超时问题的解决方法
# 关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
# PHP Token(令牌)设计
# PHP令牌 Token改进版
# PHP定时任务获取微信access_token的方法
# php表单加入Token防止重复提交的方法分析
# PHP使用token防止表单重复提交的方法
# 基于thinkPHP3.2实现微信接入及查询token值的方法
# php token使用与验证示例【测试可用】
# 命令行
# 遍历
# 的是
# 是一个
# 我们可以
# 就可以
# 就会
# 是有
# 不需要
# 给大家
# 很长
# 不正确
# 一个普通
# 自己的
# 期为
# 怎么改
# 类库
# 这是
# 几个
# 是在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
智能起名网站制作软件有哪些,制作logo的软件?
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
利用vue写todolist单页应用
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何在IIS服务器上快速部署高效网站?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel模型事件有哪些_Laravel Model Event生命周期详解
JavaScript模板引擎Template.js使用详解
北京网站制作的公司有哪些,北京白云观官方网站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
EditPlus 正则表达式 实战(3)
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
详解Oracle修改字段类型方法总结
如何快速生成凡客建站的专业级图册?
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
清除minerd进程的简单方法
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
黑客如何通过漏洞一步步攻陷网站服务器?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel storage目录权限问题_Laravel文件写入权限设置
如何用免费手机建站系统零基础打造专业网站?
如何做网站制作流程,*游戏网站怎么搭建?
进行网站优化必须要坚持的四大原则
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
JS实现鼠标移上去显示图片或微信二维码
网页设计与网站制作内容,怎样注册网站?
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何用狗爹虚拟主机快速搭建网站?
android nfc常用标签读取总结
青岛网站建设如何选择本地服务器?
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
,怎么在广州志愿者网站注册?
Laravel如何处理CORS跨域请求?(配置示例)
如何为不同团队 ID 动态生成多个“认领值班”按钮
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
*服务器网站为何频现安全漏洞?

