查詢

EvLoop::child()函式—用法及示例

「 在主事件迴圈中註冊一個子程序的事件回撥函式 」


函式名稱:EvLoop::child()

適用版本:EvLoop::child() 函式是在 Libev >= 4.0.0 版本中引入的。

用法:EvLoop::child() 函式用於在主事件迴圈中註冊一個子程序的事件回撥函式。當子程序結束或暫停時,該事件回撥函式會被觸發。

語法:

EvLoop::child ( int $pid , float $trace_flags , callable $callback [, mixed $data = NULL [, int $priority = 0 ]] ) : EvChild

引數:

  • $pid: 子程序的識別符號,可以是程序ID或0。
  • $trace_flags: 程序跟蹤標誌。
  • $callback: 子程序回撥函式,當子程序狀態發生變化時被呼叫。
  • $data: 可選引數,傳遞給子程序回撥函式的使用者資料。
  • $priority: 可選引數,指定事件處理的優先順序,預設為0。

返回值:返回一個 EvChild 物件,表示註冊的子程序事件。

示例:

$loop = new EvLoop();

// 定義子程序回撥函式
$child_callback = function($watcher, $pid, $revents) {
    if ($revents & Ev::CHILD) {
        $status = pcntl_wexitstatus($watcher->rpid); // 獲取子程序退出狀態
        echo "子程序 {$watcher->rpid} 退出,狀態碼:{$status}\n";

        // 停止子程序監視器
        $watcher->stop();
        
        // 也可在此處重新啟動新的子程序監視器
    }
};

// 註冊一個子程序事件
$pid = pcntl_fork(); // 建立子程序
if ($pid == -1) {
    die("子程序建立失敗");
} else if ($pid) { // 主程序
    // 在主事件迴圈中註冊子程序的監視器
    $child_watcher = $loop->child($pid, 0, $child_callback);
    $loop->run();
} else { // 子程序
    // 子程序的具體操作
    
    exit(); // 子程序結束
}

以上示例建立了一個子程序監視器,當子程序結束時會觸發回撥函式,回撥函式會顯示子程序的退出狀態碼。

補充糾錯
上一個函式: EvLoop::check()函式
下一個函式: EvLoop::defaultLoop()函式
熱門PHP函式
分享連結