本文介紹PHP生成唯一RequestID類,使用session_create_id()與uniqid()方法,保證唯一性,提供完整程式碼及演示,方便大家學習使用。
現在的系統設計一般使用分散式系統,一個請求可能要呼叫幾個微服務處理,最後再把結果回傳。當請求出現問題時,我們很難追蹤是哪個微服務出現問題。
每個請求存取伺服器時,我們可以給這個存取加入一個唯一識別(RequestID),在請求開始,請求過程中,及請求結束時,把這個請求流程關鍵的資料寫入日誌(例如存取時的參數,經過那些方法,微服務,結束時返回的資料等),當存取出現問題時用於參考,方便追蹤到問題。
例如一個請求需要經過幾個微服務再回傳輸出
請求->A->B->C-A->輸出
程式碼如下: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('YmdHis')); // 使用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='8,4,4,4,12'){
$tmp = array(); $offset = 0; $cut = explode(',', $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('-', $tmp);
}
} // class end?>
<?phprequire 'RequestID.class.php';// 生成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方法可參考官網說明:
#本文講解了PHP生成唯一RequestID類,更多香啊滾內容請關注php中文網。
相關推薦:
#php json_encode不支援物件私有屬性的解決方法
以上是PHP產生唯一RequestID類別的相關內容的詳細內容。更多資訊請關注PHP中文網其他相關文章!