<?php require __DIR__ . '/../vendor/autoload.php'; // data can be given as first argument or defaults to "y" $data = (isset($argv[1]) ? $argv[1] : 'y') . "\n"; // repeat data X times in order to fill around 200 KB $data = str_repeat($data, round(200000 / strlen($data))); $loop = React\EventLoop\Factory::create(); if (!defined('STDOUT') || stream_set_blocking(STDOUT, false) !== true) { fwrite(STDERR, 'ERROR: Unable to set STDOUT non-blocking (not CLI or Windows?)' . PHP_EOL); exit(1); } // write data to STDOUT whenever its write buffer accepts data // for illustrations purpose only, should use react/stream instead $loop->addWriteStream(STDOUT, function ($stdout) use ($loop, &$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); stream_set_blocking($stdout, true); 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();