欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用php-cli和任務(wù)計劃實現(xiàn)刷新token功能的方法

 更新時間:2017年05月03日 10:05:14   投稿:jingxian  
下面小編就為大家?guī)硪黄胮hp-cli和任務(wù)計劃實現(xiàn)刷新token功能的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論