本文介绍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)));// 格式化请求idreturn 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

源码下载地址:点击查看

PHP生成唯一RequestID类相关推荐

  1. 生成唯一订单号 工具类

    package com.jsy.basic.util.utils;import java.text.SimpleDateFormat; import java.util.Date;/*** @prog ...

  2. java读取ES配置生成ES管理类,获取ES连接

    java读取ES配置生成ES管理类,获取ES连接 1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询, ...

  3. java 有序列表_关于算法:在Java中为列表列表生成唯一的有序非重复组合

    我知道有很多类似的问题,并且已经阅读了几个小时.但是它们似乎都不符合我的要求. 我有列表列表(list >),列表可以是任何大小. 例: 我的外部列表大小是:4 清单内容 1. list(0) ...

  4. php 自增,php 根据自增id创建唯一编号类

    在开发过程中,我们数据表一般都使用自增数字作为id主键,而id是数字型,不容易理解.我们把id按一定格式转为编号后,很容易根据编号知道代表的是什么内容. 例如订单表id=201601111976812 ...

  5. java生成唯一有序序列号_分布式唯一 ID 之 Snowflake 算法

    SegmentFault 社区专栏:全栈修仙之路作者:semlinker No.1 Snowflake 简介 1.1 什么是 Snowflake Snowflake is a service used ...

  6. 小程序使用sass_如何使用Sass Maps生成所有实用程序类

    小程序使用sass by Sarah Dayan 通过莎拉·达扬 如何使用Sass Maps生成所有实用程序类 (How to generate all your utility classes wi ...

  7. 为ASP.NET 2.0网站生成唯一程序集

    在Visual Studio 2003下开发网站的都知道ASP.NET 1.1网站生成后都是一个唯一命名的程序集(项目名称.DLL),但是这种情况在Visual Studio 2005的网站开发中不见 ...

  8. java如何用雪花算法批量生成唯一编码(保证位数不过长)?

    最近有点忙,现在稍微闲一些,就想写写最近遇到的一些业务. 业务:一些商户.市场.档口等主体需要有唯一编码. 思路:一些前缀+雪花算法,此时位数过多,再转成六十四进制缩短位数即可.同时为了实现批量生成唯 ...

  9. java 获得唯一 数字_java生成唯一数字

    java生成唯一数字 用UUID类生成唯一标识的时候,会生成一个十六进制的整数,但是不能作为数据库long型字段的唯一标识,用下面的办法可以实现数据库long型标识的生成: public class ...

最新文章

  1. 6. 函数参数 与 展开运算符
  2. vsftp中配置默认目录
  3. openSUSE-openOffice无法输入中文
  4. nGQL知识点总结-20210719
  5. Spring mvc HandlerMapping 实现机制
  6. StarUML启动报RPC服务器不可用错误
  7. MySQL服务的启动和停止
  8. android 为什么fragment在调用hide方法后没有生效_Android 多 Fragment 切换优化
  9. PAT 乙级 1023. 组个最小数 (20) Java版
  10. .pem和.pk8是什么文件?(转载)
  11. 我用Java框架Guava解决了空指针异常问题
  12. python 彩票图表下载_python彩票
  13. 网络安全面试常见问题
  14. python选取tensor某一维_超简单!pytorch入门教程(一):Tensor
  15. 3310复刻版 java_诺基亚3310复刻版评测:经典回归 情怀满满
  16. DevOps落地实践及案例分享
  17. 测试大咖漫谈测试人职业发展
  18. 2021_WWW_Self-Supervised Multi-Channel Hypergraph Convolutional Network for Social Recommendation
  19. CentOS7下安装CDH,clouderamanager,hadoop
  20. window系统下nodejs安装及环境配置

热门文章

  1. java循环队列入队出队算法_循环队列实现
  2. 豆瓣前250个电影的相关分析
  3. seo要学什么东西?
  4. 设一棵树T的度为4,其中度为1,2,3,4的结点个数分别为4,2,1,1。则T中的叶子结点为
  5. 大数据哪个省才是高考地狱_是一名数据科学家,确实是地狱附近最性感的工作...
  6. 《Linux From Scratch》第三部分:构建LFS系统 第七章:基本系统配置- 7.9. 创建 /etc/shells 文件...
  7. java交易撮合怎么实现_「康力电梯002367」“股票实时交易系统如何实现高并发撮合交易?最好有java架构“java 股票分析工具-京东方a小-seo金融...
  8. python采集链家二手房信息
  9. CentOS 6.4使用Nginx配置文件服务器
  10. [CTFHub] 2021-第四届红帽杯网络安全大赛-Web-find_it