當前位置:首頁 » 編程語言 » 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-03-09 08:54:49 瀏覽:58
火影手游競技場腳本 發布:2025-03-09 08:48:31 瀏覽:743
電腦如何訪問谷歌 發布:2025-03-09 08:39:37 瀏覽:173
安卓怎麼多開微信 發布:2025-03-09 08:34:02 瀏覽:595
怎麼看金蝶伺服器的ip地址 發布:2025-03-09 08:33:59 瀏覽:270
pyc在線反編譯 發布:2025-03-09 08:33:17 瀏覽:934
天龍極速腳本 發布:2025-03-09 08:33:09 瀏覽:977
刀劍神域伺服器維護到什麼時候 發布:2025-03-09 08:31:40 瀏覽:218
phppdf轉html 發布:2025-03-09 08:23:01 瀏覽:641
腳本按鍵怎麼循環 發布:2025-03-09 08:19:06 瀏覽:145