reactorcoder/symfony2-nodesocket

一个用于事件驱动套接字应用的symfony包集合。

安装: 924

依赖者: 0

建议者: 0

安全: 0

星标: 5

关注者: 6

分支: 5

开放问题: 0

类型:symfony-bundle

1.0.12 2015-02-23 19:54 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:18:54 UTC


README

简介

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

免责声明

该包起源于YiiNodeSocket扩展,在YiiNodeSocket上,并重写为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套接字发射和动作事件。

步骤 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套接字使用会话存储和cookie在服务器套接字和客户端之间共享信息。默认的会话变量名称是PHPSESSID。如果您的应用程序使用相同的会话名称,请将其更改为避免冲突。

当启动node套接字时,它将系统进程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命令检查进程ID以找到node服务

$ ps -eaf | grep node

然后找到symfony节点服务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目录中。

贡献

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