php libevent и timer

Anton Zaluskiy

Новичок
Здравствуйте, в интернете очень мало примеров по работе с libevent и вообще практически нет по работе с libevent timer

$this->event_base = event_base_new();

$this->event_timer = event_timer_new();
event_timer_set($this->event_timer, array($this, 'handler_timer'), array());
event_timer_pending($this->event_timer, 1);
event_base_set($this->event_timer, $this->event_base);
event_timer_add($this->event_timer);

event_base_loop($this->event_base);

Вот этот код у меня по какой-то причине не отрабатывает, хотя должен, кто-то может поделиться рабочим примером или советом?

Версия php 5.3.6
Версии libevent

extension version 0.0.4
Revision $Revision: 300303 $
libevent version 2.0.12-stable

Заранее спасибо
 

tony2001

TeaM PHPClub
давайте начнём не с емэйлов мне, а с рабочего примера кода, ага?
такого, чтобы мне не нужно было править его сначала до рабочего состояния, а потом пытаться понять что же, черт возьми, он должен делать, т.к. про это ни слова не сказано.

по поводу примеров работы - как мне помнится, Long на прошлой конфе мне обещал дать массу примеров кода для документации, т.к. он экстеншен в реальной жизни использует (в отличие от меня).
с тех пор и жду..
если у вас есть примеры - смело шлите, добавлю в мануал.
 

Anton Zaluskiy

Новичок
Да, конечно, код в студию

<?

function handler_timer() {
echo 'call'."\n";
}

$event_base = event_base_new();

$event_timer = event_timer_new();
event_timer_set($event_timer, 'handler_timer', array());
event_timer_pending($event_timer, 1);
event_base_set($event_timer, $event_base);
event_timer_add($event_timer);

/* event_base_loop($event_base); при вызове event_base_loop без параметров скрипт вообще просто завершает работу и все */
while (true) {
event_base_loop($event_base, EVLOOP_ONCE);
usleep(1000000);
}

?>

Скрипт запускает нормально, никакие ошибки в лог не пишутся, функция handler_timer не вызывается, просто скрипт висит в памяти и все

Антон.
 

tony2001

TeaM PHPClub
http://monkey.org/~provos/libevent/doxygen-1.4.10/event_8h.html#bf39a907d20c1612adc310c123648b63
int event_pending ( struct event * ev,
short event,
struct timeval * tv
)

Checks if a specific event is pending or scheduled.
а если поменять код на это:
PHP:
function handler_timer() {                                                                                                                                   
    echo 'call'."\n";                                                                                                                                        
}                                                                                                                                                            
                                                                                                                                                             
$event_base = event_base_new();                                                                                                                              
                                                                                                                                                             
$event_timer = event_timer_new();                                                                                                                            
event_timer_set($event_timer, 'handler_timer', array());                                                                                                     
event_base_set($event_timer, $event_base);                                                                                                                   
                                                                                                                                                             
while (true) {                                                                                                                                               
    event_timer_add($event_timer, 1);                                                                                                                        
    event_base_loop($event_base);                                                                                                                            
    usleep(1000000);                                                                                                                                         
}
то он раз в секунду говорит "call".
правда, опять-таки непонятно ЭТО ЛИ ожидалось или нет..
 

Anton Zaluskiy

Новичок
Удобно было бы иметь возможность запуска события по таймеру через равные промежутки времени, тоесть добавил какой-то таймер и каждую секунду у вызывается какая-то функция, да, это можно реализовать так, как реализовано в этом топике, но это костыль, так как у меня, в этой же базе событий есть события сокета и все это слепить воедино достаточно не комфортно
 

Long

Новичок
это можно реализовать так, как реализовано в этом топике, но это костыль, так как у меня, в этой же базе событий есть события сокета и все это слепить воедино достаточно не комфортно
в чем костыль-то? наоборот - управляемое поведение. вообще говоря, дескриптор может быть не один, поэтому удобно для таймеров использовать просто файловые дескрипторы, по одному на таймер - получается реализовать произвольное кол-во таймеров.

Long на прошлой конфе мне обещал дать массу примеров кода для документации
забылось совсем за работой. :( да и примеры не так просто сделать - все в целом надо рассматривать.
вот ссылка на код примера, который запускался на конфе - там есть реализация в том числе и для таймеров.
 

ivolovikov

Новичок
http://monkey.org/~provos/libevent/doxygen-1.4.10/event_8h.html#bf39a907d20c1612adc310c123648b63


а если поменять код на это:
PHP:
function handler_timer() {                                                                                                                                   
    echo 'call'."\n";                                                                                                                                        
}                                                                                                                                                            
                                                                                                                                                             
$event_base = event_base_new();                                                                                                                              
                                                                                                                                                             
$event_timer = event_timer_new();                                                                                                                            
event_timer_set($event_timer, 'handler_timer', array());                                                                                                     
event_base_set($event_timer, $event_base);                                                                                                                   
                                                                                                                                                             
while (true) {                                                                                                                                               
    event_timer_add($event_timer, 1);                                                                                                                        
    event_base_loop($event_base);                                                                                                                            
    usleep(1000000);                                                                                                                                         
}
то он раз в секунду говорит "call".
правда, опять-таки непонятно ЭТО ЛИ ожидалось или нет..
Я конечно извиняюсь, но чтобы там не ожидалось, могли бы уже просто из цикла handler_timer() дёргать. Вот как ЭТО в теории должно быть:
PHP:
function handler_timer($res, $status, $timer) {
    echo 'call'."\n";
    event_timer_add($timer, 1000000);
}

$event_base = event_base_new();

$event_timer = event_timer_new();
event_timer_set($event_timer, 'handler_timer', $event_timer);
event_base_set($event_timer, $event_base);
event_timer_add($event_timer, 1000000);
event_base_loop($event_base);
иначе смысла использовать событийную модель?
 
Сверху