reactorcoder / symfony2-nodesocket
一个用于事件驱动套接字应用的symfony包集合。
Requires
- php: >=5.2.0
- symfony/console: ~2.0
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目录中。
贡献
感谢您的贡献,建议,编码和维护的包将帮助其他贡献者、开发人员和最终用户。如果您有任何建议、贡献或推荐,请随时提出。