關於事件的持續化
默認情況下,任何時候一個掛起的事件被激活(因為他的fd準備好了讀或者寫,或者因為他的超時過期了),它會在回調函數執行之前變為非掛起。如果你想讓事件再次掛起,你需要在回調函數內部呼叫event_add()。
如果一個事件被設定了EV_PERSIST,那麼這個事件就是持續化的,意思就是這個事件會保持掛起狀態,即使回呼函數被執行。如果你想讓它變成非掛起狀態,可以在回調函數中呼叫event_del()。
任何時候事件的回呼函數觸發都會重置持續化事件中的超時狀態。因此,如果的事件有EV_READ/EV_PERSIST並且設定了5秒超時,那麼有兩種情況會觸發這個事件:
當socket可以進行讀取的時候
當5s超時到期的時候
<?php $base = event_base_new(); $event = event_new(); event_set($event,STDIN,EV_READ | EV_PERSIST,'print_line',[$event,$base]); event_base_set($event,$base); event_add($event,5000000); event_base_loop($base); function print_line($fd, $events, $arg) { // 5秒超时会自动输出1,每次执行了read后,超时会被重置 echo 1; static $max_requests = 0; $max_requests++; if ($max_requests == 10) { // $arg[1] = $base event_base_loopexit($arg[1]); } // 打印输出 echo fgets($fd); }