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設定不同的前綴。