利用php-cli和任務(wù)計劃實現(xiàn)刷新token功能的方法
1、業(yè)務(wù)需求
需要實現(xiàn)這樣一個功能:在第三方授權(quán)的認證當(dāng)中,在用戶首次登錄授權(quán)我們會得到一個access_token,有效期為25小時,還會得到一個refresh_token,有效期為30天。
我們只要保存好這個refresh_token,在30天內(nèi)我們都可以用這個refresh_token去請求一個api,他會返回一個新的access_token。這樣我們只需要讓用戶授權(quán)一次,我們就可以獲得長達30天的一個授權(quán)期限。
這里可以分為幾個點:
<1>這個應(yīng)該是要定期執(zhí)行的一個任務(wù)。
25小時才會過期,那么我們12小時刷一次就足夠了,并不需要很頻繁的刷新。假設(shè)這樣一種情況:讓一個頁面持續(xù)的運行,用一個while的死循環(huán)去執(zhí)行一個任務(wù),執(zhí)行完之后sleep很長一段時間,然后再繼續(xù)執(zhí)行。這樣做也是可以的,但是比較占資源。他執(zhí)行的時間很少,等待的時間卻很長,沒必要這樣一直等待。
<2>這個應(yīng)該不需要是一個可以訪問到的頁面。
是我們內(nèi)部執(zhí)行的一個任務(wù),不需要是人人可以訪問到的一個頁面。
<3>這個頁面應(yīng)該也要和框架融合在一起,可以訪問到各種資源。
一個普通的php頁面恐怕是不行的,我們需要跟框架融合的一個頁面,需要可以訪問到各種資源,比如說redis,比如說config,等等。
2、用cli模式運行codeigniter的頁面
<1>cli的頁面特性
什么是cli模式?就是命令行模式。我們可以不用url來訪問php頁面,而使用命令行來訪問,這是可以的。
對頁面來說,什么都不需要改變,比如:
>同樣要是一個普通的controller,要繼承自CI_Controller;
>要定義路由器,這個頁面必須也是經(jīng)由路由訪問得到;
>甚至仍然可以添加這樣的聲明
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 //網(wǎng)站的根目錄,即index.php所在目錄
php index.php aaa bbb ccc //即訪問網(wǎng)址為yourdomain.com/index.php/aaa/bbb/ccc這樣的地址注意:
>第一行是轉(zhuǎn)到網(wǎng)站根目錄這個路徑;
>第二行php是調(diào)用了php.exe這個是因為我們有設(shè)置php的環(huán)境變量;
>index.php不可以缺少,因為這里我們沒有走服務(wù)器了,沒有經(jīng)過服務(wù)器的url-rewrite,所以這個index.php是必不可少的。
我們可以將這兩行代碼放在一個文本文件里面,將名字改為refresh.bat,雙擊這個bat文件,他就會執(zhí)行一次,相當(dāng)于打開命令行來執(zhí)行
如果我們需要調(diào)試的話,不要讓彈出的命令行自動關(guān)掉,我們可以在加上第三行代碼,加一個單詞就可以了:pause
他就會停住并且顯示相關(guān)的信息方便我們調(diào)試。
<3>頁面調(diào)試
如下例子,此頁面通過把一個值每刷新頁面一次累加一次,存在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、創(chuàng)建計劃任務(wù)讓他運行bat文件
4、刷新token
<1>命名的規(guī)則
刷新token首先想到的是遍歷redis。redis那么多應(yīng)該怎么遍歷?我想到的是給不同類型redis設(shè)定不同的前綴。
比如說,所有用戶的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);//第三個參數(shù)是存續(xù)時間,單位是秒,如果不填則為永久 echo $redis->get('key10');
大致說一下,ci框架的redis操作api呢是在php原生的api上面進行了一層封裝,而他這個封裝呢不包括這個模式識別。
本人的自定義操作api是從框架api直接拷貝過來的,也是為了方便添加更多方法。在原生的框架上面添加總歸不太好,比如說將來要升級、移植等問題。寫成自己的類庫想怎么改怎么改。
下面是添加這個模式識別api:
public function keys($pattern) { return $this->_redis->keys($pattern); }
然后在model里面這樣調(diào)用:
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的時候,會將有效期寫進去,那么只要這個有效期的值是正確的,我們?nèi)〉竭@個token必定是有效的,那么我們拿這個有效的token去刷新,必然是成功的。一般不存在刷新失敗的情況。因為這個token一旦失效我們也就取不到了。
以上這篇利用php-cli和任務(wù)計劃實現(xiàn)刷新token功能的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- php版微信開發(fā)Token驗證失敗或請求URL超時問題的解決方法
- 驗證token、回復(fù)圖文\文本、推送消息的實用微信類php代碼
- 關(guān)于php微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的問題
- PHP Token(令牌)設(shè)計
- PHP令牌 Token改進版
- PHP定時任務(wù)獲取微信access_token的方法
- php表單加入Token防止重復(fù)提交的方法分析
- PHP使用token防止表單重復(fù)提交的方法
- 基于thinkPHP3.2實現(xiàn)微信接入及查詢token值的方法
- php token使用與驗證示例【測試可用】
相關(guān)文章
PHP使用SWOOLE擴展實現(xiàn)定時同步 MySQL 數(shù)據(jù)
本文給大家介紹的是一次比較特殊的任務(wù),我們使用PHP SWOOLE 做一個異步的定時任務(wù)系統(tǒng),具體如何來實現(xiàn)的呢,接下來來我們好好看下吧2017-04-04100多行PHP代碼實現(xiàn)socks5代理服務(wù)器[2]
這篇文章主要介紹了100多行PHP代碼實現(xiàn)socks5代理服務(wù)器,需要的朋友可以參考下2016-05-05laravel實現(xiàn)登錄時監(jiān)聽事件,添加登錄用戶的記錄方法
今天小編就為大家分享一篇laravel實現(xiàn)登錄時監(jiān)聽事件,添加登錄用戶的記錄方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09php從數(shù)據(jù)庫讀取數(shù)據(jù),并以json格式返回數(shù)據(jù)的方法
今天小編就為大家分享一篇php從數(shù)據(jù)庫讀取數(shù)據(jù),并以json格式返回數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08