websocket 西部数码php_在PHP服务中使用Websocket
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相关推荐
- websocket 西部数码php_网页实时聊天之PHP实现websocket
前言 websocket 作为 HTML5 里一个新的特性一直很受人关注,因为它真的非常酷,打破了 http "请求-响应"的常规思维,实现了服务器向客户端主动推送消息,本文介绍如 ...
- 西部数码虚拟主机隐藏路由中的index.php
虚拟主机和服务器部署起来还是有所差别,使用thinkcmf和fastadmin开发的项目,放到虚拟主机上,没有直接权限将项目主域名指向public目录下,而客户又偏要使用主域名,于是只有将wwwroo ...
- 5月“.公司”域名注册总量TOP15:西部数码第四
IDC评述网(idcps.com)05月18日报道:根据ntldstats.com发布的最新数据显示,截止至5月15日17:00,在国内外".公司"域名总量十五强域名商中,仅西部数 ...
- js中使用websocket
后端地址是http的 websocket地址 ws开头:后端地址是https的,websocket地址wss开头: 对于websocket没有跨域的问题 import { MessageBox } ...
- ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息
找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...
- 如何在 Knative 中部署 WebSocket 和 gRPC 服务?
作者 | 冬岛 阿里云容器平台工程师 导读:虽然说 Knative 默认就支持 WebSocket 和 gRPC,但在使用中会发现,有时想要把自己的 WebSocket 或 gRPC 部署到 Knat ...
- .net5 WebAPI中搭建WebSocket服务端
背景:需要开发一个WebSocket服务端,用来向h5客户端推送消息:以前的做法是直接做一个windows服务,专门开一个端口来进行WebSocket连接,现在可以在.net5 WebAPI中直接支持 ...
- 西部数码域名解析到阿里云_西部数码云主机好吗 稳定性如何
随着云计算技术的不断发展,我国云计算市场的经济效益也在日渐扩大,各个云服务商之间的竞争异常激烈.在这种环境下,备受人们关注的云服务企业主要呈现两大类,一是互联网巨头背景的阿里云.腾讯云等:二是以西部数 ...
- 西部数码服务器绑定域名解析,中国数据域名如何修改DNS设置方法
在中国数据注册的域名,DNS默认为中国数据DNS服务器(例如:dns1.zgsj.com.dns5.4cun.com). 为了方便管理,使用西部数码的智能DNS解析服务,可以将域名的DNS修改为西部数 ...
最新文章
- 阿里巴巴笔试题-马尔科夫(HMM)的特征
- 在docker中搭建apache Tomcat+JDK环境
- 51单片机中变量的存储 xdata bdata idata pdata区别
- 用python计算pi的值_如何使用python中的series计算pi的值?
- 【攻防世界003】re-for-50-plz-50
- 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程
- shell下的常用语句
- oracle 多版本技术,读书笔记: 关于oracle中多版本的问题
- Flutter实战一Flutter聊天应用(十八)
- structs - 标签库(html)
- Devops 05 Jenkins
- Boost PFC参数计算——交流电的基本概念与推导
- [生存志] 第96节 南华著真经
- 给定divId,滚动条滚到相应位置
- 广度优先算法之狄克斯特拉算法
- js如何给php传图片,JavaScript怎么上传图片
- DorisDB系列文档(三)基本原理
- 大商创MySQL不支持_大商创配置文件config.php详解
- axure交互页面设计【学习篇01】
- C-DOCSIS上行信道
热门文章
- Android 头 5 年最重要的 20 个里程碑
- VMware Workstation物理内存不足,无法使用配置的设置开启虚拟机。
- kattis Block Game + Chess Tournament + Completing the Square + Millionaire Madness
- 7.【kafka运维】 kafka-consumer-groups.sh消费者组管理
- Python键盘监听-捕获输入的键值-鼠标监听
- 深度使用指南:.NET的Colors类
- uniapp修改个人头像或是上传照片,或者自拍
- pdfbox创建pdf_PDFBox之文档创建
- java pdfbox 解析报错_pdfBox 解析 pdf文件
- SQL Server中的聚集索引(clustered index) 和 非聚集索引 (non-clustered index)