| 
<?php
 use React\EventLoop\Factory;
 
 require __DIR__ . '/../vendor/autoload.php';
 
 $loop = Factory::create();
 
 // resolve hostname before establishing TCP/IP connection (resolving DNS is still blocking here)
 // for illustration purposes only, should use react/socket or react/dns instead!
 $ip = gethostbyname('www.google.com');
 if (ip2long($ip) === false) {
 echo 'Unable to resolve hostname' . PHP_EOL;
 exit(1);
 }
 
 // establish TCP/IP connection (non-blocking)
 // for illustraction purposes only, should use react/socket instead!
 $stream = stream_socket_client('tcp://' . $ip . ':80', $errno, $errstr, null, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT);
 if (!$stream) {
 exit(1);
 }
 stream_set_blocking($stream, false);
 
 // print progress every 10ms
 echo 'Connecting';
 $timer = $loop->addPeriodicTimer(0.01, function () {
 echo '.';
 });
 
 // wait for connection success/error
 $loop->addWriteStream($stream, function ($stream) use ($loop, $timer) {
 $loop->removeWriteStream($stream);
 $loop->cancelTimer($timer);
 
 // check for socket error (connection rejected)
 if (stream_socket_get_name($stream, true) === false) {
 echo '[unable to connect]' . PHP_EOL;
 exit(1);
 } else {
 echo '[connected]' . PHP_EOL;
 }
 
 // send HTTP request
 fwrite($stream, "GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n");
 
 // wait for HTTP response
 $loop->addReadStream($stream, function ($stream) use ($loop) {
 $chunk = fread($stream, 64 * 1024);
 
 // reading nothing means we reached EOF
 if ($chunk === '') {
 echo '[END]' . PHP_EOL;
 $loop->removeReadStream($stream);
 fclose($stream);
 return;
 }
 
 echo $chunk;
 });
 });
 
 $loop->run();
 
 |