不能通過全域性變數儲存狀態

2021-10-23 22:22:39 字數 1006 閱讀 1157

在 swoole 的持久化應用下,乙個 worker 內的全域性變數是 worker 內共享的,而從協程的介紹我們可以知道同乙個 worker 內還會存在多個協程並存在協程切換,也就意味著乙個 worker 會在乙個時間週期內同時處理多個協程(或直接理解為請求)的**,也就意味著如果使用了全域性變數來儲存狀態可能會被多個協程所使用,也就是說不同的請求之間可能會混淆資料,這裡的全域性變數指的是 get

/_get/

g​et

/_post/req

uest

/_request/

r​eque

st/_session/coo

kie/

_cookie/

c​ooki

e/_server等$_開頭的變數、global 變數,以及 static 靜態屬性。

那麼當我們需要使用到這些特性時應該怎麼辦?

對於全域性變數,均是跟隨著乙個 請求(request) 而產生的,而 hyperf 的 請求(request)/響應(response) 是由 hyperf/http-message 通過實現 psr-7 處理的,故所有的全域性變數均可以在 請求(request) 物件中得到相關的值;

對於 global 變數和 static 變數,在 php-fpm 模式下,本質都是存活於乙個請求生命週期內的,而在 hyperf 內因為是 cli 應用,會存在 全域性週期 和 請求週期(協程週期) 兩種長生命週期。

全域性週期,我們只需要建立乙個靜態變數供全域性呼叫即可,靜態變數意味著在服務啟動後,任意協程和**邏輯均共享此靜態變數內的資料,也就意味著存放的資料不能是特別服務於某乙個請求或某乙個協程;

協程週期,由於 hyperf 會為每個請求自動建立乙個協程來處理,那麼乙個協程週期在此也可以理解為乙個請求週期,在協程內,所有的狀態資料均應存放於 hyperf\utils\context 類中,通過該類的 get、set 來讀取和儲存任意結構的資料,這個 context(協程上下文) 類在執行任意協程時讀取或儲存的資料都是僅限對應的協程的,同時在協程結束時也會自動銷毀相關的上下文資料。

全域性變數不能放在標頭檔案其中

看網上各種說法說 變數的宣告和變數的定義,可是還是沒有講清楚什麼是宣告什麼是定義,假設說定義要分配記憶體。宣告不分配。這個誰都知道。剛我在vs2012中測試。按理說 int i。僅僅是宣告吧 可是我在乙個標頭檔案其中宣告 int i 然後兩個cpp檔案都呼叫這個.c檔案,出現了重定義錯誤。我改為 i...

Python 多程序預設不能共享全域性變數

主程序與子程序是併發執行的,程序之間預設是不能共享全域性變數的 子程序不能改變主程序中全域性變數的值 如果要共享全域性變數需要用 multiprocessing.value d 10.0 數值 multiprocessing.array i 1,2,3,4,5 陣列 multiprocessing....

Python 多程序預設不能共享全域性變數

主程序與子程序是併發執行的,程序之間預設是不能共享全域性變數的 子程序不能改變主程序中全域性變數的值 如果要共享全域性變數需要用 multiprocessing.value d 10.0 數值 multiprocessing.array i 1,2,3,4,5 陣列 multiprocessing....