还在用Ajax轮询完成即时通讯?看看Swoole吧

Posted 脚本之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还在用Ajax轮询完成即时通讯?看看Swoole吧相关的知识,希望对你有一定的参考价值。

关键词:swoole

还在用Ajax轮询完成即时通讯?看看Swoole吧


 swoole是什么?

1.异步、并行、高性能

2.纯C编写

3.php扩展


swoole能做什么?

1.异步多线程服务器及客户端,

2.异步mysql、Redis、数据库连接池、任务队列

3.http/websocket服务器/客户端

4.异步文件读写

5.Swoole2.0支持协程


swoole应用到那里?

互联网、移动通信、企业软件、云计算、网络游戏、物联网、车联网


swoole应用案例

IM聊天:http://im.classba.com.cn/main.php

战旗TV:http://www.zhanqi.tv

虎牙直播:http://www.huya.com

YY语音:http://www.yy.com/


01

swoole安装需求

1.服务器版本:centos7/ubuntu16

2.php版本:php5.4

phpize
./configuremake
sudo make install

系统就会自动安装,如果提示phpize不存在的话,就需要安装一下phpize.
    另一种方式直接执行

    pecl install swoole
安装完成,需要更改php.ini的配置,将extension=swoole.so

php -m 查看是否有swoole扩展

Swoole创建TCP服务器

new swoole_server(string $host, int $port, int $mode = SWOOLE_PROCESS,int $sock_type = SWOOLE_SOCK_TCP);

bool swoole_server->on(string $event, mixed $callback);    

bool swoole_server->start()    开启TCP服务器

bool swoole_server->send(int $fd, string $data, int $reactorThreadId = 0);

function swoole_server->set(array $setting);


02

Swoole创建WEB服务器

swoole_http_response->header(string $key, string $value);

swoole_http_response->cookie(string $key, string $value = '', int $expire = 0 , string $path = '/', string $domain  = '', bool $secure = false , bool $httponly = false);

swoole_http_response->status(int $http_status_code);

swoole_http_response->gzip(int $level = 1);

bool swoole_http_response->write(string $data);

function swoole_http_response->sendfile(string $filename, int $offset = 0, int $length = 0);

swoole_http_response->end(string $html);


swoole_http_request

http请求对象,保存了Http客户端请求的相关信息,包括GET、POST、COOKIE、Header等。


03

Swoole搭建聊天室

server.php服务器文件

<?php

//创建websocket服务器对象,监听0.0.0.0:9502端口

$ws = new swoole_websocket_server("0.0.0.0", 9502);

//监听WebSocket连接打开事件

$ws->on('open', function ($ws, $request) {

    $GLOBALS['fd'][$request->fd]['id'] = $request->fd;// 设置用户ID 安顺序递增

    $GLOBALS['fd'][$request->fd]['name'] = '匿名用户';// 设置用户名

});

//监听WebSocket消息事件

$ws->on('message', function ($ws, $frame) {

    $msg = $GLOBALS['fd'][$frame->fd]['name'].":{$frame->data} ";

    if(strstr($frame->data,'#name#')){// 用户设置昵称

        $GLOBALS['fd'][$frame->fd]['name'] = str_replace('#name#','',$frame->data);

    }else{// 普通发送用户信息

        foreach($GLOBALS['fd'] as $i){// 发送数据到客户端

            $ws->push($i['id'],$msg);

        }

    }

});

//监听WebSocket连接关闭事件

$ws->on('close', function ($ws, $fd) {

    echo "客户端-{$fd} 断开连接 ";

    unset($GLOBALS['fd'][$fd]);// 清除 已经关闭的客户端

});

$ws->start();

前台页面

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title id="myTitle">IM</title>

    <link rel="stylesheet" href="static/css/index.css"/>

</head>

<body>

    <!--发送信息-->

    <div id="send_msg" class="main box-shadow" style="display: none;" >

        <div id="msg"></div>

        <div>

            <input type="text" id="text"><input type="submit" value="发送数据" onclick="send_msg()">

        </div>

    </div>

    <!--设置昵称-->

    <div id="setName" style="display: block;">

        <input type="text" id="myname"/>

        <input type="submit" value="设置昵称" onclick="send_name()"/>

    </div>

</body>

<script type="text/javascript"src="static/js/jquery-3.2.0.min.js"></script>

<script type="text/javascript" ></script>

<script type="text/javascript" ></script>

</html>

webSocket.js文件

var msg = document.getElementById("msg");

var wsServer = 'ws://192.168.50.151:9502';//调用websocket对象建立连接://参数:ws/wss(加密)://ip:port (字符串)

var websocket = new WebSocket(wsServer);

websocket.onopen = function (evt) {//onopen监听连接打开

    // 应该显示远程服务器连接成功

    //msg.innerHTML = websocket.readyState;

    //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.

     */

};

//onmessage 监听服务器数据推送

websocket.onmessage = function (evt) {

    msg.innerHTML += evt.data +'<br>';//不断递增的数据

    console.log('从服务器获取到的数据: ' + evt.data);

};

//监听连接关闭

websocket.onclose = function (evt) {

    console.log("服务器拒绝");

};

//监听连接错误信息

websocket.onerror = function (evt, e) {

    console.log('错误: ' + evt.data);

};

//发送信息

function send_msg(){

    var text = document.getElementById('text').value;// 获取数据

    document.getElementById('text').value = '';// 清空数据

    websocket.send(text);//向服务器发送数据

}

//发送昵称

function send_name(){

    var text = document.getElementById('myname').value;// 获取数据

    websocket.send("#name#"+text);//向服务器发送数据

    var myTitle = document.getElementById("myTitle");

    myTitle.innerHTML = "IM "+text;

    alert("设置成功");

    var setName = document.getElementById("setName");

    setName.style.display = "none";

    var send_msg = document.getElementById("send_msg");

    send_msg.style.display = "block";

}


04

大致效果呈现

还在用Ajax轮询完成即时通讯?看看Swoole吧
还在用Ajax轮询完成即时通讯?看看Swoole吧

05

福利时间到

学无止境,给各位热爱编程的小伙伴带来一个福利:

还在用Ajax轮询完成即时通讯?看看Swoole吧
还在用Ajax轮询完成即时通讯?看看Swoole吧

免费PHP技术交流群

进群即可领取源代码


扫描二维码加入免费PHP技术交流群,不定期会有初始redis、大型社交网站加密算法、自定义MVC框架、百万数据索引优化等免费知识分享课。




以上是关于还在用Ajax轮询完成即时通讯?看看Swoole吧的主要内容,如果未能解决你的问题,请参考以下文章

websocket实现原理

Web端即时通讯技术盘点:短轮询CometWebsocketSSE

即时通讯Web端开发:短轮询CometWebsocketSSE

ajax短轮询+php与服务器交互制作简易即时聊天网站

利用ajax短轮询+php与服务器交互制作简易即时聊天网站

深入即时通讯开发协议WebSocket协议细节