<?php $base = event_base_new(); $event = event_new(); event_set($event,STDIN,EV_READ|EV_PERSIST,function ($fd){ echo "\n start --".fgets($fd)." read finish\n"; },(int)STDIN); event_base_set($event,$base); event_add($event); $event = event_new(); event_set($event,STDOUT,EV_WRITE|EV_PERSIST,function ($fd)use($event){ echo "end -- write finish\n"; event_del($event); },(int)STDOUT); event_base_set($event,$base); event_add($event); $event = event_new(); event_set($event,STDOUT,EV_SIGNAL | EV_PERSIST,function ($fd)use($event){ echo "\n--signal handler--\n"; event_del($event); },(int)STDOUT); event_base_set($event,$base); event_add($event); $count=1; $event = event_new(); event_set($event,0,EV_TIMEOUT ,function ($fd,$str)use($event){ echo "\n--timeout $fd str:$str --\n"; global $count; if($count >5) { event_timer_del($event); }else{ $count++; // event_del($event); event_add($event,1000000); } },"timer"); event_base_set($event,$base); event_add($event,1000000); echo fgets(STDIN); event_base_loop($base);在event_set来改变事件后,libevent会丢弃之前所属的base,所以需要调用event_base_set,然后event_add
事件回调函数的参数格式:
1.EV_READ,EV_WRITE
fd:流资源或socket,
what:触发的事件的位码值,EV_READ,EV_WRITEarg:用户的自定义参数
void callback ([ mixed $fd = NULL [, int $what [, mixed $arg = NULL ]]] )
2.EV_TIMEOUT
void callback ([ mixed $arg = NULL ] )
signum:触发的信号值(e.g. SIGTERM )
void callback ([ int $signum [, mixed $arg = NULL ]] )
Event扩展:相当于是对libevent扩展的类封装
EventBase,
EventBase::loop(或dispatch)
EventBase::free(释放为event base分配的资源)
Event(),
Event::timer,
Event::signal,
Event::addSignal,
Event::delSignal,
Event::addTimer,
Event::delTimer,
Event::set,
Event::free(释放事件的资源)
定时器实例:
$base = new EventBase();
$n = 2;
$e = Event::timer($base, function($n) use (&$e) {
echo "$n seconds elapsed\n";
$e->delTimer();
}, $n);
$e->addTimer($n);
$base->loop();
-