-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path07-async-echo.php
46 lines (32 loc) · 1.02 KB
/
07-async-echo.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
require __DIR__.'/99-event-loop.php';
$server = stream_socket_server('tcp://0.0.0.0:5000');
$loop = new EventLoop();
$loop->onReadable($server, function ($server) use ($loop) {
$conn = stream_socket_accept($server, 0);
$buffer = '';
$closing = false;
$loop->onReadable($conn, function ($conn) use ($loop, &$buffer, &$closing) {
$data = fread($conn, 1024);
if (!$data) {
$closing = true;
$loop->disableReads($conn);
return;
}
$buffer .= $data;
$loop->enableWrites($conn);
});
$loop->onWritable($conn, function ($conn) use ($loop, &$buffer, &$closing) {
$written = fwrite($conn, $buffer);
$buffer = (string) substr($buffer, $written);
if (strlen($buffer) === 0) {
$loop->disableWrites($conn);
}
if ($closing && strlen($buffer) === 0) {
$loop->remove($conn);
fclose($conn);
}
});
});
$loop->run();
// BUG: only closes in write handler