php教程

超轻量级php框架startmvc

PHP实现的生成唯一RequestID类完整示例

更新时间:2020-03-28 19:47:21 作者:startmvc
本文实例讲述了PHP实现的生成唯一RequestID类。分享给大家供大家参考,具体如下:这里介绍

本文实例讲述了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('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
?>

demo:


<?php
require 'RequestID.class.php';
// 生成10个请求id
for($i=0; $i<10; $i++){
 echo RequestID::generate().PHP_EOL;
}
?>

输出:

16532925-4502-CDAD-23A2-463FC7B5803A 500B77AD-CD24-0DDA-9E6E-2FDF2DD7CA94 813143D0-958F-9F56-E04F-679598594452 E5EE1B0B-E0D6-3E60-D831-462C5A262FCE 79E714B5-A37F-4B5E-4EDE-83E18391EBF9 E1C440AB-FC2C-AC74-E79A-016FD59D9651 AE483861-1040-BE8D-E523-D7638D0F0D35 BBD7A03A-36C9-24B7-C453-FB1DDD6E201E BF62C3E6-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

源码下载地址:点击此处本站下载

PS:这里再为大家提供两款相关在线工具供大家参考使用:

在线随机数字/字符串生成工具: http://tools.jb51.net/aideddesign/suijishu

在线随机字符/随机密码生成工具: http://tools.jb51.net/aideddesign/rnd_password

在线随机数生成工具: http://tools.jb51.net/aideddesign/rnd_num

在线随机数/随机密码批量生成工具: http://tools.jb51.net/aideddesign/rnd_pwd_tool

PHP 生成 唯一 RequestID类