我想在服务提供者中生成唯一的请求ID,请问这么写有问题吗?

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        define('REQUIRED_ID', (string) \Illuminate\Support\Str::uuid());
    }
}
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 18

没什么问题吧,有跨应用的需要吗,有就做一下 “承上启下”

2年前 评论
勇敢的心 (楼主) 2年前

如果用 octane 的話 就有問題

2年前 评论
勇敢的心 (楼主) 2年前

这个不应该是前端请求的时候放在请求头里面吗

2年前 评论
勇敢的心 (楼主) 2年前

这个写日志官方不是给了你很好的示例吗 日志《Laravel 10 中文文档》

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\Response;

class AssignRequestId
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $requestId = (string) Str::uuid();

        Log::withContext([
            'request-id' => $requestId
        ]);

        return $next($request)->header('Request-Id', $requestId);
    }
}
2年前 评论
勇敢的心 (楼主) 2年前
sanders

和楼主不同,我们除了定时脚本都是常驻内存的,所以单独进行了封装,并通过监听器和基类方法重写的方式将数据存到各个地方,以便于跟踪。

代码已被折叠,点此展开

以上代码会根据 handle () 方法的调用将跟踪上下文混合到日志数据中去。

为了解决诸如请求出发队列这种问题,我们还将重写了 Illuminate\Queue\SerializesModels 的 __serialize () 方法 和 __unserialize () 方法,用来在队列中额外传递跟踪数据。

2年前 评论
勇敢的心 (楼主) 2年前

其实就是 trace id 的概念;不是强依赖唯一性,偶尔重复问题应该也不大;uuid 、雪花算法、 php 自带的 uniqid; 我觉得都没问题;

不过在 service provider 里设置 trace id 的地方是有待争议的;准确的来讲 trace id 是跟随 request 产生的,你应该写在 index.php 里设置成 request 的属性


if (!$request->headers->has('X-TRACE-ID')) {
    $request->headers->set('X-TRACE-ID', genTraceId());
}

或者写一个 event listener, 监听 request 事件;在监听者里写上述代码;

2年前 评论
FatTiger 2年前
CodingHePing

只要不常驻内存就没毛病

2年前 评论

如果是在我前几年经常加班的时候,这么写我是认为毫无问题的,因为代码能跑就好了。

现在我不会这样写了,define 是定义常量,在计算机科学中常量意味着是不会改变的量。例如周二的数字形态是 2 ,我会这样写。

            const Tuesday = 2;//or define(Tuesday,2);

我觉得不妥,是因为这是编码的基础。这里不是说在 laravel 中在 php 中这样使用不妥,而是编码不应该这样,尽管基于 fpm 架构下可以这样写。

但如果用常量来表示变量的写法让你获得了某些收益,也不是未尝不可。

2年前 评论
勇敢的心 (楼主) 2年前

应该在中间件中做,不应该在服务提供者中做,服务提供者是用来注册服务的

2年前 评论
勇敢的心 (楼主) 2年前