0

我正在尝试使用 Ratchet 创建一个实时 Symfony 应用程序,但我不知道我应该将 WampServerInterface 和服务器脚本放在哪里(在 symfony 服务或某个类中)以及我应该如何从我的 appController 调用它

4

2 回答 2

1

最好的方法是将您的提供者配置为服务,并通过构造函数或设置器注入将其注入控制器。

您也可以注入整个容器并从那里获取它,但出于性能和可测试性的原因,不建议这样做。

于 2013-05-25T22:24:41.687 回答
1

首先,您需要从命令行运行棘轮服务器。

你可能会选择使用 symfony CLI,因为那是让你开始的最简单的方法。我还没有测试过以下任何代码,但类似下面的代码就可以了。

<?php
namespace MyOrg\MyBundle\Command
{

    use 
        // Symcony CLI
        Symfony\Component\Console\Input\InputArgument,
        Symfony\Component\Console\Input\InputInterface,
        Symfony\Component\Console\Input\InputOption,
        Symfony\Component\Console\Output\OutputInterface,
        Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand,

        // Ratchet classes are used with full paths in execute() 

        // Your ratchet app class (e.g. https://github.com/cboden/Ratchet-examples/blob/master/src/Ratchet/Website/ChatRoom.php)
        MyOrg\MyBundle\MyRatchetAppClass;        

    class RatchetServerCommand extends ContainerAwareCommand
    {

        protected function configure(){
            $this
                ->setName('myorg:ratchet')
                ->setDescription('Start ratchet server');
        }

        protected function execute(InputInterface $input, OutputInterface $output)
        {

            $loop   = \React\EventLoop\Factory::create();
            $app = new MyRatchetAppClass();

            // Set up our WebSocket server for clients wanting real-time updates

            $webSock = new \React\Socket\Server($loop);

            $webSock->listen(88, 'YOURSERVER.COM');

            $webServer = new \Ratchet\Server\IoServer(
                new \Ratchet\Http\HttpServer(
                    new \Ratchet\WebSocket\WsServer(
                        new \Ratchet\Wamp\WampServer(
                            $app
                        )
                    )
                ),
                $webSock
            );

            $loop->run();            
        }
    }
}

然后使用 symfony cli 启动服务器:

php app/console myorg:ratchet

最后,您将在端口 88 上运行棘轮服务器。

之后,使用 websocket 库进行连接和测试。我在下面的示例中使用 [autobahnjs]:

ab.connect(
   // The WebSocket URI of the WAMP server
   'ws://yourserver.com:88',

   // The onconnect handler
   function (session) {
      alert('Connected');
   },

   // The onhangup handler
   function (code, reason, detail) {
      alert('unable to connect...');
   }
);
于 2014-02-13T17:57:24.983 回答