Informationen zur Ereignispersistenz
Standardmäßig wird jedes Mal, wenn ein ausstehendes Ereignis aktiviert wird (weil sein FD zum Lesen oder Schreiben bereit ist oder weil sein Zeitlimit abgelaufen ist), es in der Rückruffunktion ausgeführt. Wird nicht mehr ausstehend vor der Ausführung. Wenn Sie möchten, dass das Ereignis erneut ansteht, müssen Sie event_add() innerhalb der Callback-Funktion aufrufen.
Wenn ein Ereignis auf EV_PERSIST gesetzt ist, ist das Ereignis dauerhaft, was bedeutet, dass das Ereignis auch dann anstehend bleibt, wenn die Rückruffunktion ausgeführt wird. Wenn Sie möchten, dass es sich in einem nicht ausstehenden Zustand befindet, können Sie event_del() in der Rückruffunktion aufrufen.
Jedes Mal, wenn die Rückruffunktion des Ereignisses ausgelöst wird, wird der Timeout-Status im dauerhaften Ereignis zurückgesetzt. Wenn das Ereignis also EV_READ/EV_PERSIST hat und ein 5-Sekunden-Timeout festgelegt ist, gibt es zwei Situationen, die dieses Ereignis auslösen:
Wenn der Socket gelesen werden kann
Wenn das 5-Sekunden-Timeout abläuft
<?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); }