带有棘轮的PHP WebSockets - 示例不起作用

时间:2013-12-24 16:38:29

标签: javascript php linux websocket ratchet

首先是一些背景知识。

  1. 我的目标是使用Ratchet WebSockets创建双向客户端 - 服务器通信。

  2. 我已经安装了棘轮和附带软件,如here所述。

  3. 我已成功创建了一个Hello World应用程序,如here所述。

  4. 现在我正在尝试使用this教程创建Push功能。我复制了代码,稍微修改了一下(下面的代码注释中提到了修改),安装了ZMQ库(最新版本,将其添加到php.ini,显示在php -m - 简而言之,它已正确安装)。但是WebSockets不起作用。

  5. 我将在下面的测试过程中提供真实的实时链接,以便您自行查看。

    1. 我的推送服务器与教程中的推送服务器完全相同,IP已更改为我服务器的IP。我通过SSH运行它,似乎连接正确。

    2. 我的Pusher类位于MyApp命名空间中,与教程中的代码和位置相同。

    3. 我的post.php略有修改,因为没有必要打扰MySQL查询:

    4. $entryData = array(        //hard-coded content of $entryData for simplicity
          'cat'     => "macka"
        , 'title'   => "naslov"
        , 'article' => "tekst"
        , 'when'    => time()
      );
      
      // This is our new stuff
      $context = new ZMQContext();
      $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
      $socket->connect("tcp://light-speed-games.com:5555");       //my domain, still using port 5555 as in their example
      
      $socket->send(json_encode($entryData));
      

      此文件位于here

      1. 我的client.php和他们的一样,除了我必须为IE添加一些修复工具when.js。我的问题与浏览器无关,与添加修复程序之前的问题相同。
      2. <script>
            window.define = function(factory) {    //my addition
                try{ delete window.define; } catch(e){ window.define = void 0; } // IE
                window.when = factory();
            };
            window.define.amd = {};
        </script>
        <script src="/apps/scripts/when.js"></script> 
        <script src="http://autobahn.s3.amazonaws.com/js/autobahn.min.js"></script>
        <script>
            var conn = new ab.Session(
                'ws://light-speed-games.com:8080' // The host (our Ratchet WebSocket server) to connect to
              , function() {            // Once the connection has been established
                    conn.subscribe('kittensCategory', function(topic, data) {
                        // This is where you would add the new article to the DOM (beyond the scope of this tutorial)
                        console.log('New article published to category "' + topic + '" : ' + data.title);
                    });
                }
              , function() {            // When the connection is closed
                    console.warn('WebSocket connection closed');
                }
              , {                       // Additional parameters, we're ignoring the WAMP sub-protocol for older browsers
                    'skipSubprotocolCheck': true
                }
            );
        </script>
        

        此文件位于here

        理论上,应该发生什么是这样的(例如):我在​​Chrome中打开client.php并启用了控制台;然后我在Firefox中打开post.php; Chrome的控制台应显示消息“发布新文章...”等(来自conn.subscribe中的client.php功能)。但是,当我这样做时,没有任何反应。连接保持打开状态(在我通过SSH关闭push-server.php之前,不会显示“连接已关闭”错误)。控制台仍然是空的。

        我认为这是过去几天的所有相关信息,其中很大一部分是我花在试图解决这个问题上的。但是,我甚至无法确定问题是否与代码或某些服务器配置设置有关,我可能不知道。所以,我来找你,希望有人能指出我正确的方向。

        重要编辑

        我很确定问题是Autobahn.js方法conn.subscribe无法正常工作。正在建立联系。当我将代码更改为:

        function() {            // Once the connection has been established
                    console.log('Connection established');
                    conn.subscribe('kittensCategory', function(topic, data) {
                        // This is where you would add the new article to the DOM (beyond the scope of this tutorial)
                        console.log('New article published to category "' + topic + '" : ' + data.title);
                    });
                }
        

        然后在控制台中正确显示Connection established。所以我认为我们需要对subscribe方法进行故障排除。如果有人可以向我解释它是如何工作的,以及究竟应该是什么“主题”和“数据”,那将会有很大的帮助。 Autobahn文档使用URL作为此方法的参数(请参阅here)。

2 个答案:

答案 0 :(得分:7)

您的客户正在kittensCategory中查找文章,但您要发送类别macka。试试这个:

$entryData = array(
    'cat'     => "kittensCategory",
    'title'   => "naslov",
    'article' => "tekst",
    'when'    => time()
);

答案 1 :(得分:4)

在端口8080上看到主机light-speed-games.com无法正常运行是否正确?如果没有,我会建议解决这个问题,因为它可能会导致你的问题。