$fp = fopen('test.bin', 'rb');
$base = event_base_new();
$eb = event_buffer_new($fp, "read", NULL, "error_func", $fp);
event_buffer_base_set($eb, $base);
event_buffer_enable($eb, EV_READ);
event_base_loop($base);
function read($buf, $arg)
{
event_buffer_read($buf, 32768);
}
function error_func($buf, $what, $arg)
{
var_dump($what);
exit;
}
Я скурил весь инет, медетировал на phpDaemon (Там тоже на костылях все сделано). В общем в error_func у меня не попадает EVBUFFER_EOF.
Скомпилил последнюю версию 0.0.5 на фряхе с поддержкойf cntl и других ништяков. Там версия правда используется в портах 1.4 libevent'а, может в этом косяк, медитировал долго на исходники php_libevent и на исходники libevent 1.4, правил, компилил, тестил, хер, правил, компилил, тестил, х, и так раз 10, думаю это фэйл, попробую подсунуть 2 версию либевента при компиляции...
Если у кого заработал код скажите, может у мя во фряхе чего...
Спустя 5 часов, 55 минут, 13 секунд (4.04.2012 - 17:29) I++ написал(а):
Кароче полная хрень, в колбэк не попадает эвент на EOF.
Ладно через 20 лет может допилят
Ладно через 20 лет может допилят

Спустя 45 минут, 4 секунды (4.04.2012 - 18:14) I++ написал(а):
Блооо почитал в инетах и сам проверил открыл либу, а там заголовок ELF... Возможно теперь ясно в чем глюк, попробую поставить эмуль линуха на фрю )
Спустя 9 минут, 42 секунды (4.04.2012 - 18:24) Семён написал(а):
Чувак мы еще не настолько высокоразвиты чтобы советовать тебе что-то по этой теме))))
Спустя 8 минут, 56 секунд (4.04.2012 - 18:33) I++ написал(а):
Это печально 
Я уже 2 день задротствую, пытаясь libevent заставить работать. Я так подумал, если всеж удастся, стоит ли вообще скрипт такой писать, который потребует мануала по установке на страниц 20 )
Ну это вообще блооо
/* {{{ proto resource event_base_new()
*/
static PHP_FUNCTION(event_base_new)
{
php_event_base_t *base;
struct event_config *cfg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS) {
return;
}
cfg = event_config_new();
event_config_avoid_method(cfg, "kqueue");
base = emalloc(sizeof(php_event_base_t));
base->base = event_base_new_with_config(cfg);
event_config_free(cfg);
if (!base->base) {
efree(base);
RETURN_FALSE;
}
base->events = 0;
#if PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 4
base->rsrc_id = zend_list_insert(base, le_event_base TSRMLS_CC);
#else
base->rsrc_id = zend_list_insert(base, le_event_base);
#endif
RETURN_RESOURCE(base->rsrc_id);
}
/* }}} */
1.4 libevent не поддерживает event_config_new epoll по opennetу говорят не поддерживает EOF на файловые дескрипторы, нужно вызвать event_config_new и использовать kqueue который поддерживает отправку EOF, но такая функция есть только в libevent 2+ который нехрена не собирается.

Я уже 2 день задротствую, пытаясь libevent заставить работать. Я так подумал, если всеж удастся, стоит ли вообще скрипт такой писать, который потребует мануала по установке на страниц 20 )
Ну это вообще блооо
/* {{{ proto resource event_base_new()
*/
static PHP_FUNCTION(event_base_new)
{
php_event_base_t *base;
struct event_config *cfg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS) {
return;
}
cfg = event_config_new();
event_config_avoid_method(cfg, "kqueue");
base = emalloc(sizeof(php_event_base_t));
base->base = event_base_new_with_config(cfg);
event_config_free(cfg);
if (!base->base) {
efree(base);
RETURN_FALSE;
}
base->events = 0;
#if PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 4
base->rsrc_id = zend_list_insert(base, le_event_base TSRMLS_CC);
#else
base->rsrc_id = zend_list_insert(base, le_event_base);
#endif
RETURN_RESOURCE(base->rsrc_id);
}
/* }}} */
1.4 libevent не поддерживает event_config_new epoll по opennetу говорят не поддерживает EOF на файловые дескрипторы, нужно вызвать event_config_new и использовать kqueue который поддерживает отправку EOF, но такая функция есть только в libevent 2+ который нехрена не собирается.



Спустя 1 час, 44 секунды (4.04.2012 - 19:34) Игорь_Vasinsky написал(а):
из тебя уже неделю всё это как прёт
это простой интерес или по делу?

