zoukankan      html  css  js  c++  java
  • PHP生成唯一RequestID类

    https://blog.csdn.net/fdipzone/article/details/79939431

      

    本文介绍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 


    源码下载地址:点击查看

  • 相关阅读:
    [经验栈]C#中几种定时器(timer)的区别
    [经验栈]C#与泰克示波器(Tektronix oscilloscope)MSO64通信操作
    [经验栈]C#监测IPv4v6网速及流量
    [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
    [技术栈]C#利用Luhn算法(模10算法)对IMEI校验
    [经验栈]SQL语句逻辑运算符"AND"、"&&"兼容性
    Winform或WebForm使用ReportViewer报表设计,工具栏按钮英文显示的解决办法
    Dev 使用RibbonForm打开多标签窗体,主窗体的Text显示一个
    Devexpress如何获取RadioGroup选中项的值和显示值
    MySQL远程连接失败,MySQL远程连接出现Using password:YES错误的解决办法
  • 原文地址:https://www.cnblogs.com/rxbook/p/9168531.html
Copyright © 2011-2022 走看看