From d4892c6bb2acae94e857e00e5348839d2a481fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 25 Apr 2017 13:16:11 +0200 Subject: [PATCH] Add examples to ease getting started --- README.md | 2 ++ examples/01-timers.php | 15 ++++++++++++++ examples/02-periodic.php | 16 ++++++++++++++ examples/11-consume-stdin.php | 26 +++++++++++++++++++++++ examples/12-generate-yes.php | 39 +++++++++++++++++++++++++++++++++++ examples/21-http-server.php | 30 +++++++++++++++++++++++++++ 6 files changed, 128 insertions(+) create mode 100644 examples/01-timers.php create mode 100644 examples/02-periodic.php create mode 100644 examples/11-consume-stdin.php create mode 100644 examples/12-generate-yes.php create mode 100644 examples/21-http-server.php diff --git a/README.md b/README.md index 4e4ee3d0..96ee01f9 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,8 @@ $loop->addPeriodicTimer(5, function () { $loop->run(); ``` +See also the [examples](examples). + ## Usage Typical applications use a single event loop which is created at the beginning diff --git a/examples/01-timers.php b/examples/01-timers.php new file mode 100644 index 00000000..e6107e46 --- /dev/null +++ b/examples/01-timers.php @@ -0,0 +1,15 @@ +addTimer(0.8, function () { + echo 'world!' . PHP_EOL; +}); + +$loop->addTimer(0.3, function () { + echo 'hello '; +}); + +$loop->run(); diff --git a/examples/02-periodic.php b/examples/02-periodic.php new file mode 100644 index 00000000..5e138a62 --- /dev/null +++ b/examples/02-periodic.php @@ -0,0 +1,16 @@ +addPeriodicTimer(0.1, function () { + echo 'tick!' . PHP_EOL; +}); + +$loop->addTimer(1.0, function () use ($loop, $timer) { + $loop->cancelTimer($timer); + echo 'Done' . PHP_EOL; +}); + +$loop->run(); diff --git a/examples/11-consume-stdin.php b/examples/11-consume-stdin.php new file mode 100644 index 00000000..c1874dd3 --- /dev/null +++ b/examples/11-consume-stdin.php @@ -0,0 +1,26 @@ +addReadStream(STDIN, function ($stream) use ($loop) { + $chunk = fread($stream, 64 * 1024); + + // reading nothing means we reached EOF + if ($chunk === '') { + $loop->removeReadStream($stream); + return; + } + + echo strlen($chunk) . ' bytes' . PHP_EOL; +}); + +$loop->run(); diff --git a/examples/12-generate-yes.php b/examples/12-generate-yes.php new file mode 100644 index 00000000..bb78e88f --- /dev/null +++ b/examples/12-generate-yes.php @@ -0,0 +1,39 @@ +addWriteStream($stdout, function () use ($loop, $stdout, &$data) { + // try to write data + $r = fwrite($stdout, $data); + + // nothing could be written despite being writable => closed + if ($r === 0) { + $loop->removeWriteStream($stdout); + fclose($stdout); + fwrite(STDERR, 'Stopped because STDOUT closed' . PHP_EOL); + + return; + } + + // implement a very simple ring buffer, unless everything has been written at once: + // everything written in this iteration will be appended for next iteration + if (isset($data[$r])) { + $data = substr($data, $r) . substr($data, 0, $r); + } +}); + +$loop->run(); diff --git a/examples/21-http-server.php b/examples/21-http-server.php new file mode 100644 index 00000000..67423957 --- /dev/null +++ b/examples/21-http-server.php @@ -0,0 +1,30 @@ +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();