當前位置:首頁 » 編程語言 » php觸發事件

php觸發事件

發布時間: 2023-09-21 13:26:14

A. PHP FPM源代碼反芻品味之四:事件處理

FPM master 進程啟動後,會鉛知進入函數fpm_event_loop,無限循環.
處理事件.

master 進程所做的的事,總的來碰激沖說就是兩類:

簡稱timer事件,需按時運行,主要有3個:

簡稱fd事件,需從文件句柄(file descriptor)讀取到指令後,依指令運行.
重復一下,unix 下一切IO, 皆文件,socket ,socketpair,pipe 都返迴文件句笑殲柄(fd) 用於通信.
主要的fd有:

對於timer事件,多個事件在事件軸上是依次排列的,只需反復檢查,到時運行.
對於fd事件,需監聽多個fd,需用到我們第二篇講的IO多路復用技術.

如果滿足事件條件,則處理事件內容.

FPM設計上,兩類事件使用同一個結構,並且事件觸發條件和事件處理邏輯放到同一個事件對象里(C語言對象就是結構體).
舉個例子, 打鈴下課,打鈴是觸發條件,下課是事件內容,兩個同時放到一個事件對象 ,這是一個很好的設計.

fd值: -1
flags值:FPM_EV_PERSIST
which值: FPM_EV_TIMEOUT

fd值: 獲取觸發指令的文件fd
flags值: FPM_EV_EDGE(fd事件底層的邊緣觸發標志,需系統支持)
which值: FPM_EV_READ

兩類事件分別放在兩個事件隊列
static struct fpm_event_queue_s *fpm_event_queue_timer = NULL;
static struct fpm_event_queue_s *fpm_event_queue_fd = NULL;

事件隊列的結構很常見,雙向隊列:
typedef struct fpm_event_queue_s {
struct fpm_event_queue_s *prev;
struct fpm_event_queue_s *next;
struct fpm_event_s *ev;
} fpm_event_queue;

4移除事件 (fpm_event_del -> fpm_event_queue_del)
簡單的出列操作:
static int fpm_event_queue_del(struct fpm_event_queue_s **queue, struct fpm_event_s *ev)
對於fd事件,需在底層事件輪詢機制里移除(如:epoll)

5,運行事件回調函數:

6, 底層事件輪詢模塊結構

不同的操作系統,支持不同的IO事件機制,linux 支持epoll,
windows支持select, freebsd 支持kqueue,這個結構統一操作介面
在函數fpm_event_init_main里 調用mole->init初始化
fpm 里對應的配置

master進程在fpm_event_loop函數里無限循環,處理定時任務和fd事件.
期間會在mole->wait阻塞片刻,對於epoll機制,就是epoll_wait.

熱點內容
生物安全櫃配置哪些葯品 發布:2025-02-01 23:37:19 瀏覽:422
光遇安卓畫質為什麼沒有ios好 發布:2025-02-01 23:33:33 瀏覽:844
免費網店系統源碼 發布:2025-02-01 23:24:05 瀏覽:310
壓縮不原圖 發布:2025-02-01 23:23:30 瀏覽:923
安卓手機數字怎麼變成紅色 發布:2025-02-01 22:50:20 瀏覽:407
康佳29寸電視存儲器壞怎麼代換 發布:2025-02-01 22:40:44 瀏覽:190
訪問的結果 發布:2025-02-01 22:30:12 瀏覽:178
cmd訪問網站 發布:2025-02-01 22:02:45 瀏覽:443
清除svn緩存 發布:2025-02-01 22:01:04 瀏覽:948
安卓模擬器怎麼用鍵盤操作 發布:2025-02-01 21:55:24 瀏覽:811