diff options
Diffstat (limited to 'assets/php/vendor/react/event-loop/examples/14-http-client-async.php')
-rw-r--r-- | assets/php/vendor/react/event-loop/examples/14-http-client-async.php | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/assets/php/vendor/react/event-loop/examples/14-http-client-async.php b/assets/php/vendor/react/event-loop/examples/14-http-client-async.php new file mode 100644 index 0000000..c82c988 --- /dev/null +++ b/assets/php/vendor/react/event-loop/examples/14-http-client-async.php @@ -0,0 +1,63 @@ +<?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(); |