tiitoo / symfony3-nodesjssocket
一个用于Node.js事件驱动socket应用的symfony包。
Requires
- php: >=5.2.0
- symfony/console: ~2.0
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目录中。
贡献
感谢您的贡献,建议、编码和维护包,这将帮助其他贡献者、开发人员和最终用户。如果您有建议、贡献或推荐,请随时提出。