国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

關(guān)于全局變量的一些疑問

dgkerry

問題描述

在webman中,在一個進程中,靜態(tài)變量、(單例)都是所有請求中共享使用,那么有沒有可以做到在僅僅在一個請求中,某個(單例)類可以在這個請求業(yè)務(wù)任意一個地方可以使用,不需要重復(fù)實例化呢(不同請求之間不能互相使用),這個類在這個請求結(jié)束后自動釋放?
舉個例子
1、目前l(fā)og類實例化后(同一個通道),在一個進程后就只有一個日志類(全局日志類),但我想在每次寫日志時都要附帶上額外的信息(本次請求的信息【包括我自定義的信息】或者用戶個人信息),要是我每次寫入的時候就加上額外信息(如:Log::info($user->username.'log test')),那我覺得有點麻煩,所以我繼承并改寫了Log類,新增一個方法可以做到每次實例化時都時一個新類,那么這個類就只為本次請求服務(wù),但問題來了,我如何可以在本次請求中任意協(xié)程、任意類中使用他呢,不需要每次都實例化一個新類,就像傳統(tǒng)web那樣的單例模式

354 4 1
4個回答

nitron

上個問題不是有說用Context么

  • dgkerry 2025-03-06

    也試過這個方法,嘗試在中間件中使用Context,然后在控制器中使用Context獲取,但發(fā)現(xiàn)不行(我用了協(xié)程的),后來在手冊的某個頁面看到$request(support\Request;)變量,就想到了把本次請求的所有全局變量都放到這里,比如$request->userlog=Log::diyChannel('log2')【我新增的方法,每次都實例化新的實例】,然后在其他地方用,其余的辦法就想不到了

胡桃

Context 可以實現(xiàn) 90% 的需求。
但是 Swoole 會復(fù)用協(xié)程,而且子協(xié)程有獨立的上下文,跟閣下的需求相去甚遠。

最簡單的辦法實手動管理上下文,讓請求跟上下文綁定,而不是上下文跟請求綁定。

$req->ctx = new Context(); // 錯

$ctx->req = new Request(); // √
  • 暫無評論
smile1

你需要重寫創(chuàng)建協(xié)程的方法, 在創(chuàng)建協(xié)程的時候 把request 的信息放到 context 里面

  • 暫無評論
超高級的稻姬

你想要把數(shù)據(jù)放在本次請求里面,實際上你的問題已經(jīng)給了你答案,就是將數(shù)據(jù)放到request對象里面即可。如何控制加載這個數(shù)據(jù)的時機,可以看一下中間件章節(jié)的文檔,如果是請求開始就需要加入就在全局中間件里面加載數(shù)據(jù),如果是用戶信息的數(shù)據(jù)應(yīng)該是在驗證token或者session的中間件里面增加數(shù)據(jù)加載邏輯

  • 暫無評論
??