亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用php-cli怎么對token進行刷新

發布時間:2020-12-19 16:32:26 來源:億速云 閱讀:185 作者:Leah 欄目:開發技術

本篇文章為大家展示了使用php-cli怎么對token進行刷新,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

使用php-cli怎么對token進行刷新

使用php-cli怎么對token進行刷新

使用php-cli怎么對token進行刷新

使用php-cli怎么對token進行刷新

4、刷新token

<1>命名的規則

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

比如說,所有用戶的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);//第三個參數是存續時間,單位是秒,如果不填則為永久 
echo $redis->get('key10');

大致說一下,ci框架的redis操作api呢是在php原生的api上面進行了一層封裝,而他這個封裝呢不包括這個模式識別。

本人的自定義操作api是從框架api直接拷貝過來的,也是為了方便添加更多方法。在原生的框架上面添加總歸不太好,比如說將來要升級、移植等問題。寫成自己的類庫想怎么改怎么改。

下面是添加這個模式識別api:

  public function keys($pattern)
  {
    return $this->_redis->keys($pattern);
  }

然后在model里面這樣調用:

  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的時候,會將有效期寫進去,那么只要這個有效期的值是正確的,我們取到這個token必定是有效的,那么我們拿這個有效的token去刷新,必然是成功的。一般不存在刷新失敗的情況。因為這個token一旦失效我們也就取不到了。

上述內容就是使用php-cli怎么對token進行刷新,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永昌县| 修文县| 甘洛县| 元氏县| 耒阳市| 福建省| 民和| 林口县| 海宁市| 温泉县| 贞丰县| 洮南市| 禹州市| 澜沧| 庆元县| 贵阳市| 得荣县| 闽侯县| 嘉禾县| 西城区| 万山特区| 桑植县| 花莲市| 锡林郭勒盟| 英山县| 平度市| 嘉峪关市| 酉阳| 彩票| 文昌市| 林甸县| 虎林市| 松桃| 邵阳县| 昌图县| 云龙县| 忻州市| 酒泉市| 常熟市| 东兴市| 台中市|