WebSocket

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

为什么需要 WebSocket?

需求是:用户停留页面 15 分钟,且没有任何操作,则弹出登陆窗口,让用户重新登陆。

一般这样的需求实现多为长连接轮询,会有浏览器的卡顿、服务端消耗及不容易维护等问题。

后来发现 websocket 这样的通讯方式,主要有以下优点:

建立在 TCP 协议之上,服务器端的实现比较容易。

手时不容易屏蔽,能通过各种 HTTP 代理服务器。

数据格式比较轻量,性能开销小,通信高效。

可以发送文本,也可以发送二进制数据。

没有同源限制,客户端可以与任意服务器通信。

协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

目标已经选定,那么如何实现呢?

PHP 已经有非常好用的异步网络通信框架 swoole,节省了自己实现 websocket 服务的时间。我的使用的是 laravel 框架,最终选择了 laravel-swoole 扩展。

安装配置

引入 laravel-swoole 扩展包 wiki 。启用 websocket.enabled 及其他相应的配置,通过下面的命名可以非常方便的管理服务:

php artisan swoole:http {start|stop|restart|reload|infos}

修改配置文件中的默认 handler 配置为自定义的类:主要是为了自定义 websocket 的生命周期中的一些回调。

/*

|--------------------------------------------------------------------------

| Websocket handler for onOpen and onClose callback

| Replace this handler if you want to customize your websocket handler

|--------------------------------------------------------------------------

*/

'handler' => \App\Listeners\Swoole\WebsocketHandler::class,

/*

|--------------------------------------------------------------------------

| Default frame parser

| Replace it if you want to customize your websocket payload

|--------------------------------------------------------------------------

*/

'parser' => SwooleTW\Http\Websocket\SocketIO\SocketIOParser::class,

当配置完成后,会在 routes 目录中添加一个名为 websocket.php 的文件。可以非常方便像定义 laravel 路由一样,定义各种事件。例如:

//Websocket::on('open', function ($websocket, Request $request) {

// Log::info('websocket','open 111 +' . $websocket->getSender());

//});

//

//Websocket::on('connect', function ($websocket, Request $request) {

// Log::info('websocket','Connected ++ 222' . $websocket->getSender());

// // called while socket on connect.

//});

//

//Websocket::on('disconnect', function ($websocket) {

// Log::info('websocket','Disconnected ++ 333' . $websocket->getSender());

// // called while socket on disconnect

//});

// 在 UserController 中的 checkLogin 方法上会带有$websocket, $data这两个参数。

Websocket::on('loginCheck', "App\Http\Controllers\Api\UserController@checkLogin");

Websocket::on('logout', "App\Http\Controllers\Api\UserController@sendLogout");

使用

控制器:

public function checkLogin($websocket, $data)

{

if (empty($data['holding'])) {

$websocket->emit('message', ['code' => self::HTTP_UNPROCESSABLE_ENTITY, 'message' => "参数错误"]);

return false;

}

$flag = true;

$step = 1;

while ($flag) {

$step++;

if ( ! $this->validateLoginStatus($data['holding'])) {

$websocket->emit('message', ['code' => self::HTTP_UNAUTHORIZED, 'message' => "登陆超时"]);

unset($step);

$flag = false;

}else {

if($step === 1) {

$websocket->emit('message', ['code' => self::HTTP_OK, 'message' => "success"]);

}

}

sleep(1);

}

}

前端调用

这里一定要注意数据包的结构,之前就踩了比较多的坑,API docs 才找到正确的结构:

var websocket = new WebSocket("ws://127.0.0.1:1215");

websocket.onopen = function (evt) {

console.log("已连接websocket服务器");

// 这里比较关键,通道建立后,可以进非常方便的进行轮询

setInterval(function() {

if (websocket.bufferedAmount == 0)

var data = {"holding": "eyJLQNDqj0y473pCJ6zjMTUyOTk5NzU1MgnVMQ==$d84XkeMCv7umajhMRiU"};

websocket.send(encodeMessage('loginCheck', data));

}, 50);

};

// 监听消息体

websocket.onmessage = function (evt) {

console.log(decodeMessage(evt.data))

};

// 监听关闭消息

websocket.onclose = function (evt) {

console.log("websocket close");

};

//监听连接错误信息

websocket.onerror = function (evt) {

console.log(evt);

};

function decodeMessage(str) {

return JSON.parse(str.substring(2))[1] || [];

}

function encodeMessage(event, data) {

return JSON.stringify([

event,

data

])

}

Swoole扩展安装

因为 swoole 的安装依赖 php 的 sockets 模块的开启。

安装 swoole

中间报错,需要安装以下依赖:

yum -y install gcc postgresql-devel gcc-c++

下载 swoole 扩展源码,安装 安装步骤 进行安装即可。

性能监控

查看当前

$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT 814

CLOSE_WAIT 1

FIN_WAIT1 1

ESTABLISHED 634

SYN_RECV 2

LAST_ACK 1

常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

删除进程

查看进程数

$ ps -eaf |grep "swoole" | grep -v "grep"| awk '{print $2}'|wc -l

批量删除进程:

$ ps -eaf |grep "swoole" | grep -v "grep"| awk '{print $2}'|xargs kill -9

重启服务。

参考文章

websocket 西部数码php_在PHP服务中使用Websocket相关推荐

  1. websocket 西部数码php_网页实时聊天之PHP实现websocket

    前言 websocket 作为 HTML5 里一个新的特性一直很受人关注,因为它真的非常酷,打破了 http "请求-响应"的常规思维,实现了服务器向客户端主动推送消息,本文介绍如 ...

  2. 西部数码虚拟主机隐藏路由中的index.php

    虚拟主机和服务器部署起来还是有所差别,使用thinkcmf和fastadmin开发的项目,放到虚拟主机上,没有直接权限将项目主域名指向public目录下,而客户又偏要使用主域名,于是只有将wwwroo ...

  3. 5月“.公司”域名注册总量TOP15:西部数码第四

    IDC评述网(idcps.com)05月18日报道:根据ntldstats.com发布的最新数据显示,截止至5月15日17:00,在国内外".公司"域名总量十五强域名商中,仅西部数 ...

  4. js中使用websocket

    后端地址是http的   websocket地址 ws开头:后端地址是https的,websocket地址wss开头: 对于websocket没有跨域的问题 import { MessageBox } ...

  5. ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息

    找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...

  6. 如何在 Knative 中部署 WebSocket 和 gRPC 服务?

    作者 | 冬岛 阿里云容器平台工程师 导读:虽然说 Knative 默认就支持 WebSocket 和 gRPC,但在使用中会发现,有时想要把自己的 WebSocket 或 gRPC 部署到 Knat ...

  7. .net5 WebAPI中搭建WebSocket服务端

    背景:需要开发一个WebSocket服务端,用来向h5客户端推送消息:以前的做法是直接做一个windows服务,专门开一个端口来进行WebSocket连接,现在可以在.net5 WebAPI中直接支持 ...

  8. 西部数码域名解析到阿里云_西部数码云主机好吗 稳定性如何

    随着云计算技术的不断发展,我国云计算市场的经济效益也在日渐扩大,各个云服务商之间的竞争异常激烈.在这种环境下,备受人们关注的云服务企业主要呈现两大类,一是互联网巨头背景的阿里云.腾讯云等:二是以西部数 ...

  9. 西部数码服务器绑定域名解析,中国数据域名如何修改DNS设置方法

    在中国数据注册的域名,DNS默认为中国数据DNS服务器(例如:dns1.zgsj.com.dns5.4cun.com). 为了方便管理,使用西部数码的智能DNS解析服务,可以将域名的DNS修改为西部数 ...

最新文章

  1. 阿里巴巴笔试题-马尔科夫(HMM)的特征
  2. 在docker中搭建apache Tomcat+JDK环境
  3. 51单片机中变量的存储 xdata bdata idata pdata区别
  4. 用python计算pi的值_如何使用python中的series计算pi的值?
  5. 【攻防世界003】re-for-50-plz-50
  6. 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程
  7. shell下的常用语句
  8. oracle 多版本技术,读书笔记: 关于oracle中多版本的问题
  9. Flutter实战一Flutter聊天应用(十八)
  10. structs - 标签库(html)
  11. Devops 05 Jenkins
  12. Boost PFC参数计算——交流电的基本概念与推导
  13. [生存志] 第96节 南华著真经
  14. 给定divId,滚动条滚到相应位置
  15. 广度优先算法之狄克斯特拉算法
  16. js如何给php传图片,JavaScript怎么上传图片
  17. DorisDB系列文档(三)基本原理
  18. 大商创MySQL不支持_大商创配置文件config.php详解
  19. axure交互页面设计【学习篇01】
  20. C-DOCSIS上行信道

热门文章

  1. Android 头 5 年最重要的 20 个里程碑
  2. VMware Workstation物理内存不足,无法使用配置的设置开启虚拟机。
  3. kattis Block Game + Chess Tournament + Completing the Square + Millionaire Madness
  4. 7.【kafka运维】 kafka-consumer-groups.sh消费者组管理
  5. Python键盘监听-捕获输入的键值-鼠标监听
  6. 深度使用指南:.NET的Colors类
  7. uniapp修改个人头像或是上传照片,或者自拍
  8. pdfbox创建pdf_PDFBox之文档创建
  9. java pdfbox 解析报错_pdfBox 解析 pdf文件
  10. SQL Server中的聚集索引(clustered index) 和 非聚集索引 (non-clustered index)