PHP Conference Japan 2024

Ev 類別

(PECL ev >= 0.2.0)

簡介

Ev 是一個靜態類別,提供對預設迴圈和一些常用操作的存取。

類別綱要

final class Ev {
/* 常數 */
const int FLAG_AUTO = 0;
const int FLAG_NOENV = 16777216;
const int FLAG_FORKCHECK = 33554432;
const int FLAG_NOINOTIFY = 1048576;
const int FLAG_SIGNALFD = 2097152;
const int FLAG_NOSIGMASK = 4194304;
const int RUN_NOWAIT = 1;
const int RUN_ONCE = 2;
const int BREAK_CANCEL = 0;
const int BREAK_ONE = 1;
const int BREAK_ALL = 2;
const int MINPRI = -2;
const int MAXPRI = 2;
const int READ = 1;
const int WRITE = 2;
const int TIMER = 256;
const int PERIODIC = 512;
const int SIGNAL = 1024;
const int CHILD = 2048;
const int STAT = 4096;
const int IDLE = 8192;
const int PREPARE = 16384;
const int CHECK = 32768;
const int EMBED = 65536;
const int CUSTOM = 16777216;
const int ERROR = 2147483648;
const int BACKEND_SELECT = 1;
const int BACKEND_POLL = 2;
const int BACKEND_EPOLL = 4;
const int BACKEND_KQUEUE = 8;
const int BACKEND_DEVPOLL = 16;
const int BACKEND_PORT = 32;
const int BACKEND_ALL = 63;
const int BACKEND_MASK = 65535;
/* 方法 */
final public static backend(): int
final public static depth(): int
final public static embeddableBackends(): int
final public static feedSignal( int $signum ): void
final public static feedSignalEvent( int $signum ): void
final public static iteration(): int
final public static now(): float
final public static nowUpdate(): void
final public static recommendedBackends(): int
final public static resume(): void
final public static run( int $flags = ?): void
final public static sleep( float $seconds ): void
final public static stop( int $how = ?): void
final public static supportedBackends(): int
final public static suspend(): void
final public static time(): float
final public static verify(): void
}

預定義常數

傳遞給建立迴圈的旗標

Ev::FLAG_AUTO

預設的旗標值

Ev::FLAG_NOENV

如果使用此旗標(或程式以 setuid 或 setgid 方式執行),libev 將不會查看環境變數 LIBEV_FLAGS。否則(預設情況下),如果找到 LIBEV_FLAGS,它將完全覆蓋旗標。對於效能測試和搜尋錯誤很有用。

Ev::FLAG_FORKCHECK

使 libev 在每次迭代中檢查 fork,而不是手動呼叫 EvLoop::fork()。這會透過在迴圈的每次迭代中呼叫 getpid() 來運作,因此這可能會在迴圈迭代次數很多時減慢事件迴圈的速度,但通常不會被注意到。此旗標設定無法在 LIBEV_FLAGS 環境變數中覆蓋或指定。

Ev::FLAG_NOINOTIFY

當指定此旗標時,libev 將不會嘗試對其 » ev_stat 監視器使用 inotify API。此旗標對於保留 inotify 檔案描述器很有用,因為否則每個使用 ev_stat 監視器的迴圈都會消耗一個 inotify 控制代碼。

Ev::FLAG_SIGNALFD

當指定此旗標時,libev 將嘗試對其 » ev_signal (和 » ev_child ) 監視器使用 signalfd API。此 API 同步傳遞訊號,這使其速度更快,並可能取得佇列的訊號資料。它還可以簡化使用執行緒的訊號處理,只要訊號在執行緒中被正確地封鎖。Signalfd 預設不會使用。

Ev::FLAG_NOSIGMASK

當指定此旗標時,libev 將避免修改訊號遮罩。具體來說,這表示必須確保在接收訊號之前解除封鎖訊號。

此行為對於自訂訊號處理或僅在特定執行緒中處理訊號很有用。

傳遞給 Ev::run()EvLoop::run() 的旗標

Ev::RUN_NOWAIT

表示事件迴圈將尋找新的事件,將處理這些事件和任何已未處理的事件,但如果沒有事件,則不會等待並封鎖進程,並在迴圈的一次迭代後返回。這有時在進行長時間計算時對於輪詢和處理新事件很有用,以保持程式的響應能力。

Ev::RUN_ONCE

