《PHP學(xué)習(xí):利用php-cli和任務(wù)計(jì)劃實(shí)現(xiàn)刷新token功能的方法》要點(diǎn):
本文介紹了PHP學(xué)習(xí):利用php-cli和任務(wù)計(jì)劃實(shí)現(xiàn)刷新token功能的方法,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
1、業(yè)務(wù)需求PHP編程
需要實(shí)現(xiàn)這樣一個(gè)功能:在第三方授權(quán)的認(rèn)證當(dāng)中,在用戶(hù)首次登錄授權(quán)我們會(huì)得到一個(gè)access_token,有效期為25小時(shí),還會(huì)得到一個(gè)refresh_token,有效期為30天.PHP編程
我們只要保存好這個(gè)refresh_token,在30天內(nèi)我們都可以用這個(gè)refresh_token去請(qǐng)求一個(gè)api,他會(huì)返回一個(gè)新的access_token.這樣我們只需要讓用戶(hù)授權(quán)一次,我們就可以獲得長(zhǎng)達(dá)30天的一個(gè)授權(quán)期限.PHP編程
這里可以分為幾個(gè)點(diǎn):PHP編程
<1>這個(gè)應(yīng)該是要定期執(zhí)行的一個(gè)任務(wù).PHP編程
25小時(shí)才會(huì)過(guò)期,那么我們12小時(shí)刷一次就足夠了,并不需要很頻繁的刷新.假設(shè)這樣一種情況:讓一個(gè)頁(yè)面持續(xù)的運(yùn)行,用一個(gè)while的死循環(huán)去執(zhí)行一個(gè)任務(wù),執(zhí)行完之后sleep很長(zhǎng)一段時(shí)間,然后再繼續(xù)執(zhí)行.這樣做也是可以的,但是比較占資源.他執(zhí)行的時(shí)間很少,等待的時(shí)間卻很長(zhǎng),沒(méi)必要這樣一直等待.PHP編程
<2>這個(gè)應(yīng)該不需要是一個(gè)可以訪問(wèn)到的頁(yè)面.PHP編程
是我們內(nèi)部執(zhí)行的一個(gè)任務(wù),不需要是人人可以訪問(wèn)到的一個(gè)頁(yè)面.PHP編程
<3>這個(gè)頁(yè)面應(yīng)該也要和框架融合在一起,可以訪問(wèn)到各種資源.PHP編程
一個(gè)普通的php頁(yè)面恐怕是不行的,我們需要跟框架融合的一個(gè)頁(yè)面,需要可以訪問(wèn)到各種資源,比如說(shuō)redis,比如說(shuō)config,等等.PHP編程
2、用cli模式運(yùn)行codeigniter的頁(yè)面PHP編程
<1>cli的頁(yè)面特性PHP編程
什么是cli模式?就是命令行模式.我們可以不用url來(lái)訪問(wèn)php頁(yè)面,而使用命令行來(lái)訪問(wèn),這是可以的.PHP編程
對(duì)頁(yè)面來(lái)說(shuō),什么都不需要改變,比如:PHP編程
>同樣要是一個(gè)普通的controller,要繼承自CI_Controller;PHP編程
>要定義路由器,這個(gè)頁(yè)面必須也是經(jīng)由路由訪問(wèn)得到;PHP編程
>甚至仍然可以添加這樣的聲明PHP編程
defined('BASEPATH') OR exit('No direct script access allowed');PHP編程
>可以通過(guò)添加一個(gè)判斷讓頁(yè)面只能讓cli訪問(wèn):
PHP編程
public function __construct() { parent::__construct(); if (!is_cli()) exit("不正確的訪問(wèn)方式"); }
>通過(guò)echo打印在命令行上面,就如打印在頁(yè)面上一樣PHP編程
<2>怎么通過(guò)命令行訪問(wèn)PHP編程
cd E:\xxx\xxx\phpSite? //網(wǎng)站的根目錄,即index.php所在目錄PHP編程
php index.php aaa bbb ccc? //即訪問(wèn)網(wǎng)址為yourdomain.com/index.php/aaa/bbb/ccc這樣的地址注意:PHP編程
>第一行是轉(zhuǎn)到網(wǎng)站根目錄這個(gè)路徑;PHP編程
>第二行php是調(diào)用了php.exe這個(gè)是因?yàn)槲覀冇性O(shè)置php的環(huán)境變量;PHP編程
>index.php不可以缺少,因?yàn)檫@里我們沒(méi)有走服務(wù)器了,沒(méi)有經(jīng)過(guò)服務(wù)器的url-rewrite,所以這個(gè)index.php是必不可少的.PHP編程
我們可以將這兩行代碼放在一個(gè)文本文件里面,將名字改為refresh.bat,雙擊這個(gè)bat文件,他就會(huì)執(zhí)行一次,相當(dāng)于打開(kāi)命令行來(lái)執(zhí)行PHP編程
如果我們需要調(diào)試的話,不要讓彈出的命令行自動(dòng)關(guān)掉,我們可以在加上第三行代碼,加一個(gè)單詞就可以了:pausePHP編程
他就會(huì)停住并且顯示相關(guān)的信息方便我們調(diào)試.PHP編程
<3>頁(yè)面調(diào)試PHP編程
如下例子,此頁(yè)面通過(guò)把一個(gè)值每刷新頁(yè)面一次累加一次,存在redis里,來(lái)驗(yàn)證頁(yè)面是否有被訪問(wèn)過(guò):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("不正確的訪問(wèn)方式"); } 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)建計(jì)劃任務(wù)讓他運(yùn)行bat文件
PHP編程
PHP編程
PHP編程
PHP編程
PHP編程
4、刷新tokenPHP編程
<1>命名的規(guī)則PHP編程
刷新token首先想到的是遍歷redis.redis那么多應(yīng)該怎么遍歷?我想到的是給不同類(lèi)型redis設(shè)定不同的前綴.PHP編程
比如說(shuō),所有用戶(hù)的refresh_token的key都這樣寫(xiě):"refresh_token_用戶(hù)id".然后用redis的模式匹配就可以把以"refresh_token_"開(kāi)頭的key找出來(lái),然后一條條處理.PHP編程
<2>redis遍歷PHP編程
首先,redis是有模式識(shí)別的功能,參見(jiàn)手冊(cè):https://redis.io/commands/keysPHP編程
其次,php原生的redis組件是有這個(gè)模式識(shí)別的功能.原生的用法大概是這樣:PHP編程
// 原生redis類(lèi)庫(kù),不需要config/redis.php $redis = new Redis(); $redis->connect('127.0.0.1',6379); //$redis->set('key10','xx10',20);//第三個(gè)參數(shù)是存續(xù)時(shí)間,單位是秒,如果不填則為永久 echo $redis->get('key10');
大致說(shuō)一下,ci框架的redis操作api呢是在php原生的api上面進(jìn)行了一層封裝,而他這個(gè)封裝呢不包括這個(gè)模式識(shí)別.PHP編程
本人的自定義操作api是從框架api直接拷貝過(guò)來(lái)的,也是為了方便添加更多方法.在原生的框架上面添加總歸不太好,比如說(shuō)將來(lái)要升級(jí)、移植等問(wèn)題.寫(xiě)成自己的類(lèi)庫(kù)想怎么改怎么改.PHP編程
下面是添加這個(gè)模式識(shí)別api:PHP編程
public function keys($pattern) { return $this->_redis->keys($pattern); }
然后在model里面這樣調(diào)用: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)//注意這里,他是一個(gè)array,如果返回的是匹配到0個(gè),那么不會(huì)是一個(gè)空的有效的0長(zhǎng)度的array,而確實(shí)是一個(gè)null. { foreach ($vals as $val) { echo '</br>'; echo $val; } }
這樣就可以完成對(duì)特定前綴的遍歷了! PHP編程
注意:這里要特別說(shuō)明一下,我們?cè)趯?xiě)入這個(gè)token的時(shí)候,會(huì)將有效期寫(xiě)進(jìn)去,那么只要這個(gè)有效期的值是正確的,我們?nèi)〉竭@個(gè)token必定是有效的,那么我們拿這個(gè)有效的token去刷新,必然是成功的.一般不存在刷新失敗的情況.因?yàn)檫@個(gè)token一旦失效我們也就取不到了.PHP編程
以上這篇利用php-cli和任務(wù)計(jì)劃實(shí)現(xiàn)刷新token功能的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持維易PHP.PHP編程
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/873.html