public function createLoop($readStreamCompatible = false) { if ('Linux' === PHP_OS && !extension_loaded('posix')) { $this->markTestSkipped('libevent tests skipped on linux due to linux epoll issues.'); } if (!extension_loaded('event')) { $this->markTestSkipped('ext-event tests skipped because ext-event is not installed.'); } $cfg = null; if ($readStreamCompatible) { $cfg = new \EventConfig(); $cfg->requireFeatures(\EventConfig::FEATURE_FDS); } return new ExtEventLoop($cfg); }
use Ratchet\WebSocket\WsServer; use ExChat\Server as ChatServer; use ExHttp\Server as ConnectionHandler; use SlideBuilder\Server as SlideServer; use SlideBuilder\Builder as SlideBuilder; use ExHttp\Router; use ExHttp\StaticFile; use EventConfig as EventBaseConfig; /* Using Select Loop due to LibEvent epolling which doesn't work with file reads @see http://stackoverflow.com/questions/5456967/problem-handling-file-i-o-with-libevent2 @todo look at possibly using libev */ //$loop = new React\EventLoop\StreamSelectLoop(); $cfg = new \EventConfig(); $cfg->requireFeatures(EventBaseConfig::FEATURE_FDS); $loop = new React\EventLoop\ExtEventLoop($cfg); $documentRoot = getcwd(); $slidesDir = $documentRoot . DIRECTORY_SEPARATOR . 'slides'; echo "Watching directory: " . $documentRoot . PHP_EOL; /* slide server and builder */ $slideBuilder = new SlideBuilder($loop, $slidesDir); $slideServer = new SlideServer($slideBuilder); /* Directory monitor */ $inotify = new MKraemer\ReactInotify\Inotify($loop); $inotify->add($documentRoot . '/slides/', IN_CREATE | IN_DELETE | IN_MODIFY); $inotify->on(IN_MODIFY, array($slideBuilder, 'buildSlides'));
* To run, you will need to make sure you have sudo access as it is currently * configured to run the web server on port 80 and have port 8080 accessible * as that is where the websocket server is configured to listen. * * when done, point your browser to port 80 of your machine and you should see * a little avatar pop up - add more browsers to see more avatars. * * To chat simply enter a message and hit enter or press the send button. */ require_once '/var/www/reactphp/vendor/autoload.php'; use ExHttp\Server as ConnectionHandler; use ExHttp\StaticFile; use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; $cfg = new \EventConfig(); $cfg->requireFeatures(\EventConfig::FEATURE_FDS); $loop = new React\EventLoop\ExtEventLoop($cfg); $documentRoot = getcwd(); // Set up our WebSocket server for clients wanting real-time updates $webSock = new React\Socket\Server($loop); $webSock->listen(8080, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect $webServer = new Ratchet\Server\IoServer(new Ratchet\Http\HttpServer(new Ratchet\WebSocket\WsServer(new Ratchet\Wamp\WampServer(new ExGame\Server()))), $webSock); $router = new ExHttp\Router(); $fileHandler = new StaticFile($documentRoot, $loop); $router->setFileHandler($fileHandler); $httpSocket = new React\Socket\Server($loop); $httpSocket->listen(81, '0.0.0.0'); $httpServer = new IoServer(new HttpServer(new ConnectionHandler($router)), $httpSocket, $loop); $loop->run();