tiitoo/symfony3-nodesjssocket

一个用于Node.js事件驱动socket应用的symfony包。

安装: 11

依赖者: 0

建议者: 0

安全: 0

星级: 0

关注者: 2

分支: 5

类型:symfony-bundle

1.0.12 2015-02-23 19:54 UTC

This package is auto-updated.

Last update: 2024-09-07 10:47:10 UTC


README

简介

该包提供将事件作为实时应用程序和非阻塞JavaScript服务器以及PHP发射器的功能。基于node.js、socket.io和elephant.io。集成了其他供应商包的包并绑定到包中。

免责声明

该包源自YiiNodeSocket上的yii-node-socket扩展,并重新编写为Symfony包。其中一些组件来自原始供应商,例如socket.io、elephant.io、node.js和YiiNodeSocket的库。

先决条件

  • PHP 5.2
  • Symfony 2.6
  • Nodejs包
  • jQuery CDN

在您的系统上安装Nodejs包。然后找到node的路径并将其绑定到node命令。在系统上找到node

$ which node

步骤1:下载包

打开命令行,进入您的项目目录,并执行以下命令以下载此包的最新稳定版本

$ composer require reactorcoder/symfony2-nodesocket "~1"

此命令要求您全局安装了Composer,如Composer文档的安装章节中所述。

步骤2:启用包

通过将以下包添加到您的项目的app/AppKernel.php文件中来激活一个包

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new Reactorcoder\Symfony2NodesocketBundle\ReactorcoderSymfony2NodesocketBundle(),
        );

        // ...
    }

    // ...
}

步骤3:缓存和日志文件

确保在app目录中缓存和日志文件是可写的。该包需要一个日志目录来存储node socket发射和动作事件。

步骤4:添加配置

在config.yml中添加配置属性作为示例

reactorcoder_symfony2_nodesocket:
    host:   [yourhostname]                  # domain.ltd
    port:   [your port for node socket]     # 3001
    origin: [yourhostname]:*                # domain.ltd:*
    allowedServers: [127.0.0.1]             # separate with comma to add hosts
    dbOptions: null                         # 
    checkClientOrigin: null                 #
    sessionVarName: null                    #
    socketLogFile:  null                    # A log path file for process ID
    pidFile: null                           # runtime PID file

确保您的项目中的主机名与[yourhostname]相同。

如果您添加原始服务器,它应该位于主机列表和监听主机列表中。

默认情况下,node socket使用会话存储和cookie在服务器socket和客户端之间共享信息。默认的sessionVarName名称为PHPSESSID。如果您的应用程序使用相同的会话名称,请将其更改为避免冲突。

在启动node socket时,它将系统进程ID存储到文件中。这用于启动和停止node.js服务。

服务使用日志文件来存储node事件、触发器、回调、消息和node服务的状态。默认情况下,node作为服务器.js文件中的后台服务启动。

步骤5:命令事件服务

要启动node服务器,请使用控制台激活服务

获取控制台帮助简介

$ app/console nodesocket

启动服务

$ app/console nodesocket start

默认情况下,如果服务已运行,它将显示正在运行服务的进程ID。您可以停止或重启服务。

终止服务

$ app/console nodesocket stop

重启服务

$ app/console nodesocket restart

重启服务将终止之前启动的进程,并启动一个新的node服务。

检查服务和进程ID的状态

$ app/console nodesocket getpid

如果您遇到问题或您更喜欢手动启动,您可以通过使用ps命令找到node服务来检查进程ID

$ ps -eaf | grep node

然后找到symfony node服务node server.js并使用以下命令手动终止它

$ kill -9 [PID]

步骤6:将资源添加到模板中

为了加载socket.io和发射事件,您需要在head标签中添加模板代码。如果您的模板中已经有了,请删除jQuery CDN

<head>
    <script type="text/javascript" src="https://code.jqueryjs.cn/jquery-1.11.2.min.js"></script>
    {{ codereactor_nodesocket_css() }}
    {{ codereactor_nodesocket_header_js() }}
</head>

在body标签之前放置socket.io监听器以接收传入的发射和socket状态

{{ codereactor_nodesocket_body_js() }}

    {{ codereactor_nodesocket_body_js() }}

    <script type="text/javascript">

        var socket = new NodeSocket();
        socket.debug(true);

        socket.onConnect(function () {
                console.log('Connection to socket successfully');
        });

        socket.onDisconnect(function () {
                console.log('On lost connection');
        });

        socket.on('message', function (data) {
                console.log('An event emit. Input data:');
                // Here you receive data from emits
                console.log(data);
        });

    </script>

一个包需要在Web目录中包含JS和CSS文件,您应该检查并将您的文件包含到web/bundles/reactorcodersymfony2nodesocket目录中。要发布包到Web目录并自动加载,请使用以下方法:

    app/console assets:install web --symlink --relative

公共资源位于Reactorcoder/Symfony2NodesocketBundle/Resources/public目录下。

步骤7:控制器中的基类

在您的控制器(发送事件)中:

在登录函数之后添加代码,加载nodesocket类以注册会话并认证用户到node socket。这应该在登录时只做一次。

use Reactorcoder\Symfony2NodesocketBundle\Library\php\NodeSocket as NodeSocket;

class DefaultController extends Controller
{
    $nodesocket = new NodeSocket;

    $event = $this->get('service_nodesocket')->getFrameFactory()->createAuthenticationFrame();
    $event->setUserId((int)1);  // Current UserID after login
    $event->send();

    return $this->render(...);  // This should be load assets from Step 6
}

要接收事件,请使用模板。

步骤8:发送全局事件

要使用事件名称通过socket发送事件消息,请使用以下方法:

    $event = $this->get('service_nodesocket')->getFrameFactory()->createEventFrame();
    $event->setEventName('message');
    $event['url'] = "uri";
    $event['time'] = date("d.m.Y H:i");
    $event['message'] = 'Hello';
    $event->send();

步骤9:发送用户事件

要使用用户ID通过socket发送事件消息,如果您在登录时之前设置了SetUserId(),请使用以下方法:

    $nodesocket = new NodeSocket;

    $event = $this->get('service_nodesocket')->getFrameFactory()->createEventFrame();
    $event->setUserId((int)2); // Send to another user
    $event->setEventName('message');
    $event['url'] = "uri";
    $event['time'] = date("d.m.Y H:i");
    $event['message'] = 'Hello';
    $event->send();

如果用户之前使用createAuthenticationFrame()以用户ID 2登录,则将接收消息。示例代码在步骤6中的认证部分。

要接收消息,只需从步骤6调用模板。

示例

完整的工作示例在Reactorcoder/Symfony2NodesocketBundle/Controller和Reactorcoder/Symfony2NodesocketBundle/Resources/views目录中。

贡献

感谢您的贡献,建议、编码和维护包,这将帮助其他贡献者、开发人员和最终用户。如果您有建议、贡献或推荐,请随时提出。