本文介绍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:
<?phprequire 'requestid.class.php';// 生成10个请求idfor($i=0; $i<10; $i++){ echo requestid::generate().php_eol;}?>
输出:
16532925-4502-cdad-23a2-463fc7b5803a500b77ad-cd24-0dda-9e6e-2fdf2dd7ca94813143d0-958f-9f56-e04f-679598594452e5ee1b0b-e0d6-3e60-d831-462c5a262fce79e714b5-a37f-4b5e-4ede-83e18391ebf9e1c440ab-fc2c-ac74-e79a-016fd59d9651ae483861-1040-be8d-e523-d7638d0f0d35bbd7a03a-36c9-24b7-c453-fb1ddd6e201ebf62c3e6-9c5f-22cb-668d-381863b35268e97e1f44-f048-962a-5bf7-1113727551b1
注意session_create_id方法需要php7.1以上的版本才可使用。
关于session_create_id方法可参考官网说明:
http://php.net/manual/zh/function.session-create-id.php
本文讲解了php生成唯一requestid类,更多香啊滚内容请关注。
相关推荐:
php json_encode不支持对象私有属性的解决方法
js 基础 数据类型及转换 进制 操作符
javascript中 with的用法
以上就是php生成唯一requestid类的相关内容的详细内容。