Спустя 1 час, 6 минут, 27 секунд (4.04.2012 - 20:40) I++ написал(а):
По делу, хочу раз и навсегда разобраться с этим. Собрать нормальный мануал заодно, ибо интернеты и автор скупой на мануалы. На phpconf показали как это круто, весь инет пищал, вопил, меня тоже вот заинтересовало, но я не думал, что всё настолько СЫРО и КОРЯВО )
Ну с сокетами он на ура работает, но это не всё, что умеет libevent, там функций интересных полно, а реализовано совсем чуть чуть.
Ну с сокетами он на ура работает, но это не всё, что умеет libevent, там функций интересных полно, а реализовано совсем чуть чуть.
Спустя 22 часа, 53 минуты, 15 секунд (5.04.2012 - 19:33) I++ написал(а):
Собрал!
libevent
libevent support => enabled
extension version => 0.0.4
Revision => $Revision: 318910 $
libevent version => 2.0.16-stable
На самом деле это 0.0.5 версия, собралось с libevent версии 2
Ладно это последняя надежда, что все заработает...
libevent
libevent support => enabled
extension version => 0.0.4
Revision => $Revision: 318910 $
libevent version => 2.0.16-stable
На самом деле это 0.0.5 версия, собралось с libevent версии 2

Ладно это последняя надежда, что все заработает...
Спустя 1 час, 26 минут, 37 секунд (5.04.2012 - 21:00) I++ написал(а):
Я разобрался в чем причина.
Вот лог ktrace дампа:
В общем это косяк автора <_<
Можно в теории читать через костыли, но дальнейшее чтение логов показало, что внутренний буфер растет, при этом не кидается колбэк и не срабатывает событие на чтение буфера, что может привести к переполнению и краху всего php.
Вот это видно в топе:
13672 root 1 4 0 48112K 44240K kqread 1 0:01 0.00% php
Если будем читать файлы по несколько гигов, сервак тупо начнет свопиться, а потом рухнет в муках.
В общем тема, закрыта автору libevent оценка неуд.
Вот лог ktrace дампа:
13650 php RET kevent 1
13650 php CALL clock_gettime(0x4,0xbfbfd324)
13650 php RET clock_gettime 0
13650 php CALL gettimeofday(0xbfbfd31c,0)
13650 php RET gettimeofday 0
13650 php CALL ioctl(0x3,FIONREAD,0xbfbfd2f4)
13650 php RET ioctl -1 errno 25 Inappropriate ioctl for device
13650 php CALL readv(0x3,0xbfbfd2d4,0x2)
13650 php GIO fd 3 read 176 bytes
"fdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsf gdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsf\
dsfgdsf"
13650 php RET readv 176/0xb0
13650 php CALL write(0x1,0x28722d14,0x2d)
13650 php GIO fd 1 wrote 45 bytes
"dsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsfdsfgdsf"
13650 php RET write 45/0x2d
13650 php CALL kevent(0x4,0x2880f800,0,0x28810000,0x40,0)
13650 php GIO fd 4 wrote 0 bytes
""
13650 php RET kevent -1 errno 4 Interrupted system call
ioctl -1 errno 25 Inappropriate ioctl for device
php RET kevent -1 errno 4 Interrupted system call
В общем это косяк автора <_<
Можно в теории читать через костыли, но дальнейшее чтение логов показало, что внутренний буфер растет, при этом не кидается колбэк и не срабатывает событие на чтение буфера, что может привести к переполнению и краху всего php.
Вот это видно в топе:
13672 root 1 4 0 48112K 44240K kqread 1 0:01 0.00% php
Если будем читать файлы по несколько гигов, сервак тупо начнет свопиться, а потом рухнет в муках.
В общем тема, закрыта автору libevent оценка неуд.
Спустя 5 минут, 58 секунд (5.04.2012 - 21:06) Игорь_Vasinsky написал(а):
Цитата |
Вот это видно в топе: 13672 root 1 4 0 48112K 44240K kqread 1 0:01 0.00% php |
я начинаю тебя бояться.
Спустя 12 минут, 17 секунд (5.04.2012 - 21:18) I++ написал(а):
Самое интересное другое PHPDaemon использует метод костыля вот исходник:
<a href='https://github.com/kakserpom/phpdaemon/blob/master/lib/AsyncStream.php'>https://gith ub.com/kakserpom/phpdaemon/blob...AsyncStream.php</a>
Он инициализирует:
Как только readFD принимает файловый дескриптор, начинается его активное чтение, баг есть при использовании метода kqueue, не знаю как будет работать при использовании epoll или poll, возможно там нет такого бага.
Тестить лень poll, epoll
<a href='https://github.com/kakserpom/phpdaemon/blob/master/lib/AsyncStream.php'>https://gith ub.com/kakserpom/phpdaemon/blob...AsyncStream.php</a>
Он инициализирует:
$this->readBuf = event_buffer_new(
$this->readFD,
array($this, 'onReadEvent'),
array($this, 'onWriteEvent'),
array($this, 'onReadFailureEvent'),
array()
);
Как только readFD принимает файловый дескриптор, начинается его активное чтение, баг есть при использовании метода kqueue, не знаю как будет работать при использовании epoll или poll, возможно там нет такого бага.
Тестить лень poll, epoll
Спустя 7 минут, 26 секунд (5.04.2012 - 21:26) I++ написал(а):
Говорят можно накатить патч aio для libevent, но это того не стоит, чтобы еще с этим гемороиться.