Wallogit.com
2017 © Pedro Peláez
Event loop abstraction layer that libraries can use for evented I/O.
Event loop abstraction layer that libraries can use for evented I/O., (*2)
In order for async based libraries to be interoperable, they need to use the
same event loop. This component provides a common LoopInterface that any
library can target. This allows them to be used in the same loop, with one
single run call that is controlled by the user., (*3)
In addition to the interface there are some implementations provided:, (*4)
StreamSelectLoop: This is the only implementation which works out of the
box with PHP. It does a simple select system call. It's not the most
performant of loops, but still does the job quite well., (*5)
LibEventLoop: This uses the libevent pecl extension. libevent itself
supports a number of system-specific backends (epoll, kqueue)., (*6)
LibEvLoop: This uses the libev pecl extension
(github). It supports the same
backends as libevent., (*7)
ExtEventLoop: This uses the event pecl extension. It supports the same
backends as libevent., (*8)
All of the loops support these features:, (*9)
Here is an async HTTP server built with just the event loop., (*10)
$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();
Note: The factory is just for convenience. It tries to pick the best
available implementation. Libraries SHOULD allow the user to inject an
instance of the loop. They MAY use the factory when the user did not supply
a loop., (*11)