老司机带你用 PHP 实现 Websocket 协议

本文详述了使用PHP实现Websocket协议的过程,从基础知识如socket编程、位运算、二进制数据处理到Websocket协议的工作流程、数据包格式、握手阶段、协议解析等核心内容,帮助读者深入理解Websocket协议。作者提供了简化版的PHP实现代码,并鼓励读者下载实践,以加深理解。同时,文章还提及了Websocket相对于HTTP的优势及其广泛应用。
摘要由CSDN通过智能技术生成

    当初作为编程小白的我,刚刚从事后台工作,觉得 http 是个很牛逼的东西,然而后面随着自己深入学习并实践之后,觉得原来和我所想的天壤之别,没大家想象的那么复杂,仅仅是个协议嘛!。后面学习的东西多了,慢慢的就淡定了。今天这里之所以要讲 websocket,而不是其它的协议,从某种意义上来说(请允许我装个逼),更能说明问题,如果你把 websocket 都搞懂了,那么 http 对于你来说,简直就是雕虫小技啊,关于 websocket 的代码,以前我使用 C 和 C++ 写的,但是为了 PHP 的 coder(PHP 是世界上最好的语言)能明白,我用 PHP 重新写了一遍,但是个精简版,对于我们彻底搞懂 websocket,理解它的精华所在,已经足够了。代码我已经上传到了码云(php-websocket-base-implemention),请大家一定一定要下载下来,并亲自运行实践才是检验真理的唯一标准啊,代码是完全可以运行的,如果运行的时候有障碍,请联系我。该博文差不多修修改改了 3 天(幸亏公司里面事不多),尽可能的给大家讲清楚。突然感觉,写文章好累啊,这都不重要,希望大家能够看懂,不然我写的就没啥用了。更希望大家遇到不懂的,提出疑问。写完之后,我再次审查了当前博文的内容,修改了一些拼写错误,可能还会有一些漏网之鱼,希望大家多多指正。

    phper在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家需要的(点击→)我的官方群

准备工作

在阅读这篇博文之前,需要大家有一定的基础知识储备,下面我会给大家列出来,先装一下逼

socket 基础

基本的 socket 编程技能,如果你不知道,也不要慌,以防万一,我已经为大家准备好了,请参考 PHP 编写基本的 Socket 程序

位运算

因为在一般的 php 编程当中,很少遇到会有位操作的情况,所以遗忘和不熟悉就理所当然了,我们可以参考 php 官方文档,但是我还是要讲一点,异或(^)操作,请看下面,这个结论很重要,请大家一定要记住,切记切记,重要的事情讲三遍。

a ^ b = c  可以推导出 c ^ b = a

二进制数据和文本数据

是不是有的时候打开一个文件显示乱码,就像下面这样

因为你打开的是二进制数据,二进制数据和文本数据的最根本的区别就是在数字的存储,举个例子,假设数字 int a=100,我们假设它会占用 4 个字节的空间,但是注意了,如果将它作为字符串存储,结果只需要三个字节(每一位占用一个字节),文本软件不管这些啊,都当做文本,显示的内容就成了乱码了。因此如果某个二进制文件不是你写入的,想要解析它的内容,不太现实。

大端序和小端序,网络字节序

之所以存在这种说法,是因为不同的 CPU 架构下,多字节数据在内容中的存储格式有所不同,这里我们以 int(假设为 4 字节)数据 m(数据采用 16 进制格式)为例,m=0x12345678,来进行说明,请仔细体会 a,b,c,d 的内存地址依次增大。

  • 小端序,低字节存储在低位地址,高字节存储在高位地址,什么意思呢?此时 0x78 存储在 a,0x56 存储 b,0x34 存储 c,0x12 存储 d。
  • 大端序,高位字节存储在低位,低位字节存储在高位,此时 0x78 存储在 d,0x56 存储 c,0x34 存储 b,0x12 存储 a。
  • 网络字节序,网络字节序是大端字节序,这已经成为标准。

从上面的分析可以知道,当我们从网络数据中解析多字节数据时,是一定要考虑字节的顺序的,这就是我这里着重强调的原因。

协议的诞生

Websocket 协议如今应用非常广泛,,造成这一现象的很大原因,在于 http 协议的短暂性,客户端和服务器之间每一次的请求应答都需要建立 TCP 三次握手,这对于流量很大的服务器来说是非常恐怖的(系统级资源),所以这个时候 websocket 诞生了,具体的诞生日期是哪一年已经不得而知了,但是真正的标准化时间是在 2011 年,由 IETF 正式完成,具体请参考 RFC6455

协议工作流程

下面有一张图,可以说明这一点,该图片来自 Google,

ebsocket 协议和 http 协议都属于应用层协议(在 TCP/IP 之上),但是 websocket 协议相对于 http 协议多了一个握手(这个握手不是平时所说的 tcp 三次握手啊,注意了)的过程,从上面的图可以很清晰的看出来,http 是是一个文本协议,但是 websocket 有所不同,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值