Как стать автором
Обновить

Комментарии 38

У расширения PHP libevent есть трабла — он не переваривает (повисает) не пойманные исключения в коллбеках. какая ситуация здесь?
Здесь до версии 0.2.0a тоже висло. Сейчас вроде в порядке. Исключения пока не поддерживает, но можно добавить.
Кстати, нужен ли тут OOP API?
Конечно же нужен. Первой мыслью после чтения документации на php.net было «блин, если понадобится использовать в проекте, то придется писать ОО-обертку». Хороший пример сочетания объектно-ориентированного и процедурного API — расширение mysqli, например.
 Однозначно нужно реализовать в ввиде Класса.
В этом смысле лучше вообще:
pecl install eio
а в Gentoo? ;) Там только самому писать ebuild.
А вообще конечно checkinstall отличная утилита. Правда иногда самому приходится создавать директории для успешного завершения `make install`
Спасибо протестирую.
Сделайте пожалуйста пакеты, хотя бы под основные системы.

Согласной этому топику это полезно =)
Вот пакеты libeio для:

Debian_6.0 i586, x86_64
RedHat_RHEL-6 i586, x86_64
openSUSE_11.4 i586, x86_64
xUbuntu_10.04 i586, x86_64
xUbuntu_11.10 i586, x86_64

Пришлось собрать за автора.

eio конечно можно было бы установить через `pecl install eio`, но версия alpha этого скорее всего не позволит. Поэтому я бы установил вручную. В качестве альтернативы, можно взять самое свежее:
$ svn co svn.php.net/repository/pecl/eio/trunk eio && cd eio
# pecl install --force package.xml

Последнюю команду нужно дать с правами root
Я бы ещё предложил бы заиспользовать пространство имён, на подобе
eio\rename($filename, $new_filename, EIO\PRI_DEFAULT, function () {})

Которое сделали так же для разделения расширений по своим пространствам имён.
Делается простой заменой с
PHP_FE( myfunc, NULL )
на
ZEND_NS_FE( "myns", myfunc, NULL )

Либо, действительно сделать это отдельными классами
Было бы здорово, если бы вы рассказали о каких-то случаях использования, идеально — с примерами.
Я внимательно прочитал этот комментарий и посмотрел примеры. Но так и не понял в каких случаях следует это всё использовать. Асинхронно пускать chmod?
chmod может быть не часто придется запускать асинхронно. А вот, например, readdir, read, write, readahead, truncate, sendfile и др. возможно иногда полезно запускать асинхронно
примеров не хватает
в доке на docs.php.net? учитывая что я php расширение libevent опытным путём изучал так как доки там совсем нет, то у него очень хорошо всё описано. опять же я про docs.php.net
+1 за примеры
Был бы очень признателен за статью с примерами.
асинхронность это конечно хорошо, но синхронизация через колбэки — это ад. попробуй прикрутить оператор yield или какой-либо аналог. тогда можно будет реализовать что-нибудь типа такого: nin-jin.github.com/article/article_fiber/article_fiber.xml?LTIIDD
eio пока сырой в том смысле, что просто так реализовать асинхронный non-polling-mode можно только через внешний цикл событий. Например, при помощи libevent:
while(!$stop_signal){
event_base_loop($event_base, EVLOOP_ONCE|EVLOOP_NONBLOCK);
if (eio_nreqs()) eio_poll();
}


eio_poll() толкает libeio; возвращает мгновенно, если работы нет; если работа есть(запланированные запросы типа eio_custom, eio_open и т.п.), то может выполнить разом несколько.
eio_nreqs() возвращает количество невыполненных запросов.

Это можно использовать в приложениях/демонах/серверах, которые написаны на PHP с использованием расширения libevent и асинхронно работают с сетью. Если в этих приложениях есть необходимость работы с диском, то с помощью eio это можно делать в асинхронном стиле. Выще приведён простейший код интеграции. Можно интегрировать
через таймер (опрашивать по таймеру). Именно так мы пока собираемся его использовать.

По поводу API.
Можно также группировать запросы при помощи eio_grp, eio_grp_add и отменять их через eio_grp_cancel.

eio_grp создает группу, возвращая ресурс группы;
eio_grp_cancel отменяет все запросы группы.
eio_cancel может отменить как сам запрос группы, так и любой другой запрос eio_*
eio_grp_add добавляет запрос eio_* в группу.

Вот примеры в режиме поллинга(пока).

Конечно, связка с libev так и напрашивается. Но присоединять libev к eio в этом расширении нехорошо. Возможно, последует расширение ev. Тем не менее, будет отдельный воркер или т.п… Возможно, это будет выглядеть примерно так:

Eio — класс
Eio::__construct($internal_loop=TRUE/*использовать внутренний цикл событий*/)
Eio::loop() — цикл событий опосредованный внутренним watcher'ом.

для использования внешним расширением, например libevent:
Eio::poll_fileno — дескриптор файла, который может применяться в качестве триггера событий(в него можно писать и из него можно читать)
Eio::signal() — записать октет/байт в poll_fileno
Eio::drain() — прочитать октет/байт из poll_fileno
eio пока сырой в том смысле, что просто так реализовать асинхронный non-polling-mode можно только через внешний цикл событий.

Это unix way.
Думаю вам будет интересно, особенно в виду подколок в сторону Windows: github.com/bnoordhuis/phode
У меня идея: вынести внутреннюю переменную, используемую для переключения колбеков want-poll/done-poll в PHP;
тем самым дать возможность libevent понять, когда libeio вызвала want-poll callback. Т.е. это может выглядеть так:

1. Новая функция eio_get_fd возвращает нечто, что может «прослушивать» libevent, например файловый дескриптор:
<?php $fd = eio_get_fd(); ?>

2. want_poll и done_poll внутри пишут в… назовём это «дескриптором»… дескриптор и читают из него по байту, как и прежде.
Ничего не двинется дальше, пока что-то или кто-то не вызовет eio_poll().

3. Когда байт пришел в дескриптор, libevent может вызвать eio_poll() инициируя дальнейшее выполнение задач.

4. libeio вызывает внутри done_poll callback. Последний дописывает что нужно куда нужно, и нормальный цикл завершается.
читайте update в статье
а есть ли прогресс в написании модуля в виде класса? (могу дать полезные ссылки или поделиться опытом)
готовы ли примеры?
Прогресс есть, но не в плане ООП. В текущей 0.4.0 beta исправлены многочисленные ошибки, а libeio больше не нужно устанавливать отдельно — он встроен в расширение. Т.е. достаточно дать команду
sudo pecl install eio-beta

Про ООП думал. Просто не нахожу большой выгоды. Потому что eio по большому счёту полезен в сочетании с некоторым циклом событий, таким как libevent или libev. В данный момент пишу расширение для последнего, где как раз будет ООП во всей красе. Тогда большая часть проблем инкапсуляции ляжет на классы ev.
>libeio больше не нужно устанавливать отдельно — он встроен в расширение.
а как проверяешь то, что если libio уже было установлено?
можно указать проверку в config.m4 на наличие установленной библиотеки.
А просто libeio встроен в расширение ;)
Т.е. код libeio включается в код расширение, компилируется вместе с ним :)
могут не совпадать версии ранее установленного дистрибутива libio и твоих сырцов.
нужна обязательно проверка
Да, до того, как решил встроить было много проблем. В частности, на 32-битных платформах расширение вело себя очень непредсказуемо. Как выяснилось, потому просто, что в одной из структур libeio было поле типа off_t, размер которого на разных платформах ОС выбирает по-разному, устанавливает FILE_OFFSET_BITS либо 4, либо 8. Например у меня в Debian было 4, а в openSUSE — 8.

После долгих общений с автором libeio и поисков нестандартных решений, автор мне пишет,
что вообще то самый нормальный способ — встроить libeio в расширение, как он это уже сделал в модуле для Perl.
понял, спасибо
в некоторых дистрибутивах используют такой прием
Примеры вроде были.
docs.php.net/manual/en/eio.examples.php#example-3308

На самом деле конечно очень нехватает цикла событий типа libev…
Не хочу постить что попало. Хорошенько отдебажу и выложу.
спасибо,
оч интересное расширение — буду следить.
что касается примеров, то конкретно не хватает не «примеров использования» в плане апи,
а примеров «как и для чего это могло бы пригодиться» или какие задачи эффективнее сделать с использованием libio
эмм…
Я делал для простых задач вроде бэкапа, копирования с одного сервера на другой.
В кроне запускается скрипт, который запускает разного рода задачи:
— бэкап сайтов
— копирование сайта с одного хоста на другой
— восстановление бэкапа сайта

Бывает, что на некоторых командах оно просто стопорится, и вся очередь ждёт когда, например, закончится копирование или архивация. Тут как раз удобно запустить в отдельном потоке и пойти дальше.
спасибо
релиз 0.5.0 beta pecl.php.net/package/eio

Refact: libeio upgraded
Fix: bug #62392 where eio_*stat functions didn't return st_size
Fix: package.xml referenced to some nonexistent files
Fix: garbage in result arg of the callbacks in case of error
Change: warn about failed op in cb only when compiled with debug support
Add: test for stat on nonexistent files
Add: sockets support(eio_sendfile, eio_readahead etc.), enabled by default
Add: eio_seek function
Change: numeric fd arguments are now mixed(stream, Socket, or number)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации