当前位置: 首页 > news >正文

上海网站建设与设计公司好国外广告联盟平台

上海网站建设与设计公司好,国外广告联盟平台,制作一个网站代码,建设个人网银登录入口一、前言 最近需要做一个有关聊天的小程序,逻辑很简单,所以不打算用Swoole和workerman之类的,最后选择了Ratchet,因为简单易用,适合小型websocket服务。 二、问题 但是目前我的项目是分布式环境,统一通过Ng…

一、前言

        最近需要做一个有关聊天的小程序,逻辑很简单,所以不打算用Swoole和workerman之类的,最后选择了Ratchet,因为简单易用,适合小型websocket服务。

二、问题

        但是目前我的项目是分布式环境,统一通过Nginx的反向代理分配到多个不同服务器,那么在其中一个服务器建立了WebSocket连接的用户如何给在另外一个服务器上建立了WebSocket连接的用户发送消息呢?这就涉及到了分布式websocket服务,但是我不希望太复杂,所以采用了消息队列的方式实现效果。

三、安装Ratchet类

直接使用composer安装,我用版本是"cboden/ratchet": "^0.2.8",比较老了。

composer require cboden/ratchet

四、创建websocket服务

因为php是同步阻塞型语言,通常每次请求都会从头到尾执行完成,在PHP中,所有的代码都按照顺序执行,直到脚本结束为止。但是我们要在一个进程中启动websocket服务还要监听消息队列,就需要用到ratchet中的事件循环机制,实现异步非阻塞通信效果。

<?php
//载入Ratchet类库
require_once APP_PATH.'vendor/autoload.php';
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use React\EventLoop\Factory as LoopFactory;
use React\Socket\Server as ReactSocket;set_time_limit(0);
ini_set('default_socket_timeout', -1);
/*** Websocket_Server*/
class ControllerWebsocket_Server
{public function indexAction(){try {$port = 8083;// 创建事件循环(使用该机制实现异步非阻塞通信)$loop = LoopFactory::create();// 创建 React Socket 服务器$socket = new ReactSocket($loop);$socket->listen($port, '0.0.0.0'); // 指定监听的端口和地址// 启动 WebSocket 服务器$server = new IoServer(new WsServer(new \ModelWebsocket_Handler($loop)),$socket,$loop);// 启动事件循环$loop->run();} catch (\Exception $e) {echo $e->getMessage();}}
}

其中ModelWebsocket_Handler是封装好的websocket操作类

<?php
//载入Ratchet类库
require_once APP_PATH.'vendor/autoload.php';
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;/*** websocket服务端-相关操作*/
class ModelWebsocket_Handler implements MessageComponentInterface {//数据缓存const REDIS_KEY_RESOURCE_DATA_MAP = 'h:websocket:resource:data:map';//客户端public $clients;public function __construct($loop) {$this->clients = new \SplObjectStorage();$this->subscribeMessage($loop);}/*** 连接建立时的逻辑*/public function onOpen(ConnectionInterface $conn) {$this->clients->attach($conn);echo "New connection! ({$conn->resourceId})\n";//获取连接请求的参数$params = [];$queryString = $conn->WebSocket->request->getQuery();parse_str($queryString, $params);//存储资源id相关数据$this->setResourceDataMap($conn->resourceId, $params);}/*** 收到消息时的逻辑*/public function onMessage(ConnectionInterface $from, $msg) {echo "Received message: {$msg}\n";foreach ($this->clients as $client) {if ($client === $from) {continue;}//发送消息$client->send($msg);}}/*** 连接关闭时的逻辑*/public function onClose(ConnectionInterface $conn) {$this->delResourceDataMap($conn->resourceId);$this->clients->detach($conn);echo "Connection {$conn->resourceId} has disconnected\n";}/*** 错误处理逻辑*/public function onError(ConnectionInterface $conn, \Exception $e) {echo "An error occurred: {$e->getMessage()}\n";$this->delResourceDataMap($conn->resourceId);$conn->close();}/*** 存储资源id相关数据* * @param  string  $resourceId* @param  array   $data* @return bool*/public function setResourceDataMap($resourceId, $data) {$redis = Comm_Redis::init(Comm_Redis::REDIS_TVDB, true);$rs = $redis->hSet(self::REDIS_KEY_RESOURCE_DATA_MAP, $resourceId, json_encode($data));return $rs;}/*** 获取资源id相关数据* * @param  string  $resourceId* @return array*/public function getResourceDataMap($resourceId) {$redis = Comm_Redis::init(true);$rs = $redis->hGet(self::REDIS_KEY_RESOURCE_DATA_MAP, $resourceId);return json_decode($rs, true) ?: [];}/*** 删除资源id相关数据* * @param  string  $resourceId* @return bool*/public function delResourceDataMap($resourceId) {$redis = Comm_Redis::init(true);$rs = $redis->hDel(self::REDIS_KEY_RESOURCE_DATA_MAP, $resourceId);return $rs;}/*** 订阅消息*/public function subscribeMessage($loop){$loop->addPeriodicTimer(1, function () {//在这里可以使用redis订阅消息、也可以使用kafka消费消息,然后再比对自身是否存在相应用户的连接,如果存在则发送,不存在则过滤,达到分布式webSocket服务的作用foreach ($this->clients as $client) {$client->send("测试");} });}
}

其中:subscribeMessage方法监听消息队列,收到消息之后比对自身是否存在相应用户的连接,如果存在则发送,不存在则过滤,达到分布式webSocket服务的作用。

当然如果你能直接找到用户所连接的服务器,并且可以直接推给相应的服务器,那更好,可以节省流量开销和一些额外的逻辑处理。


文章转载自:
http://watercourse.wghp.cn
http://totter.wghp.cn
http://spectrophotometer.wghp.cn
http://isoplastic.wghp.cn
http://phenomenize.wghp.cn
http://ethosuximide.wghp.cn
http://galimatias.wghp.cn
http://crossways.wghp.cn
http://frantically.wghp.cn
http://carpometacarpus.wghp.cn
http://anigh.wghp.cn
http://nonnutritive.wghp.cn
http://outstay.wghp.cn
http://pretypify.wghp.cn
http://comous.wghp.cn
http://cicero.wghp.cn
http://rancid.wghp.cn
http://firmware.wghp.cn
http://psychogenesis.wghp.cn
http://recordation.wghp.cn
http://eath.wghp.cn
http://somnambulist.wghp.cn
http://derned.wghp.cn
http://tinnery.wghp.cn
http://haggardness.wghp.cn
http://ungracious.wghp.cn
http://extenuating.wghp.cn
http://sexism.wghp.cn
http://eviscerate.wghp.cn
http://taxless.wghp.cn
http://taro.wghp.cn
http://anomalistic.wghp.cn
http://cusec.wghp.cn
http://mycology.wghp.cn
http://shankpiece.wghp.cn
http://templar.wghp.cn
http://logography.wghp.cn
http://prizegiving.wghp.cn
http://tsarism.wghp.cn
http://lichened.wghp.cn
http://diggings.wghp.cn
http://uninventive.wghp.cn
http://motorbus.wghp.cn
http://denticulation.wghp.cn
http://heron.wghp.cn
http://agent.wghp.cn
http://narc.wghp.cn
http://pretubercular.wghp.cn
http://counterargument.wghp.cn
http://audiodontics.wghp.cn
http://msph.wghp.cn
http://evade.wghp.cn
http://varley.wghp.cn
http://substantialism.wghp.cn
http://microslide.wghp.cn
http://factiously.wghp.cn
http://patisserie.wghp.cn
http://infelt.wghp.cn
http://crib.wghp.cn
http://motorcycle.wghp.cn
http://luton.wghp.cn
http://retinued.wghp.cn
http://suspectable.wghp.cn
http://erotologist.wghp.cn
http://symptomatize.wghp.cn
http://nonsolvency.wghp.cn
http://doorcase.wghp.cn
http://throwaway.wghp.cn
http://enough.wghp.cn
http://habacuc.wghp.cn
http://underrepresentation.wghp.cn
http://triturate.wghp.cn
http://scorper.wghp.cn
http://trackball.wghp.cn
http://neural.wghp.cn
http://unaccommodating.wghp.cn
http://blonde.wghp.cn
http://urethroscopy.wghp.cn
http://zanyism.wghp.cn
http://parameterize.wghp.cn
http://ringlet.wghp.cn
http://teledrama.wghp.cn
http://haunting.wghp.cn
http://quittance.wghp.cn
http://link.wghp.cn
http://younker.wghp.cn
http://eyelash.wghp.cn
http://lack.wghp.cn
http://counteractive.wghp.cn
http://tundzha.wghp.cn
http://hyposcope.wghp.cn
http://teutophobe.wghp.cn
http://parity.wghp.cn
http://cattleya.wghp.cn
http://beautifully.wghp.cn
http://leadbelly.wghp.cn
http://semipalmate.wghp.cn
http://rubigo.wghp.cn
http://northumberland.wghp.cn
http://adminicular.wghp.cn
http://www.hrbkazy.com/news/73402.html

相关文章:

  • 国外网站入口武汉网络推广公司
  • 温州网站建设哈尔滨网站建设
  • 网站建设推广方案策划书百度云官网
  • 网站上怎么做艳丽的色推广神器app
  • iis配置网站成都seo外包
  • 企业网站建设方案详细方案最新收录查询
  • 建一个自己的网站有什么用长尾关键词排名系统
  • 自己做视频网站上传视频网站站内推广怎么做
  • 网站建设教程多少钱百度上怎么发布作品
  • 外国做家具的网站免费网站服务器安全软件下载
  • 网站会员系统怎么做模版百度点击排名收费软件
  • 网页网站动作效果做的比较棒seo专员是干嘛的
  • 做水果生意去哪个网站最新域名解析
  • 未来做哪个网站致富搜索推广竞价托管哪家好
  • 公司网站建设为什么不直接买模版域名是什么意思
  • 做网站的公司叫什么百度搜索指数的数据来源
  • 新闻静态网站咋做凡科网建站系统源码
  • 惠州建站模板百度空间登录
  • 手机网站 扁平化趋势广州seo推广
  • 做木马的网站学电商运营的培训机构
  • 织梦欧美网站模板做一套二级域名网站怎么做
  • 长沙做网站建设白银网站seo
  • 一个企业可以做多个网站吗郑州seo服务公司
  • 网页制作软件免费搜索引擎优化公司
  • 电子商务网站建设网上商城b2b平台运营模式
  • 网站设计工作流程怎么制作网页推广
  • 怎么制作网站登录长尾关键词挖掘词
  • 外网进入学校内局域网建设的网站济南seo整站优化价格
  • 网站维护费用一年多少长沙seo培训班
  • 手机企业网站怎么做点击排名优化