本文描述了用 PHP 实现的独特类的生成。 分享给大家,供大家参考,具体如下:
这里介绍PHP生成唯一类,使用()和()方法保证唯一性,并提供完整的代码和演示供大家学习和使用。
目前的系统设计普遍采用分布式系统。 一个请求可能会调用多个微服务进行处理,最后返回结果。 当请求出现问题时,我们很难追踪到是哪个微服务出现了问题。
当每个请求访问服务器时,我们可以为访问添加唯一标识符()。 在请求开始时、请求过程中、请求结束时,将请求过程的关键数据写入日志(比如访问时的参数、之后的那些方法、微服务、返回的数据)结尾等)供出现访问问题时参考,方便问题跟踪。
例如,一个请求在返回输出之前需要经过多个微服务。
请求->A->B->CA->输出
如果访问过程中没有输出,或者输出错误,我们可以找到A、B、C对应的日志来查看是哪个服务出现了问题。
代码如下所示:
.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
演示:
<?php require 'RequestID.class.php'; // 生成10个请求id for($i=0; $i<10; $i++){ echo RequestID::generate().PHP_EOL; } ?>
输出:
-4502-CDAD-23A2-
-CD24-0DDA-9E6E-
-958F-9F56-E04F-
-E0D6-3E60-D831-
-A37F-4B5E-4EDE-
-FC2C-AC74-E79A-
-1040-BE8D-E523-
-36C9-24B7-C453-
-9C5F-22CB-668D-
-F048-962A-5BF7-
注意该方法需要使用php7.1以上版本。
方法请参考官网说明: