首頁  >  文章  >  後端開發  >  PHP產生唯一RequestID類

PHP產生唯一RequestID類

不言
不言原創
2018-04-14 14:42:573106瀏覽

這篇文章主要介紹了PHP生成唯一RequestID類,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

本文介紹PHP生成唯一 RequestID類,使用session_create_id()uniqid()方法,保證唯一性,提供完整程式碼及演示,方便大家學習使用。

現在的系統設計一般使用分散式系統,一個請求可能要呼叫幾個微服務處理,最後再把結果回傳。當請求出現問題時,我們很難追蹤是哪個微服務出現問題。

每個請求存取伺服器時,我們可以給這個存取加入一個唯一識別(RequestID),在請求開始,請求過程中,及請求結束時,把這個請求流程關鍵的資料寫入日誌(例如存取時的參數,經過那些方法,微服務,結束時返回的資料等),當存取出現問題時用於參考,方便追蹤到問題。


例如一個請求需要經過幾個微服務再回傳輸出

請求->A->B->C-A->輸出

如果存取程序沒有輸出,或輸出錯誤,我們可以根據RequestID找到A,B,C對應的日誌,檢查是哪個服務出現問題。

程式碼如下:

RequestID.class.php

<?php/**
 * PHP生成唯一RequestID类
 * Date:    2018-04-10
 * Author:  fdipzone
 * Version: 1.0
 *
 * Description:
 * PHP实现生成唯一RequestID类,使用session_create_id()与uniqid()方法实现,保证唯一性。
 *
 * Func:
 * public  generate 生成唯一请求id
 * private format   格式化请求id
 */class RequestID{ // class start

    /**
     * 生成唯一请求id
     * @return String
     */
    public static function generate(){

        // 使用session_create_id()方法创建前缀
        $prefix = session_create_id(date(&#39;YmdHis&#39;));        // 使用uniqid()方法创建唯一id
        $request_id = strtoupper(md5(uniqid($prefix, true)));        // 格式化请求id
        return self::format($request_id);

    }    /**
     * 格式化请求id
     * @param  String $request_id 请求id
     * @param  Array  $format     格式
     * @return String
     */
    private static function format($request_id, $format=&#39;8,4,4,4,12&#39;){

        $tmp = array();        $offset = 0;        $cut = explode(&#39;,&#39;, $format);        // 根据设定格式化
        if($cut){            foreach($cut as $v){                $tmp[] = substr($request_id, $offset, $v);                $offset += $v;
            }
        }        // 加入剩余部分
        if($offset<strlen($request_id)){            $tmp[] = substr($request_id, $offset);
        }        return implode(&#39;-&#39;, $tmp);

    }

} // class end?>

demo:

<?phprequire &#39;RequestID.class.php&#39;;// 生成10个请求idfor($i=0; $i<10; $i++){    echo RequestID::generate().PHP_EOL;
}?>

輸出:

16532925-4502-CDAD-23A2-463FC7B5803A500B77AD-CD24-0DDA-9E6E-2FDF2DD7CA94813143D0-958F-9F56-E04F-679598594452E5EE1B0B-E0D6-3E60-D831-462C5A262FCE79E714B5-A37F-4B5E-4EDE-83E18391EBF9
E1C440AB-FC2C-AC74-E79A-016FD59D9651
AE483861-1040-BE8D-E523-D7638D0F0D35BBD7A03A-36C9-24B7-C453-FB1DDD6E201EBF62C3E6-9C5F-22CB-668D-381863B35268
E97E1F44-F048-962A-5BF7-1113727551B1

 
注意session_create_id方法需要php7.1 以上的版本才可使用。

關於session_create_id方法可參考官網說明:
http://php.net/manual/zh/function.session-create-id.php


#原始碼下載位址:點選查看

本文介紹PHP產生唯一RequestID類,使用session_create_id()uniqid()方法,確保唯一性,提供完整程式碼及演示,方便大家學習使用。

現在的系統設計一般使用分散式系統,一個請求可能要呼叫幾個微服務處理,最後再把結果回傳。當請求出現問題時,我們很難追蹤是哪個微服務出現問題。

每個請求存取伺服器時,我們可以給這個存取加入一個唯一識別(RequestID),在請求開始,請求過程中,及請求結束時,把這個請求流程關鍵的資料寫入日誌(例如存取時的參數,經過那些方法,微服務,結束時返回的資料等),當存取出現問題時用於參考,方便追蹤到問題。


例如一個請求需要經過幾個微服務再回傳輸出

請求->A->B->C-A->輸出

如果存取程序沒有輸出,或輸出錯誤,我們可以根據RequestID找到A,B,C對應的日誌,檢查是哪個服務出現問題。

程式碼如下:

RequestID.class.php

<?php/**
 * PHP生成唯一RequestID类
 * Date:    2018-04-10
 * Author:  fdipzone
 * Version: 1.0
 *
 * Description:
 * PHP实现生成唯一RequestID类,使用session_create_id()与uniqid()方法实现,保证唯一性。
 *
 * Func:
 * public  generate 生成唯一请求id
 * private format   格式化请求id
 */class RequestID{ // class start

    /**
     * 生成唯一请求id
     * @return String
     */
    public static function generate(){

        // 使用session_create_id()方法创建前缀
        $prefix = session_create_id(date(&#39;YmdHis&#39;));        // 使用uniqid()方法创建唯一id
        $request_id = strtoupper(md5(uniqid($prefix, true)));        // 格式化请求id
        return self::format($request_id);

    }    /**
     * 格式化请求id
     * @param  String $request_id 请求id
     * @param  Array  $format     格式
     * @return String
     */
    private static function format($request_id, $format=&#39;8,4,4,4,12&#39;){

        $tmp = array();        $offset = 0;        $cut = explode(&#39;,&#39;, $format);        // 根据设定格式化
        if($cut){            foreach($cut as $v){                $tmp[] = substr($request_id, $offset, $v);                $offset += $v;
            }
        }        // 加入剩余部分
        if($offset<strlen($request_id)){            $tmp[] = substr($request_id, $offset);
        }        return implode(&#39;-&#39;, $tmp);

    }

} // class end?>

demo:

<?phprequire &#39;RequestID.class.php&#39;;// 生成10个请求idfor($i=0; $i<10; $i++){    echo RequestID::generate().PHP_EOL;
}?>

輸出:

16532925-4502-CDAD-23A2-463FC7B5803A500B77AD-CD24-0DDA-9E6E-2FDF2DD7CA94813143D0-958F-9F56-E04F-679598594452E5EE1B0B-E0D6-3E60-D831-462C5A262FCE79E714B5-A37F-4B5E-4EDE-83E18391EBF9
E1C440AB-FC2C-AC74-E79A-016FD59D9651
AE483861-1040-BE8D-E523-D7638D0F0D35BBD7A03A-36C9-24B7-C453-FB1DDD6E201EBF62C3E6-9C5F-22CB-668D-381863B35268
E97E1F44-F048-962A-5BF7-1113727551B1

 
注意session_create_id方法需要php7.1 以上的版本才可使用。

關於session_create_id方法可參考官網說明:
http://php.net/manual/zh/function.session-create-id.php


#原始碼下載位址:點擊查看

相關推薦:

#PHP產生具有可讀性的隨機字串

#

以上是PHP產生唯一RequestID類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:php基礎之數組下一篇:php基礎之數組