资讯专栏INFORMATION COLUMN

php只能做网站?基于swoole+websocket开发双向通信应用

琛h。 / 2750人阅读

摘要:那么,是否就无法用来开发双向通信的应用呢答案是否定的。内置通信支持,可以与程序基于进行双向通信。通信协议于年被定为标准,并由补充规范。

前言

众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷。而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息。因此,一些实时性要求比较高的应用,如实时聊天、直播应用、在线网页游戏等,就不适合采用HTTP协议。即使采用客户端主动轮询的方式来间接实现双向通信,也会较大地增加服务器的负担,增大代码的复杂性,不利于维护。

那么,是否PHP就无法用来开发双向通信的应用呢?

答案是否定的。PHP内置socket通信支持,可以与linux程序基于socket进行双向通信。php swoole框架封装了一个websocket服务端,基于此可以很方便地建立一个与html5的websocket客户端进行通信的服务。

一、 Swoole介绍

Swoole是一个面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升。

swoole支持用于搭建多种server,包括http server、websocket server、tcp server、redis server等等。这里我们使用到的是其中的websocket server。

二、WebSocket介绍

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

简单地来说,websocket协议实现了浏览器和服务器之间的双向通信。而html5原生支持websocket协议。

三、swoole websocket 服务端demo
1.安装swoole

swoole以php扩展的形式进行加载,首先需要为你的php安装swoole扩展,安装命令如下:

pecl install swoole

安装成功后在php.ini文件加上extension=swoole.so加载扩展

2.启动服务端

新建一个php文件,文件名为server.php,文件内容如下:

$server = new SwooleWebSocketServer("0.0.0.0", 9501);
$server->on("open", function (SwooleWebSocketServer $server, $request) {
        echo "server: handshake success with fd{$request->fd}
";
    });
$server->on("message", function (SwooleWebSocketServer $server, $frame) {
        echo "receive from {$frame->fd}:{$frame->data}
";
        $server->push($frame->fd, "this is server");
    });
$server->on("close", function ($ser, $fd) {
        echo "client {$fd} closed
";
    });
$server->on("request", function (SwooleHttpRequest $request, SwooleHttpResponse $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 启动服务。

四、HTML5 WebSocket 客户端demo
1.客户端代码

新建一个testServer.html文件,写入以下内容:




   测试WebSocket



    



将【服务端IP】替换成swoole服务端ip,保存文件。

五、测试demo

(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开发效率高,可以更快、更高效地进行此类应用地开发,节约开发成本。

大家如果还有什么疑问,可以关注公众号“全栈社区”进行提问。


关注微信公众号“全栈社区”,可获取更多站长、开发者必备的前端、后端、服务器技术干货。

旭猫云19元VPS:美国VPS

旭猫云免备案空间:香港云主机

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/6815.html

相关文章

  • php只能网站基于swoole+websocket开发双向通信应用

    摘要:那么,是否就无法用来开发双向通信的应用呢答案是否定的。内置通信支持,可以与程序基于进行双向通信。通信协议于年被定为标准,并由补充规范。前言 众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷。而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息。因此,一些实时性要求比较高的应用,如实时聊天、直播应用、在线网页游戏等,就不适合采用HTTP协议...

    番茄西红柿 评论0 收藏0
  • Websocket解析及实现

    摘要:早期的轮询是通过不断自动刷新页面而实现的。长轮询的另一个问题是缺乏标准实现。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务器端的连接不过期。协议解析协议包含两部分一部分是握手,一部分是数据传输。 Websocket是什么? Websocket是一个因为应用场景越来越复杂而提出的,针对浏览器和web服务器之间双向持续通信而设计,而且优雅地兼容HTTP的协议(我猜想:同...

    XboxYan 评论0 收藏0
  • 2017年PHP程序员未来路在何方

    摘要:目前来看等语言还难以企及和。作为一个资深的开发者,在技术上给各位程序十点未来的建议,希望对大家有所帮助。开发者应当学习掌握规范,在开发程序时应当尽量遵循规范。程序员除了写后台程序之外,还有很大一部分工作在展现层,和浏览器前端打交道。 PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js 、 GO 、 Pytho...

    william 评论0 收藏0
  • 【天赢金创】PHP7与Swoole

    摘要:但在密集计算方面比等静态编译语言差几十倍甚至上百倍。一使用栈内存在引擎和扩展中,经常要创建一个的变量,底层就是一个指针。代码中创建的变量也进行了优化,直接在栈内存上预分配。应用层与底层在错误抛出的方式全部统一为异常。 原文:http://rango.swoole.com/archives/440最近PHP官方终于发布了传说中的PHP7,虽然只是alpha版。PHP7号称是新一代的PHP...

    MingjunYang 评论0 收藏0
  • websocket历史及使用详解

    摘要:握手客户端向服务端发起连接请求如图,我们在请求服务器的时候,发送了这样的。如图下面解释下字段的含义协议升级成功服务端处理之后的协议版本号协议升级为至此,握手成功下面就尽情的传输数据吧数据传输数据传输需要客户端,没什么好说的了。 一、阅前热身 什么是keep-alive 1、keep-alive只是客户端的一种建议 我们打开百度首页,进一步查看header。 showImg(https:...

    duan199226 评论0 收藏0

发表评论

0条评论

琛h。

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<