• 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# 操作ACCESS数据库
    装饰模式(Decorator Pattern)
    桥接模式(Bridge Pattern)
    单件模式(Singleton Pattern)
    横竖不能重复的9个数,,,,,
    C#操作Access数据库的例子
    组合模式(Composite Pattern)
    建造者模式(Builder Pattern)
    工厂方法模式(Factory Method)
    外观模式(Façade Pattern)
  • 原文地址:https://www.cnblogs.com/rxbook/p/9168531.html
Copyright © 2020-2023  润新知