表示事件迴圈將尋找新的事件(如有必要,會等待),並將處理這些事件和任何已未處理的事件。它將封鎖進程,直到至少有一個新事件到達(這可能是 libev 本身內部的事件,因此無法保證將呼叫使用者註冊的回呼),並在迴圈的一次迭代後返回。

傳遞給 Ev::stop()EvLoop::stop() 的旗標

Ev::BREAK_CANCEL

取消中斷操作。

Ev::BREAK_ONE

使最內層的 Ev::run()(或 EvLoop::run())呼叫返回。

Ev::BREAK_ALL

使所有巢狀的 Ev::run()(或 EvLoop::run())呼叫返回。

監視器優先順序

Ev::MINPRI

允許的最小監視器優先順序。

Ev::MAXPRI

允許的最大監視器優先順序。

(已接收)事件的位元遮罩

Ev::READ

EvIo 監視器中的檔案描述器已變成可讀取。

Ev::WRITE

EvIo 監視器中的檔案描述器已變成可寫入。

Ev::TIMER

EvTimer 監視器已逾時。

Ev::PERIODIC

EvPeriodic 監視器已逾時。

Ev::SIGNAL

已收到 EvSignal::__construct() 中指定的訊號。

Ev::CHILD

EvChild::__construct() 中指定的 pid 已接收到狀態變更。

Ev::STAT

EvStat 監視器中指定的路徑已變更其屬性。

Ev::IDLE

當沒有其他監視器要執行時,EvIdle 監視器會運作。

Ev::PREPARE

Ev::run() 開始之前,會先呼叫所有 EvPrepare 監視器。因此,EvPrepare 監視器是在事件迴圈睡眠或輪詢新事件之前最後呼叫的監視器。

Ev::CHECK

Ev::run() 收集新事件之後,但在為任何接收到的事件將任何回呼排入佇列之前,會立即將所有 EvCheck 監視器排入佇列。因此,EvCheck 監視器將在事件迴圈迭代中的任何相同或較低優先順序的其他監視器之前呼叫。

Ev::EMBED

EvEmbed 監視器中指定的嵌入式事件迴圈需要注意。

Ev::CUSTOM

libev 本身永遠不會傳送(或以其他方式使用),但 libev 使用者可以自由使用它來發出監視器訊號(例如,透過 EvWatcher::feed())。

Ev::ERROR

發生未指定的錯誤,監視器已停止。這可能是因為監視器無法正確啟動,因為 libev 記憶體不足,發現檔案描述器已關閉或任何其他問題。Libev 認為這些是應用程式錯誤。另請參閱 » 監視器內容的結構

後端旗標

Ev::BACKEND_SELECT

select(2) 後端

Ev::BACKEND_POLL

poll(2) 後端

Ev::BACKEND_EPOLL

Linux 特定的 epoll(7) 後端,適用於 2.6.9 前後的核心

Ev::BACKEND_KQUEUE

在大多數 BSD 系統上使用的 kqueue 後端。EvEmbed 監視器可用於將一個迴圈(具有 kqueue 後端)嵌入到另一個迴圈中。例如,可以嘗試建立一個具有 kqueue 後端的事件迴圈,並僅將其用於 socket。

Ev::BACKEND_DEVPOLL

Solaris 8 後端。這尚未實作。

Ev::BACKEND_PORT

Solaris 10 事件埠機制,具有良好的擴充性。

Ev::BACKEND_ALL

嘗試所有後端(即使是損壞的)。不建議明確使用它。此處應應用位元運算子(例如,Ev::BACKEND_ALL & ~ Ev::BACKEND_KQUEUE)。請使用 Ev::recommendedBackends(),或者完全不指定任何後端。

Ev::BACKEND_MASK

不是後端,而是從 flags 值中選取所有後端位元的遮罩,以遮罩任何後端(例如,在修改 LIBEV_FLAGS 環境變數時)。

注意:

對於模組初始化階段的預設迴圈,Ev 透過 pthread_atfork (如果可用) 註冊 » ev_loop_fork 呼叫。

注意:

有方法可在 Ev 類別中存取預設事件迴圈(例如 Ev::iteration()Ev::depth() 等)。對於自訂迴圈(使用 EvLoop::__construct() 建立),這些值可透過 EvLoop 類別的對應屬性和方法存取。

預設事件迴圈的實例本身可透過 EvLoop::defaultLoop() 方法擷取。

目錄

新增筆記

使用者貢獻的筆記

此頁面尚無使用者貢獻的筆記。
To Top