众所周知,PHP用于开发基于HTTP协议的网站应用很是便捷。而HTTP协议是一种单向的通讯协议,只能接收客户端的请求,而后响应请求,不能主动向客户端推送信息。所以,一些实时性要求比较高的应用,如实时聊天、直播应用、在线网页游戏等,就不适合采用HTTP协议。即便采用客户端主动轮询的方式来间接实现双向通讯,也会较大地增长服务器的负担,增大代码的复杂性,不利于维护。php
那么,是否PHP就没法用来开发双向通讯的应用呢?html
答案是否认的。PHP内置socket通讯支持,能够与linux程序基于socket进行双向通讯。php swoole框架封装了一个websocket服务端,基于此能够很方便地创建一个与html5的websocket客户端进行通讯的服务。前端
Swoole是一个面向生产环境的 PHP 异步网络通讯引擎,使 PHP 开发人员能够编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 能够普遍应用于互联网、移动通讯、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 做为网络通讯框架,能够使企业 IT 研发团队的效率大大提高。html5
swoole支持用于搭建多种server,包括http server、websocket server、tcp server、redis server等等。这里咱们使用到的是其中的websocket server。linux
WebSocket是一种在单个TCP链接上进行全双工通讯的协议。WebSocket通讯协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,容许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只须要完成一次握手,二者之间就直接能够建立持久性的链接,并进行双向数据传输。web
简单地来讲,websocket协议实现了浏览器和服务器之间的双向通讯。而html5原生支持websocket协议。redis
swoole以php扩展的形式进行加载,首先须要为你的php安装swoole扩展,安装命令以下:后端
pecl install swoole
安装成功后在php.ini文件加上extension=swoole.so加载扩展浏览器
新建一个php文件,文件名为server.php,文件内容以下:服务器
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501); $server->on('open', function (Swoole\WebSocket\Server $server, $request) { echo "server: handshake success with fd{$request->fd}\n"; }); $server->on('message', function (Swoole\WebSocket\Server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data}\n"; $server->push($frame->fd, "this is server"); }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) { global $server;//调用外部的server // $server->connections 遍历全部websocket链接用户的fd,给全部用户推送 foreach ($server->connections as $fd) { // 须要先判断是不是正确的websocket链接,不然有可能会push失败 if ($server->isEstablished($fd)) { $server->push($fd, $request->get['message']); } } }); $server->start();
此服务监听本机的9501端口,运行命令 php server.php 启动服务。
新建一个testServer.html文件,写入如下内容:
<!doctype html> <html> <head> <title>测试WebSocket</title> </head> <body> <script> var ws = new WebSocket("ws://【服务端IP】:9501"); ws.onopen = function(event){ console.log("connected!"); ws.send("hello server,this is client!"); }; ws.onmessage= function(event){ console.log("server message:"+event.data); } ws.onclose = function(event){ console.log("closed!"); }; </script> </body> </html>
将【服务端IP】替换成swoole服务端ip,保存文件。
(1) 访问步骤四的客户端demo页面,首先与服务端创建链接,查看浏览器console log,能够看到显示:
connected!
(2) 查看linux控制台,能够看到显示:
server: handshake success with fd1
(3) 接着客户端向服务端发了一条消息,服务端控制台显示:
receive from fd1:hello server,this is client!
(4) 服务端收到消息后,向客户端回复了一条消息,客户端控制台显示:
server message:this is server
以上就是基于swoole+websocket开发双向通讯应用的简单演示,在线聊天、网页游戏等实时通讯的应用也可基于此方式进行开发。php开发效率高,能够更快、更高效地进行此类应用地开发,节约开发成本。
你们若是还有什么疑问,能够关注公众号“全栈社区”进行提问。