(PECL ev >= 0.2.0)
EvIo 觀察器會在事件迴圈的每次迭代中檢查檔案描述符(或通訊端,或可轉換為數字檔案描述符的串流)是否可讀或可寫,或者更精確地說,當讀取不會阻塞行程且寫入至少能夠寫入一些數據時。這種行為稱為*邊緣觸發*,因為只要條件持續存在,就會持續接收事件。要停止接收事件,只需停止觀察器即可。
每個 fd
的讀取和/或寫入事件觀察器的數量沒有限制。將所有檔案描述符設定為非阻塞模式通常也是一個好主意(但非必需)。
另一件需要注意的事情是,很容易收到錯誤的準備就緒通知,也就是說,回呼函式可能會以 Ev::READ
呼叫,但後續的 read() 實際上會阻塞,因為沒有資料。很容易陷入這種情況。因此,最好始終使用非阻塞 I/O:額外的 read() 返回 EAGAIN
(或類似)比程式掛起直到某些資料到達要好得多。
如果因為某些原因無法以非阻塞模式執行 fd
,則需要另外重新測試檔案描述符是否真的已準備就緒。有些人還會額外使用 SIGALRM
和一個間隔計時器,以確保不會無限期阻塞。
務必考慮使用非阻塞模式。
$fd
,$events
,$callback
,$data
= null
,$priority
= 0