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相关内容感兴趣的读者可查看本站专题:《PHP数学运算技巧总结》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数组(Array)操作技巧大全》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • php生成随机数的三种方法

    如何用php生成1-10之间的不重复随机数? 例1,使用shuffle函数生成随机数. <?php $arr=range(1,10); shuffle($arr); foreach($arr as $values) { echo $values." "; } ?> 例2,使用array_unique函数生成随机数. <?php $arr=array(); while(count($arr)<10) { $arr[]=rand(1,10); $arr=array_

  • php 根据自增id创建唯一编号类

    在开发过程中,我们数据表一般都使用自增数字作为id主键,而id是数字型,不容易理解.我们把id按一定格式转为编号后,很容易根据编号知道代表的是什么内容. 例如订单表id=20160111197681234,只看id我们并不知道这个id是订单表的id,而转为编号O-20160111197681234,则很容易看出是订单表的记录,然后可以根据id在订单表中搜寻. 编号创建的规则 1.唯一 使用自增id生成,保证唯一性 2.尽可能短 可使用数字求余对应字母的方式处理,创建较短的编号 算法原理 1.加自

  • php GUID生成函数和类

    一.GUID简介GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性.GUID 主要用于在拥有多个节点.多台计算机的网络或系统中,分配必须具有唯一性的标识符.在 Windows 平台上,GUID 广泛应用于微软的产品中,用于标识如如注册表项.类及接口标识.数据库.系统目录等对象.GUID 的格式

  • php使用array_rand()函数从数组中随机选择一个或多个元素

    使用array_rand() 函数从数组中随机选出一个或多个元素,并返回. 复制代码 代码如下: array_rand(array,number) 参数 描述 array 必需.规定输入的数组参数. number 可选.默认是 1.规定返回多少个随机的元素. 例子: 复制代码 代码如下: <?php $a=array("a"=>"Dog","b"=>"Cat","c"=>"

  • php获取淘宝分类id示例

    复制代码 代码如下: $url = "http://list.taobao.com/browse/cat-0.htm";  $html = file_get_contents($url);  echo '<meta charset="UTF-8">';  $pattern='/\<a\s+href\=\"http\:\/\/list\.taobao\.com\/itemlist\/.*?\&cat\=([0-9]+)\"

  • PHP n个不重复的随机数生成代码

    复制代码 代码如下: <?php //range 是将1到100 列成一个数组 $numbers = range (1,100); //shuffle 将数组顺序随即打乱 shuffle ($numbers); //array_slice 取该数组中的某一段 $no=6; $result = array_slice($numbers,0,$no); for ($i=0;$i<$no;$i++){ echo $result[$i]."<br>"; } print_

  • php 无限级分类 获取顶级分类ID

    有这样一个表,id是分类的ID,name是分类名称,pid是上级分类的ID. 现在有个分类ID,程序要找到它上级的上级的上级--分类的ID,简单说就是找出顶级分类的ID. 比如"新鲜水果"的ID是13,对应父类ID是5,而5的父ID是1,1没有父类,也就是顶级分类了. 以前年轻气盛不懂事,总想着用递归来查找,然后再将结果缓存来解决性能问题. 后来又试过将整个表缓存起来,再递归查找. 再后来--似乎比较少有机会遇到无限级分类-- 最近有个同事问我怎么"优雅"的解决这个

  • PHP生成不重复随机数的方法汇总

    无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下. 方法一: 复制代码 代码如下: <?php $numbers = range (1,50); //shuffle 将数组顺序随即打乱 shuffle ($numbers); //array_slice 取该数组中的某一段 $num=6; $result = array_slice($numbers,0,$n

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

    本文实例讲述了PHP实现的生成唯一RequestID类.分享给大家供大家参考,具体如下: 这里介绍PHP生成唯一RequestID类,使用session_create_id()与uniqid()方法,保证唯一性,提供完整代码及演示,方便大家学习使用. 现在的系统设计一般使用分布式系统,一个请求可能要调用几个微服务处理,最后再把结果返回.当请求出现问题时,我们很难去跟踪是哪个微服务出现问题. 每个请求访问服务器时,我们可以给这个访问加入一个唯一标识(RequestID),在请求开始,请求过程中,及

  • Java中生成唯一ID的方法示例

    有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID. UUID 从Java 5开始, UUID 类提供了一种生成唯一ID的简单方法.UUID是通用唯一识别码 (Universally Unique Identifier)的缩写,UUID来源于OSF(Open Software Foundation,开源软件基金会)的DCE(Distributed Computing Environment,分布式计算环境)规范.UU

  • Android开发之Activity管理工具类完整示例

    本文实例讲述了Android开发之Activity管理工具类.分享给大家供大家参考,具体如下: 这个工具类是对Activity的一些管理,非常适用 package com.maobang.imsdk.util; import java.util.Stack; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.graphics

  • PHP实现的通过参数生成MYSQL语句类完整实例

    本文实例讲述了PHP实现的通过参数生成MYSQL语句类.分享给大家供大家参考,具体如下: 这个类可以通过指定的表和字段参数创建SELECT ,INSERT , UPDATE 和 DELETE 语句. 这个类可以创建SQL语句的WHERE条件,像LIKE的查询语句,使用LEFT JOIN和ORDER 语句 <?php /* ******************************************************************* Example file This ex

  • 使用redis生成唯一编号及原理示例详解

    在系统开发中,保证数据的唯一性是至关重要的一件事,目前开发中常用的方式有使用数据库的自增序列.UUID生成唯一编号.时间戳或者时间戳+随机数等. 在某些特定业务场景中,可能会要求我们使用特定格式的唯一编号,比如我有一张订单表(t_order),我需要生成"yewu(ORDER)+日期(yyyyMMdd)+序列号(00000000)"格式的订单编号,比如今天的日期是20200716,那我今天第一个订单号就是ORDER2020071600000001.第二个订单号就是ORDER202007

  • Python用UUID库生成唯一ID的方法示例

    UUID介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表示.它可以保证时间和空间的唯一性,也称为GUID,全称为:UUID -- Universally Unique IDentifier,Python 中叫 UUID. 它通过MAC地址.时间戳.命名空间.随机数.伪随机数来保证生成ID的唯一性. UUID主要有五个算法,也就是五种方法来实现. uuid1()--基于时间戳.由MAC地址.当前时间戳.随机数生成.可以保证全球范围内的唯一性,但MAC的使用同时带来安全性问题,局域

  • thinkPHP5框架分页样式类完整示例

    本文实例讲述了thinkPHP5分页样式类.分享给大家供大家参考,具体如下: 在配置文件中改路径 把这段代码放入extend文件下 可以在这个文件下创建个page文件 在分页的控制器方法中 ->paginate(12,false,[ 'type'=> 'page\Page','var_page'=>'page']); <?php namespace page; // +---------------------------------------------------------

  • php curl操作API接口类完整示例

    本文实例讲述了php curl操作API接口类.分享给大家供大家参考,具体如下: <?php namespace curl; /** * Created by PhpStorm. * User: Administrator * Date: 2017/6/16 * Time: 9:54 */ class ApiClient { //请求的token const token='token_str'; //请求url private $url; //请求的类型 private $requestType

  • php实现的表单验证类完整示例

    本文实例讲述了php实现的表单验证类.分享给大家供大家参考,具体如下: <?php /** * 用法 * use Validate\Validator; * * $rules = [ * ['name|名字', 'require|email|in:7,8,9|max:10|min:6|between:6,8|length:2', '名字不能为空|名字必须必须为正确的邮件地址'], * ['test|测试', 'require'], * ]; * $data = ['name' => '8gAg

  • PHP云打印类完整示例

    本文实例讲述了PHP云打印类.分享给大家供大家参考,具体如下: 一个项目需求要几百台电脑都有打印功能,本来是想用网络打印机的,后来发现没有网络打印机,就自己动手写一个打印类算了. 类实现想法是:先把要打印的数据都收集起来,在用js调用window打印函数.目前就使用于IE. 类提供打印排队功能.(PS,说白了就是一条一条读取数据) class Wprint{ //收集打印代码 private $data = array(); //处理打印代码 private $handle; public fu

随机推荐