[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Libevent файловый дескриптор.
I++
У кого подобное работает нормально?


$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 лет может допилят laugh.gif

Спустя 45 минут, 4 секунды (4.04.2012 - 18:14) I++ написал(а):
Блооо почитал в инетах и сам проверил открыл либу, а там заголовок ELF... Возможно теперь ясно в чем глюк, попробую поставить эмуль линуха на фрю )

Спустя 9 минут, 42 секунды (4.04.2012 - 18:24) Семён написал(а):
Чувак мы еще не настолько высокоразвиты чтобы советовать тебе что-то по этой теме))))

Спустя 8 минут, 56 секунд (4.04.2012 - 18:33) I++ написал(а):
Это печально sad.gif

Я уже 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+ который нехрена не собирается. laugh.gif laugh.gif laugh.gif

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

Спустя 1 час, 6 минут, 27 секунд (4.04.2012 - 20:40) I++ написал(а):
По делу, хочу раз и навсегда разобраться с этим. Собрать нормальный мануал заодно, ибо интернеты и автор скупой на мануалы. На phpconf показали как это круто, весь инет пищал, вопил, меня тоже вот заинтересовало, но я не думал, что всё настолько СЫРО и КОРЯВО )

Ну с сокетами он на ура работает, но это не всё, что умеет 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 biggrin.gif

Ладно это последняя надежда, что все заработает...

Спустя 1 час, 26 минут, 37 секунд (5.04.2012 - 21:00) I++ написал(а):
Я разобрался в чем причина.

Вот лог 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>

Он инициализирует:


$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, но это того не стоит, чтобы еще с этим гемороиться.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.