werkint / reactphp-event-loop
v0.4.2
2016-03-08 02:09 UTC
Requires
- php: >=5.4.0
Suggests
- ext-event: ~1.0
- ext-libev: *
- ext-libevent: >=0.1.0
This package is not auto-updated.
Last update: 2019-02-20 19:05:02 UTC
README
事件循环抽象层,供库用于事件驱动的I/O。
为了使基于异步的库能够互操作,它们需要使用相同的事件循环。此组件提供了一个通用的 LoopInterface
,任何库都可以针对它。这允许它们在同一个循环中使用,通过用户控制的单个 run
调用。
除了接口外,还提供了一些实现
-
StreamSelectLoop
:这是唯一一个与PHP无缝工作的实现。它执行简单的select
系统调用。它不是性能最好的循环,但仍然做得相当好。 -
LibEventLoop
:它使用libevent
pecl 扩展。libevent
本身支持多个系统特定的后端(epoll、kqueue)。 -
LibEvLoop
:它使用libev
pecl 扩展(github)。它支持与libevent相同的后端。 -
ExtEventLoop
:它使用event
pecl 扩展。它支持与libevent相同的后端。
所有循环都支持以下功能
- 文件描述符轮询
- 一次性定时器
- 周期性定时器
- 延迟执行回调
使用方法
以下是一个仅使用事件循环构建的异步HTTP服务器。
$loop = React\EventLoop\Factory::create(); $server = stream_socket_server('tcp://127.0.0.1:8080'); stream_set_blocking($server, 0); $loop->addReadStream($server, function ($server) use ($loop) { $conn = stream_socket_accept($server); $data = "HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nHi\n"; $loop->addWriteStream($conn, function ($conn) use (&$data, $loop) { $written = fwrite($conn, $data); if ($written === strlen($data)) { fclose($conn); $loop->removeStream($conn); } else { $data = substr($data, $written); } }); }); $loop->addPeriodicTimer(5, function () { $memory = memory_get_usage() / 1024; $formatted = number_format($memory, 3).'K'; echo "Current memory usage: {$formatted}\n"; }); $loop->run();
注意: 工厂只是为了方便。它试图选择最佳可用实现。库 应当
允许用户注入循环的实例。它们 可以
在用户没有提供循环时使用工厂。