最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年05月03日 10:05:14   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇利用php-cli和任務(wù)計(jì)劃實(shí)現(xiàn)刷新token功能的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

1、業(yè)務(wù)需求

需要實(shí)現(xiàn)這樣一個(gè)功能:在第三方授權(quán)的認(rèn)證當(dāng)中,在用戶首次登錄授權(quán)我們會(huì)得到一個(gè)access_token,有效期為25小時(shí),還會(huì)得到一個(gè)refresh_token,有效期為30天。

我們只要保存好這個(gè)refresh_token,在30天內(nèi)我們都可以用這個(gè)refresh_token去請(qǐng)求一個(gè)api,他會(huì)返回一個(gè)新的access_token。這樣我們只需要讓用戶授權(quán)一次,我們就可以獲得長(zhǎng)達(dá)30天的一個(gè)授權(quán)期限。

這里可以分為幾個(gè)點(diǎn):

<1>這個(gè)應(yīng)該是要定期執(zhí)行的一個(gè)任務(wù)。

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)必要這樣一直等待。

<2>這個(gè)應(yīng)該不需要是一個(gè)可以訪問(wèn)到的頁(yè)面。

是我們內(nèi)部執(zhí)行的一個(gè)任務(wù),不需要是人人可以訪問(wèn)到的一個(gè)頁(yè)面。

<3>這個(gè)頁(yè)面應(yīng)該也要和框架融合在一起,可以訪問(wèn)到各種資源。

一個(gè)普通的php頁(yè)面恐怕是不行的,我們需要跟框架融合的一個(gè)頁(yè)面,需要可以訪問(wèn)到各種資源,比如說(shuō)redis,比如說(shuō)config,等等。

2、用cli模式運(yùn)行codeigniter的頁(yè)面

<1>cli的頁(yè)面特性

什么是cli模式?就是命令行模式。我們可以不用url來(lái)訪問(wèn)php頁(yè)面,而使用命令行來(lái)訪問(wèn),這是可以的。

對(duì)頁(yè)面來(lái)說(shuō),什么都不需要改變,比如:

>同樣要是一個(gè)普通的controller,要繼承自CI_Controller;

>要定義路由器,這個(gè)頁(yè)面必須也是經(jīng)由路由訪問(wèn)得到;

>甚至仍然可以添加這樣的聲明

defined('BASEPATH') OR exit('No direct script access allowed');

>可以通過(guò)添加一個(gè)判斷讓頁(yè)面只能讓cli訪問(wèn):

  public function __construct()
  {
    parent::__construct();
    if (!is_cli())
      exit("不正確的訪問(wèn)方式");
  }

>通過(guò)echo打印在命令行上面,就如打印在頁(yè)面上一樣

<2>怎么通過(guò)命令行訪問(wèn)

cd E:\xxx\xxx\phpSite  //網(wǎng)站的根目錄,即index.php所在目錄

php index.php aaa bbb ccc  //即訪問(wèn)網(wǎng)址為yourdomain.com/index.php/aaa/bbb/ccc這樣的地址注意:

>第一行是轉(zhuǎn)到網(wǎng)站根目錄這個(gè)路徑;

>第二行php是調(diào)用了php.exe這個(gè)是因?yàn)槲覀冇性O(shè)置php的環(huán)境變量;

>index.php不可以缺少,因?yàn)檫@里我們沒(méi)有走服務(wù)器了,沒(méi)有經(jīng)過(guò)服務(wù)器的url-rewrite,所以這個(gè)index.php是必不可少的。

我們可以將這兩行代碼放在一個(gè)文本文件里面,將名字改為refresh.bat,雙擊這個(gè)bat文件,他就會(huì)執(zhí)行一次,相當(dāng)于打開(kāi)命令行來(lái)執(zhí)行

如果我們需要調(diào)試的話,不要讓彈出的命令行自動(dòng)關(guān)掉,我們可以在加上第三行代碼,加一個(gè)單詞就可以了:pause

他就會(huì)停住并且顯示相關(guān)的信息方便我們調(diào)試。

<3>頁(yè)面調(diào)試

如下例子,此頁(yè)面通過(guò)把一個(gè)值每刷新頁(yè)面一次累加一次,存在redis里,來(lái)驗(yàn)證頁(yè)面是否有被訪問(wèn)過(guò):

<?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文件

4、刷新token

<1>命名的規(guī)則

刷新token首先想到的是遍歷redis。redis那么多應(yīng)該怎么遍歷?我想到的是給不同類型redis設(shè)定不同的前綴。

比如說(shuō),所有用戶的refresh_token的key都這樣寫(xiě):"refresh_token_用戶id"。然后用redis的模式匹配就可以把以"refresh_token_"開(kāi)頭的key找出來(lái),然后一條條處理。

<2>redis遍歷

首先,redis是有模式識(shí)別的功能,參見(jiàn)手冊(cè):https://redis.io/commands/keys

其次,php原生的redis組件是有這個(gè)模式識(shí)別的功能。原生的用法大概是這樣:

// 原生redis類庫(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í)別。

本人的自定義操作api是從框架api直接拷貝過(guò)來(lái)的,也是為了方便添加更多方法。在原生的框架上面添加總歸不太好,比如說(shuō)將來(lái)要升級(jí)、移植等問(wèn)題。寫(xiě)成自己的類庫(kù)想怎么改怎么改。

下面是添加這個(gè)模式識(shí)別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)//注意這里,他是一個(gè)array,如果返回的是匹配到0個(gè),那么不會(huì)是一個(gè)空的有效的0長(zhǎng)度的array,而確實(shí)是一個(gè)null。
    {
      foreach ($vals as $val)
      {
        echo '</br>';
        echo $val;
      }
    }

這樣就可以完成對(duì)特定前綴的遍歷了!

注意:這里要特別說(shuō)明一下,我們?cè)趯?xiě)入這個(gè)token的時(shí)候,會(huì)將有效期寫(xiě)進(jìn)去,那么只要這個(gè)有效期的值是正確的,我們?nèi)〉竭@個(gè)token必定是有效的,那么我們拿這個(gè)有效的token去刷新,必然是成功的。一般不存在刷新失敗的情況。因?yàn)檫@個(gè)token一旦失效我們也就取不到了。

以上這篇利用php-cli和任務(wù)計(jì)劃實(shí)現(xiàn)刷新token功能的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

西乌| 塔河县| 富顺县| 成武县| 五台县| 新巴尔虎右旗| 敦煌市| 朝阳县| 峨眉山市| 赤水市| 库尔勒市| 枣阳市| 宜兰市| 桦南县| 曲周县| 高密市| 洪泽县| 江达县| 天台县| 巨鹿县| 左贡县| 芜湖县| 古浪县| 华安县| 怀仁县| 泽库县| 罗源县| 安庆市| 井研县| 诸城市| 礼泉县| 鹤庆县| 内江市| 襄汾县| 吴忠市| 清水河县| 张掖市| 揭西县| 肥城市| 大化| 湘潭市|