5
5
6
6
Event loop abstraction layer that libraries can use for evented I/O.
7
7
8
- In order for async based libraries to be interoperable, they need to use the
9
- same event loop. This component provides a common ` LoopInterface ` that any
10
- library can target. This allows them to be used in the same loop, with one
11
- single ` run ` call that is controlled by the user.
12
-
13
8
> The master branch contains the code for the upcoming 0.5 release.
14
9
For the code of the current stable 0.4.x release, checkout the
15
10
[ 0.4 branch] ( https://github.com/reactphp/event-loop/tree/0.4 ) .
16
11
17
- In addition to the interface there are some implementations provided:
18
-
19
- * ` StreamSelectLoop ` : This is the only implementation which works out of the
20
- box with PHP. It does a simple ` select ` system call. It's not the most
21
- performant of loops, but still does the job quite well.
22
-
23
- * ` LibEventLoop ` : This uses the ` libevent ` pecl extension. ` libevent ` itself
24
- supports a number of system-specific backends (epoll, kqueue).
25
-
26
- * ` LibEvLoop ` : This uses the ` libev ` pecl extension
27
- ([ github] ( https://github.com/m4rw3r/php-libev ) ). It supports the same
28
- backends as libevent.
12
+ ** Table of Contents**
29
13
30
- * ` ExtEventLoop ` : This uses the ` event ` pecl extension. It supports the same
31
- backends as libevent.
14
+ * [ Quickstart example] ( #quickstart-example )
15
+ * [ Usage] ( #usage )
16
+ * [ Loop implementations] ( #loop-implementations )
17
+ * [ Install] ( #install )
18
+ * [ Tests] ( #tests )
19
+ * [ License] ( #license )
32
20
33
- All of the loops support these features:
34
-
35
- * File descriptor polling
36
- * One-off timers
37
- * Periodic timers
38
- * Deferred execution of callbacks
39
-
40
- ## Usage
21
+ ## Quickstart example
41
22
42
23
Here is an async HTTP server built with just the event loop.
43
24
@@ -46,6 +27,7 @@ $loop = React\EventLoop\Factory::create();
46
27
47
28
$server = stream_socket_server('tcp://127.0.0.1:8080');
48
29
stream_set_blocking($server, 0);
30
+
49
31
$loop->addReadStream($server, function ($server) use ($loop) {
50
32
$conn = stream_socket_accept($server);
51
33
$data = "HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nHi\n";
@@ -69,7 +51,94 @@ $loop->addPeriodicTimer(5, function () {
69
51
$loop->run();
70
52
```
71
53
72
- ** Note:** The factory is just for convenience. It tries to pick the best
73
- available implementation. Libraries ` SHOULD ` allow the user to inject an
74
- instance of the loop. They ` MAY ` use the factory when the user did not supply
75
- a loop.
54
+ ## Usage
55
+
56
+ In order for async based libraries to be interoperable, they need to use the
57
+ same event loop. This component provides a common ` LoopInterface ` that any
58
+ library can target. This allows them to be used in the same loop, with one
59
+ single ` run() ` call that is controlled by the user.
60
+
61
+ ``` php
62
+ // [1]
63
+ $loop = React\EventLoop\Factory::create();
64
+
65
+ // [2]
66
+ $loop->addPeriodicTimer(1, function () {
67
+ echo "Tick\n";
68
+ });
69
+
70
+ $stream = new React\Stream\ReadableResourceStream(
71
+ fopen('file.txt', 'r'),
72
+ $loop
73
+ );
74
+
75
+ // [3]
76
+ $loop->run();
77
+ ```
78
+
79
+ 1 . The loop instance is created at the beginning of the program. A convenience
80
+ factory ` React\EventLoop\Factory::create() ` is provided by this library which
81
+ picks the best available [ loop implementation] ( #loop-implementations ) .
82
+ 2 . The loop instance is used directly or passed to library and application code.
83
+ In this example, a periodic timer is registered with the event loop which
84
+ simply outputs ` Tick ` every second and a
85
+ [ readable stream] ( https://github.com/reactphp/stream#readableresourcestream )
86
+ is created by using ReactPHP's
87
+ [ stream component] ( https://github.com/reactphp/stream ) for demonstration
88
+ purposes.
89
+ 3 . The loop is run with a single ` $loop->run() ` call at the end of the program.
90
+
91
+ ## Loop implementations
92
+
93
+ In addition to the interface there are the following implementations provided:
94
+
95
+ * ` StreamSelectLoop ` : This is the only implementation which works out of the
96
+ box with PHP. It does a simple ` select ` system call. It's not the most
97
+ performant of loops, but still does the job quite well.
98
+
99
+ * ` LibEventLoop ` : This uses the ` libevent ` pecl extension. ` libevent ` itself
100
+ supports a number of system-specific backends (epoll, kqueue).
101
+
102
+ * ` LibEvLoop ` : This uses the ` libev ` pecl extension
103
+ ([ github] ( https://github.com/m4rw3r/php-libev ) ). It supports the same
104
+ backends as libevent.
105
+
106
+ * ` ExtEventLoop ` : This uses the ` event ` pecl extension. It supports the same
107
+ backends as libevent.
108
+
109
+ All of the loops support these features:
110
+
111
+ * File descriptor polling
112
+ * One-off timers
113
+ * Periodic timers
114
+ * Deferred execution of callbacks
115
+
116
+ ## Install
117
+
118
+ The recommended way to install this library is [ through Composer] ( http://getcomposer.org ) .
119
+ [ New to Composer?] ( http://getcomposer.org/doc/00-intro.md )
120
+
121
+ This will install the latest supported version:
122
+
123
+ ``` bash
124
+ $ composer require react/event-loop
125
+ ```
126
+
127
+ ## Tests
128
+
129
+ To run the test suite, you first need to clone this repo and then install all
130
+ dependencies [ through Composer] ( http://getcomposer.org ) :
131
+
132
+ ``` bash
133
+ $ composer install
134
+ ```
135
+
136
+ To run the test suite, go to the project root and run:
137
+
138
+ ``` bash
139
+ $ php vendor/bin/phpunit
140
+ ```
141
+
142
+ ## License
143
+
144
+ MIT, see [ LICENSE file] ( LICENSE ) .
0 commit comments