【问题标题】:how to use properly webSockets in Symfony2如何在 Symfony2 中正确使用 webSockets
【发布时间】:2013-07-05 23:07:39
【问题描述】:

我正在尝试在 Symfony2 中实现 websocket,

我发现这个http://socketo.me/ 看起来不错。

我从 Symfony 中试用它,它可以工作,这只是一个使用 telnet 的简单调用。但我不知道如何将它集成到 Symfony 中。

我想我必须创建一个服务,但我真的不知道哪种服务以及如何从客户端调用它

感谢您的帮助。

【问题讨论】:

    标签: php symfony websocket


    【解决方案1】:

    首先您应该创建一个服务。如果您想注入您的实体管理器和其他依赖项,请在此处进行。

    在 src/MyApp/MyBundle/Resources/config/services.yml:

    services:
        chat:
            class: MyApp\MyBundle\Chat
            arguments: 
                - @doctrine.orm.default_entity_manager
    

    在 src/MyApp/MyBundle/Chat.php 中:

    class Chat implements MessageComponentInterface {
        /**
         * @var \Doctrine\ORM\EntityManager
         */
        protected $em;
        /**
         * Constructor
         *
         * @param \Doctrine\ORM\EntityManager $em
         */
        public function __construct($em)
        {
            $this->em = $em;
        }
        // onOpen, onMessage, onClose, onError ...
    

    接下来,制作一个控制台命令来运行服务器。

    在 src/MyApp/MyBundle/Command/ServerCommand.php 中

    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;
    use Ratchet\Server\IoServer;
    
    class ServerCommand extends ContainerAwareCommand
    {
        protected function configure()
        {
            $this
                ->setName('chat:server')
                ->setDescription('Start the Chat server');
        }
    
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $chat = $this->getContainer()->get('chat');
            $server = IoServer::factory($chat, 8080);
            $server->run();
        }
    }
    

    现在您有了一个带有依赖注入的 Chat 类,您可以将服务器作为控制台命令运行。希望这会有所帮助!

    【讨论】:

    • 关于如何在普通的 php 托管服务上运行它的任何想法?我认为不可能只打开这样的端口,也不可能让进程长时间运行(也许是 crontab hack?)
    • 我不知道无法在您的托管服务上使用端口。听起来像是您需要与您的提供商讨论的事情!您可以查看此答案 stackoverflow.com/questions/17696344/… 作为如何使用 php 将服务器作为守护程序运行的示例。但是如果你使用的是 symfony,我会使用 Process 组件而不是 popen 和 passthru。如果你想问这个问题,我可以给你看我会使用的代码。
    • 像魅力一样工作!!!在 Symfony v2.4.2 + Ratchet v0.3.0 上测试通过作曲家安装的一切。为了测试,我用echo( "onOpen" . PHP_EOL ); 之类的回声填充回调,然后打开另一个终端并执行telnet 8080。在连接时我得到了onOpen,键入并按回车键得到onMessage。我发现无法通过CTRL-D 关闭,所以我关闭了发出telnet 的终端,并在SF2 终端中获得了onClose
    • 有趣的是,在棘轮服务器上使用学说在大多数情况下会导致“MySQL 服务器已消失”错误。事实上,默认情况下 MySQL 服务器将在 8 小时后关闭连接,并且 Doctrine 不会自动重新连接到服务器,您必须手动处理它(参见stackoverflow.com/a/26791224/738091)。
    猜你喜欢
    • 2017-06-09
    • 2016-07-22
    • 2020-05-25
    • 2013-10-29
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多