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


源码下载地址:点击查看

好的,我可以为你提供一些指导,帮助你用 PHP 和 MySQL 来生成一个简单的图书管理系统。 首先,你需要创建一个数据库来存储图书信息。你可以使用 MySQL Workbench 来创建一个名为 `library` 的数据库,并且在该数据库中创建一个名为 `books` 的表来存储图书信息。该表应该包含以下列: - `id`:一个自增的整数,作为每本书的唯一标识符。 - `title`:文本字段,用于存储书名。 - `author`:文本字段,用于存储作者姓名。 - `publisher`:文本字段,用于存储出版社名称。 - `publication_date`:日期字段,用于存储出版日期。 - `isbn`:文本字段,用于存储 ISBN 号码。 - `price`:数字字段,用于存储书的价格。 接下来,你需要使用 PHP 来创建一个网页,让用户可以添加、编辑、删除和查看图书信息。以下是一个简单的 PHP 文件,可以实现这些功能: ```php <?php // 连接数据库 $db = new mysqli('localhost', 'username', 'password', 'library'); // 处理添加图书的请求 if ($_SERVER['REQUEST_METHOD'] == 'POST') { $title = $_POST['title']; $author = $_POST['author']; $publisher = $_POST['publisher']; $publication_date = $_POST['publication_date']; $isbn = $_POST['isbn']; $price = $_POST['price']; $query = "INSERT INTO books (title, author, publisher, publication_date, isbn, price) VALUES ('$title', '$author', '$publisher', '$publication_date', '$isbn', '$price')"; $db->query($query); } // 处理删除图书的请求 if (isset($_GET['delete'])) { $id = $_GET['delete']; $query = "DELETE FROM books WHERE id = $id"; $db->query($query); } // 查询所有图书 $query = "SELECT * FROM books"; $result = $db->query($query); // 显示所有图书 echo "<table>"; echo "<tr><th>Title</th><th>Author</th><th>Publisher</th><th>Publication Date</th><th>ISBN</th><th>Price</th><th>Action</th></tr>"; while ($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . $row['title'] . "</td>"; echo "<td>" . $row['author'] . "</td>"; echo "<td>" . $row['publisher'] . "</td>"; echo "<td>" . $row['publication_date'] . "</td>"; echo "<td>" . $row['isbn'] . "</td>"; echo "<td>" . $row['price'] . "</td>"; echo "<td><a href=\"edit.php?id=" . $row['id'] . "\">Edit</a> <a href=\"index.php?delete=" . $row['id'] . "\">Delete</a></td>"; echo "</tr>"; } echo "</table>"; // 断开数据库连接 $db->close(); ?> ``` 该 PHP 文件包含以下功能: - 连接到数据库 `library`。 - 处理添加图书的请求。 - 处理删除图书的请求。 - 查询所有图书,并将它们显示在一个 HTML 表格中。 - 断开数据库连接。 你可以将上述代码保存为 `index.php` 文件,并将其上传到你的 Web 服务器。当你访问该文件时,它应该显示一个包含所有图书信息的表格。你可以使用 HTML 表单来添加新的图书信息,并使用链接来编辑或删除图书信息。 当你点击“添加图书”按钮时,该 PHP 文件将处理你的请求,并将新的图书信息添加到数据库。当你点击“删除”链接时,该 PHP 文件将处理你的请求,并从数据库中删除相应的图书信息。 请注意,上述代码仅提供了一个简单的示例,你需要根据你的实际需求来修改它。你可能需要添加更多的字段,例如图书封面、描述等。你还需要对用户输入进行验证,以避免 SQL 注入攻击等安全问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值