PHP笔记 – COMET长连接实例

5

demo.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>Comet Test</title>
<script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
(function($){
	function handleResponse(response){
	$('#content').append('<div>' + response['msg'] + '</div>');
	}
 
	var timestamp = 0;
	var url = './chat_backend.php';
	var noerror = true;
	var ajax;
 
	function connect() {
		ajax = $.ajax(url, {
			type: 'get',
			data: { 'timestamp' : timestamp },
			success: function(transport) {
				eval('var response = '+transport);
				timestamp = response['timestamp'];
				handleResponse(response);
				noerror = true;
			},
			complete: function(transport) {
				(!noerror) && setTimeout(function(){ connect() }, 5000) || connect();
				noerror = false;
			}
		});
	}
 
	function doRequest(request) {
		$.ajax(url, {
			type: 'get',
			data: { 'msg' : request }
		});
	}
 
	$('#cometForm').live('submit', function(){
		doRequest($('#word').val());
		$('#word').val('');
		return false;
	});
 
	$(document).ready(function(){
		connect();
	});
})(jQuery);
</script>
<div id="content"></div>
<div style="margin: 5px 0;">
<form action="javascript:void(0);" id="cometForm" method="get">
<input id="word" name="word" type="text" value="">
<input name="submit" type="submit" value="Send">
 
</form></div>

chat_backend.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
 
$filename  = dirname(__FILE__).'/data.txt';
 
// 消息都储存在这个文件中
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
 
if ($msg != ''){
	file_put_contents($filename,$msg);
	die();
}
 
// 不停的循环,直到储存消息的文件被修改
$lastmodif    = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif){ // 如果数据文件已经被修改
	usleep(100000); // 100ms暂停 缓解CPU压力
	clearstatcache(); //清除缓存信息
	$currentmodif = filemtime($filename);
}
 
// 返回json数组
$response = array();
$response['msg']       = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();
 
?>

共 5 条评论

  1. 回复

    不懂JS,求解:没看明白JS是怎么连接上memcache的?

    • 回复

      前端的JS不可能连接的上memcache的,何况本文章并不涉及memcache

  2. 回复

    我直接复制你的代码,但发现会出现ajax超时.导致返回的transport.在eval()报错..这么解决呀..

    • 回复

      PHP.INI里设置下脚本超时时间.

  3. 回复

    怎么跟数据库做链接那?大神求解 q:546533165

回复 朽木 X

您的邮箱不会公开,当您的评论有新的回复时,会通过您填写的邮箱向您发送评论内容。 必填字段 *

为何看不到我发布的评论?

正在提交, 请稍候...