php 基于memcache Ajax长链接 ,实现web聊天室

2017-5-23 guoweidong php开发

Web 通信 之 长连接、长轮询(long polling)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。

一、什么是长连接、长轮询?

用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息。这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已。



二、优缺点

轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。


长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。

长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天


Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
优点:实现真正的即时通信,而不是伪即时。
缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
实例:网络互动游戏。

事例:web即时聊天室

首先准备3个文件:test.htm、get.php、set.php

html代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>
<meta charset="utf-8">
<center>
<div id="show" style="width: 270px;height: 300px;margin-right: 55px ;border: 1px solid;overflow: auto "></div>

<textarea  cols="30px" rows="10px"></textarea>
<button>发送</button>
</center>
</body>

<script type="text/javascript" charset="utf-8" src="./jquery-2.0.3.min.js"> </script>
<script>
    function get(obj) {
        if(obj==undefined){
            obj = '';
        }
        $.post('get.php',{'call':obj}, function (data) {
            if(data){

               //将返回的数据放入div中展示

                $('div').html(data.join('<br />'));
            }
            get();
        }, 'json')

    }
   $(function(){
        $("button").click(function(){

           //将聊天信息请求php接口放入memcache中

            $.post('set.php',{'content':$("textarea").val()})
        })

       //第一次访问

        get('one');
   })
</script>


get.php:


<?php
    //实例化memcache
    $memcache = new Memcache;
    $memcache->addServer('localhost','11211');
    //取memcache内容
    $data=$memcache->get('chat_data');
    if($_POST['call']=='one'){//第一次访问显示之前数据
        exit(json_encode($data));
    }
    $c=count($data);
    while(true){
        //如果有数据循环读出,没有的话终止循环
        $count=$memcache->get('chat_data');
        if(count($count)>$c){
            //json数据返回
            exit(json_encode($data));
        }
    }
?>


set.php


<?php
    //实例化memcache
    $memcache = new Memcache;
    $memcache->addServer('localhost','11211');
    //清除缓存
    //$memcache->flush();die;
    $data = $memcache->get('chat_data');
    //将缓存数据存入数组
    $data[] =$_POST['content'];
    $memcache->set('chat_data',$data,MEMCACHE_COMPRESSED,0);
    //var_dump($memcache->get('chat_data')) ;
    $memcache->close();

?>

ok!web聊天室 就完成了!

           

网站备案号:京ICP备11043289号-1 北京市公安局网络备案 海1101084571
版权所有 北京育灵童科技发展有限公司 Copyright © 2002-2024 www.elight.cn, All Rights Reserved