当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-05 14:06:38 浏览: 评论:0 

这篇文章主要介绍了PHP实现的生成唯一RequestID类,结合完整实例形式分析了php唯一标识符生成、session操作等相关实现与使用技巧,需要的朋友可以参考下。

本文实例讲述了PHP实现的生成唯一RequestID类,分享给大家供大家参考,具体如下:

这里介绍PHP生成唯一RequestID类,使用session_create_id()与uniqid()方法,保证唯一性,提供完整代码及演示,方便大家学习使用。

现在的系统设计一般使用分布式系统,一个请求可能要调用几个微服务处理,最后再把结果返回。当请求出现问题时,我们很难去跟踪是哪个微服务出现问题。

每个请求访问服务器时,我们可以给这个访问加入一个唯一标识(RequestID),在请求开始,请求过程中,及请求结束时,把这个请求流程关键的数据写入日志(例如访问时的参数,经过那些方法,微服务,结束时返回的数据等),当访问出现问题时用于参考,方便追踪到问题。

例如一个请求需要经过几个微服务再返回输出

请求->A->B->C-A->输出

如果访问过程没有输出,或输出错误,我们可以根据RequestID找到A,B,C对应的日志,检查是哪个服务出现问题。

代码如下:

RequestID.class.php

  1. <?php 
  2. /** 
  3.  * PHP生成唯一RequestID类 
  4.  * Date: 2018-04-10 
  5.  * Author: fdipzone 
  6.  * Version: 1.0 
  7.  * 
  8.  * Description: 
  9.  * PHP实现生成唯一RequestID类,使用session_create_id()与uniqid()方法实现,保证唯一性。 
  10.  * 
  11.  * Func: 
  12.  * public generate 生成唯一请求id 
  13.  * private format 格式化请求id 
  14.  */ 
  15. class RequestID{ // class start 
  16.  /** 
  17.   * 生成唯一请求id 
  18.   * @return String 
  19.   */ 
  20.  public static function generate(){ 
  21.   // 使用session_create_id()方法创建前缀 
  22.   $prefix = session_create_id(date('YmdHis')); 
  23.   // 使用uniqid()方法创建唯一id 
  24.   $request_id = strtoupper(md5(uniqid($prefix, true))); 
  25.   // 格式化请求id 
  26.   return self::format($request_id); 
  27.  } 
  28.  /** 
  29.   * 格式化请求id 
  30.   * @param String $request_id 请求id 
  31.   * @param Array $format  格式 
  32.   * @return String 
  33.   */ 
  34.  private static function format($request_id$format='8,4,4,4,12'){ 
  35.   $tmp = array(); 
  36.   $offset = 0; 
  37.   $cut = explode(','$format); 
  38.   // 根据设定格式化 
  39.   if($cut){ 
  40.    foreach($cut as $v){ 
  41.     $tmp[] = substr($request_id$offset$v); 
  42.     $offset += $v
  43.    } 
  44.   } 
  45.   // 加入剩余部分 
  46.   if($offset<strlen($request_id)){ 
  47.    $tmp[] = substr($request_id$offset); 
  48.   } 
  49.   return implode('-'$tmp); 
  50.  } 
  51. // class end 
  52. ?> 

demo:

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

输出:

  1. 16532925-4502-CDAD-23A2-463FC7B5803A 
  2. 500B77AD-CD24-0DDA-9E6E-2FDF2DD7CA94 
  3. 813143D0-958F-9F56-E04F-679598594452 
  4. E5EE1B0B-E0D6-3E60-D831-462C5A262FCE 
  5. 79E714B5-A37F-4B5E-4EDE-83E18391EBF9 
  6. E1C440AB-FC2C-AC74-E79A-016FD59D9651 
  7. AE483861-1040-BE8D-E523-D7638D0F0D35 
  8. BBD7A03A-36C9-24B7-C453-FB1DDD6E201E 
  9. BF62C3E6-9C5F-22CB-668D-381863B35268 
  10. E97E1F44-F048-962A-5BF7-1113727551B1 

注意session_create_id方法需要php7.1以上的版本才可使用

Tags: PHP生成唯一 RequestID

分享到: