基于Swoole实现PHP与websocket聊天室


Posted in PHP onAugust 03, 2016

websocket

Websocket只是一个网络通信协议

就像 http、ftp等都是网络通信的协议;不要多想;

相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议;

WebSocket和HTTP的关系

基于Swoole实现PHP与websocket聊天室

有交集,但是并不是全部。

Websocket只是借用了HTTP的一部分协议来完成一次握手。(HTTP的三次握手,此处只完成一次)

http和websocket 请求头对比:

基于Swoole实现PHP与websocket聊天室

基于Swoole实现PHP与websocket聊天室

HTTP:

原来的时候,客户端通过http(骑马)带着信请求服务器,服务器处理请求(写回信),再次通过http(骑马)返回;链接断开;

WebSocket:

客户端通过http(骑马)带着信请求服务器,但同时,携带了Upgrade:websocketConnection:Upgrade(两根管子),服务器如果支持WebSocket协议(有两根管子的接口),使用Websocket协议返回可用信息(丢弃马匹),此后信息的传递,均使用这两个管子,除非有一方人为的将管子切断;若服务器不支持,客户端请求链接失败,返回错误信息;

http和websocket 响应头对比:

基于Swoole实现PHP与websocket聊天室

基于Swoole实现PHP与websocket聊天室

websocket和ajax轮询、long poll的区别

首先是 ajax轮询 ,ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息

场景再现:

客户端:啦啦啦,有没有新信息(Request)

服务端:没有(Response)

客户端:啦啦啦,有没有新信息(Request)

服务端:没有。。(Response)

客户端:啦啦啦,有没有新信息(Request)

服务端:你好烦啊,没有啊。。(Response)

客户端:啦啦啦,有没有新消息(Request)

服务端:好啦好啦,有啦给你。(Response)

客户端:啦啦啦,有没有新消息(Request)

服务端:。。。没。。。。没。。没有

long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不在论述;

从上面可以看出,轮询其实就是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。同时,http的每一次请求与响应结束后,服务器将客户端信息全部丢弃,下次请求,必须携带身份信息(cookie),无状态性

Websocket的出现,干净利落的解决了这些问题;

所以上面的情景可以做如下修改。

客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)

服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)

客户端:麻烦你有信息的时候推送给我噢。。

服务端:ok,有的时候会告诉你的。

客户端:balab开始斗图alabala

服务端:苍井空ala

客户端:流鼻血了,我擦……

服务端:哈哈布尔教育牛逼啊哈哈哈哈

服务端:笑死我了哈哈

Swoole

但是,为了用PHP配合HTML5完成一次WebSocket请求和响应,哥走过千山万水,在密林深处,发现了Swoole :

PHP语言的异步、并行、高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。

支持的服务:

HttpServer

WebSocket Server

TCP Server

TCP Client

Async-IO(异步)

Task(定时任务)

环境依赖:

仅支持Linux,FreeBSD,MacOS,3类操作系统

Linux内核版本2.3.32以上

PHP5.3.10以上版本

gcc4.4以上版本或者clang

cmake2.4+,编译为libswoole.so作为C/C++库时需要使用cmake

安装:

必须保证系统中有以下这些软件:

php-5.3.10 或更高版本

gcc-4.4 或更高版本

make

autoconf

Swoole是作为PHP扩展来运行的

安装(root权限):

cd swoole

phpize

./configure

make

sudo make install

配置php.ini

extension=swoole.so

想研究Swoole的同学,自己去看手册(虽然写的不好,但是还是能看懂的)

做一个聊天室

服务器端:socket.php

//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);

//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
  $fd[] = $request->fd;
  $GLOBALS['fd'][] = $fd;
  //$ws->push($request->fd, "hello, welcome\n");
});

//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
  $msg = 'from'.$frame->fd.":{$frame->data}\n";
//var_dump($GLOBALS['fd']);
//exit;
  foreach($GLOBALS['fd'] as $aa){
    foreach($aa as $i){
      $ws->push($i,$msg);
    }
  }
  // $ws->push($frame->fd, "server: {$frame->data}");
  // $ws->push($frame->fd, "server: {$frame->data}");
});

//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
  echo "client-{$fd} is closed\n";
});

$ws->start();

客户端:Socket.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="发送数据" onclick="song()">
</body>
<script>
  var msg = document.getElementById("msg");
  var wsServer = 'ws://192.168.1.253:9502';
  //调用websocket对象建立连接:
  //参数:ws/wss(加密)://ip:port (字符串)
  var websocket = new WebSocket(wsServer);
  //onopen监听连接打开
  websocket.onopen = function (evt) {
    //websocket.readyState 属性:
    /*
    CONNECTING  0  The connection is not yet open.
    OPEN  1  The connection is open and ready to communicate.
    CLOSING  2  The connection is in the process of closing.
    CLOSED  3  The connection is closed or couldn't be opened.
    */
    msg.innerHTML = websocket.readyState;
  };

  function song(){
    var text = document.getElementById('text').value;
    document.getElementById('text').value = '';
    //向服务器发送数据
    websocket.send(text);
  }
   //监听连接关闭
//  websocket.onclose = function (evt) {
//    console.log("Disconnected");
//  };

  //onmessage 监听服务器数据推送
  websocket.onmessage = function (evt) {
    msg.innerHTML += evt.data +'<br>';
//    console.log('Retrieved data from server: ' + evt.data);
  };
//监听连接错误信息
//  websocket.onerror = function (evt, e) {
//    console.log('Error occured: ' + evt.data);
//  };

</script>
</html>

以上就是基于Swoole实现PHP与websocket聊天室的全部内容,相信本文对大家学习PHP和websocket及开发聊天室很有帮助。

PHP 相关文章推荐
PHP 循环列出目录内容的函数代码
May 26 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
PHP面向对象精要总结
Nov 07 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
php简单实现多维数组排序的方法
Sep 30 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
浅析php如何实现App常用的秒发功能
Aug 03 #PHP
php微信开发之带参数二维码的使用
Aug 03 #PHP
PHP支付系统设计与典型案例分享
Aug 02 #PHP
php微信支付接口开发程序
Aug 02 #PHP
比较完整的微信开发php代码
Aug 02 #PHP
微信利用PHP创建自定义菜单的方法
Aug 01 #PHP
php微信浏览器分享设置以及回调详解
Aug 01 #PHP
You might like
php查询mssql出现乱码的解决方法
2014/12/29 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
python数组过滤实现方法
2015/07/27 Python
详解Python之unittest单元测试代码
2018/01/24 Python
python得到单词模式的示例
2018/10/15 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
Python 内存管理机制全面分析
2021/01/16 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
心得体会开头
2014/01/01 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
教师学习培训邀请函
2014/02/04 职场文书
表彰大会主持词
2014/03/26 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
质检员工作总结2015
2015/04/25 职场文书
被委托人身份证明
2015/08/07 职场文书
外出培训学习心得体会
2016/01/18 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书