<?php
/*
ajax php 聊天室实例代码
但是必须基于以下条款:
* 署名。你必须明确标明作者的名字。.
* 非商业用途。 你不可将当前作品用于商业目的。
* 保持一致。 如果你基于当前作品更改、变换或构造新作品,你应当按照与当前协议完全相同的协议分发最终作品
* 对于任何二次使用或分发,你必须让其他人明确当前作品的授权条款
* 在得到作者的明确允许下,这里的某些条款可以放弃
此约定是法律文本 (完整的协议)的简单易读概要
****************************************/
//****************参数设置****************
//显示在线用户
$disonline = true;
//新登陆时显示最近内容的条数(默认为30条)
$leastnum = 30;
//默认的房间名(默认是每天换一个文件),如果去掉d,则是每月换一个文件
$room = date("y-m-d");
//房间保存路径,必须以/结尾
$roomdir = "rooms/";
//编码方式
$charset = "utf-8";
//客户端最大显示内容条数(建议不要太大)
$maxdisplay = 300;
//语言
$lang = array(
//聊天室描述
"description" => "欢迎来到迷你ajax聊天室。最新版本 1.2。下载请到<a href='http://phprm.com' target=_blank>www.phprm.com</a>",
//聊天室标题
"title" => "mini ajax chatroom by longbill",
//第一个到聊天室的欢迎
"firstone" => "<span style='color:#16a5e9;'>welcome to longbill's mini ajax chatroom!</span>",
//当信息有禁止内容时显示
"ban" => "i am a pig!",
//关键字
"keywords" => "聊天室,迷你,小型,ajax,chat,chatroom,longbill,phprm.com,php,网页特效",
//发言提示
"hereyourwords" => "在这里发言!"
);
error_reporting(e_all ^ e_notice ^ e_warning);
header("content-type:text/html; charset=utf-8");
$get_past_sec = 3; //如果发现丢话,可以适当调大这个值
$touchs = 10; //检查在线人数的时间间隔
if (!function_exists("file_get_contents")) {
function file_get_contents($path) {
if (!file_exists($path)) return false;
$fp = @fopen($path, "r");
$all = fread($fp, filesize($path));
fclose($fp);
return $all;
}
}
if (!function_exists("file_put_contents")) {
function file_put_contents($path, $val) {
$fp = @fopen($path, "w");
fputs($fp, $val);
fclose($fp);
return true;
}
}
$title = $lang["title"];
$earlier = 10;
$description = $lang["description"];
$origroom = $room;
$least = ($_get["dis"]) ? intval($_get["dis"]) : $leastnum;
$touchme = $_post['touchme'];
if (!is_dir($roomdir)) @mkdir($roomdir) or die("error when creating folder $roomdir");
$room = $_get['room'];
if (!$room) $room = $_post["room"];
$room = checkfilename($room);
if (!$room) $room = $origroom;
$filename = $roomdir . $room . ".dat.php";
$datafile = $roomdir . $room . ".php";
if (!file_exists($filename)) @file_put_contents($filename, '<?php die();?>' . " " . time() . "|" . $lang["firstone"] . " ");
if (!file_exists($datafile)) @file_put_contents($datafile, '<?php die();?>' . " ");
$action = $_post["action"];
function checkfilename($file) {
if (!$file) return "";
$file = trim($file);
$a = substr($file, -1);
$file = eregi_replace("^[./]*", "", $file);
$file = eregi_replace("[./]*$", "", $file);
$arr = array(
"../",
"./",
"/",
"",
"..",
"."
);
$file = str_replace($arr, "", $file);
return $file;
}
function get_ip() {
global $_server;
if ($_server) {
if ($_server[http_x_forwarded_for]) $realip = $_server["http_x_forwarded_for"];
else if ($_server["http_client_ip"]) $realip = $_server["http_client_ip"];
else $realip = $_server["remote_addr"];
} else {
if (getenv('http_x_forwarded_for')) $realip = getenv('http_x_forwarded_for');
else if (getenv('http_client_ip')) $realip = getenv('http_client_ip');
else $realip = getenv('remote_addr');
}
return $realip;
}
function array2json($arr) {
$keys = array_keys($arr);
$isarr = true;
$json = "";
for ($i = 0; $i < count($keys); $i++) {
if ($keys[$i] !== $i) {
$isarr = false;
break;
}
}
$json = $space;
$json.= ($isarr) ? "[" : "{";
for ($i = 0; $i < count($keys); $i++) {
if ($i != 0) $json.= ",";
$item = $arr[$keys[$i]];
$json.= ($isarr) ? "" : $keys[$i] . ':';
if (is_array($item)) $json.= array2json($item);
else if (is_string($item)) $json.= '"' . str_replace(array(
" ",
" "
) , "", $item) . '"';
else $json.= $item;
}
$json.= ($isarr) ? "]" : "}";
return $json;
}
function keeponline() {
global $disonline, $datafile;
if (!$disonline) return;
$name = $_post['name'];
$ip = get_ip();
$onlines = @file_get_contents($datafile);
$s1 = "|{$name}|{$ip}|";
if (strpos($onlines, $s1) === false) {
if (strpos($onlines, "|" . $name . "|") === false) {
$fp = @fopen($datafile, "a+");
if ($fp) {
if (@flock($fp, lock_ex)) {
@fputs($fp, time() . "|" . time() . $s1 . " ");
@flock($fp, lock_un);
}
@fclose($fp);
}
} else {
echo "name";
die();
}
}
}
if ($action == "write") {
$color = $_post["color"];
if (!eregi("[0-9a-fa-f]{6}", $color) || $color == "#000000") $color = "";
$color = "#" . $color;
$size = intval($_post["size"]);
$name = htmlspecialchars(str_replace(array(
" ",
" "
) , "", $_post['name']));
if (!$name) die("no name!!");
$ip = get_ip();
keeponline();
$s = "";
$style = "";
$font = $_post["font"];
if ($font == "songti") $font = "宋体";
else if ($font == "heiti") $font = "黑体";
else if ($font == "kaiti") $font = "楷体_gb2312";
else $font = "";
$style.= (!$font) ? "" : "font-family:" . $font . ";";
$style.= (!$_post["bold"]) ? "" : "font-weight:bold;";
$style.= (!$color || $color == "#") ? "" : "color:{$color};";
$style.= (!$size || $size == "16") ? "" : "font-size:{$size}px;";
$t = time();
$arr = explode(" ", $_post['content']);
if (count($arr) > 20) die('error');
for ($i = 0; $i < count($arr); $i++) {
$content = $arr[$i];
$content = trim($content);
$content = str_replace(array(
" ",
" "
) , "", $content);
if (!$content) continue;
$content = htmlspecialchars($content);
$content = preg_replace("~[img](http://[a-za-z0-9.-_+%?]*)[/img]~i", "<img src='$1' / alt="ajax php 聊天室实例代码 " >", $content);
$content = ($style) ? "<span style='{$style}'>{$content}</span>" : $content;
$s.= $t . "|" . $name . ":" . $content . " ";
}
if (!$s) die("no content!!");
$fp = @fopen($filename, "a+");
if (!$fp) die("repeat");
$re_time = 0;
while (!@flock($fp, lock_ex)) {
sleep(1);
$re_time++;
if ($re_time >= 4) break;
}
if ($re_time < 4) {
@fputs($fp, $s);
@flock($fp, lock_un);
} else die("repeat");
@fclose($fp);
echo "ok";
} else if ($action == "read") {
$first = $_post["first"];
$lastmod = intval($_post["lastmod"]) - $get_past_sec; //得到两秒以内的所有发言,
$alastmod = @filemtime($filename);
if ($lastmod - $alastmod > 360 * 48) die;
$name = $_post['name'];
$name = str_replace(" ", "", $name);
$ip = get_ip();
$json = array();
$json["lastmod"] = time();
$item = array();
$newonline = array();
$offline = array();
$fp = @fopen($filename, 'r');
flock($fp, lock_ex);
$s = fread($fp, filesize($filename));
flock($fp, lock_un);
fclose($fp);
$lines = explode(" ", $s);
if ($alastmod >= $lastmod && !$first) {
foreach ($lines as $l) {
$item2 = array();
$l = str_replace(array(
" ",
" "
) , "", $l);
if (strpos($l, "|") === false) continue;
$arr = explode("|", $l);
$t = intval($arr[0]);
if ($t >= $lastmod) {
$item2["time"] = date("h:i:s", $t);
$item2["word"] = addslashes($arr[1]);
$item[] = $item2;
}
}
} else if ($first) {
$item = array();
$total = count($lines);
for ($i = $total - 1; $i >= $total - $least; $i--) {
if ($i <= 0) break;
$item2 = array();
$l = str_replace(array(
" ",
" "
) , "", $lines[$i]);
if (strpos($l, "|") === false) continue;
$arr = explode("|", $l);
$t = intval($arr[0]);
$item2["time"] = (date("m-d", time()) == date("m-d", $t)) ? date("h:i:s", $t) : date("m-d h:i", $t);
$item2["word"] = addslashes($arr[1]);
$item[] = $item2;
}
$item = array_reverse($item);
}
$s = "";
$nt = time();
$onlines = array();
if ($disonline && $touchme) {
$users = @file($datafile);
foreach ($users as $l) {
$l = str_replace(array(
" ",
" "
) , "", $l);
if (strpos($l, "|") === false) {
$s.= $l . " ";
continue;
}
$arr = explode("|", $l);
if ($nt - intval($arr[1]) < $touchs * 3) {
if (trim($name) == trim($arr[2])) {
$s.= $arr[0] . "|" . time() . "|" . $name . "|" . get_ip() . "| ";
} else $s.= $l . " ";
$onlines[] = htmlspecialchars($arr[2]);
}
}
@file_put_contents($datafile, $s);
$json["onlines"] = $onlines;
}
$json["lines"] = $item;
echo array2json($json);
} else if ($action == "keep") {
keeponline();
echo "keep ok";
} else if ($action == "quit") {
$name = $_post['name'];
if ($disonline) {
$users = @file($datafile);
foreach ($users as $l) {
$l = str_replace(array(
" ",
" "
) , "", $l);
if (strpos($l, "|") === false) {
$s.= $l . " ";
continue;
}
$arr = explode("|", $l);
if (trim($name) == trim($arr[2])) continue;
else $s.= $l . " ";
}
@file_put_contents($datafile, $s);
echo "ok";
}
die();
} else {
?>
<html>
<head>
<title>迷你php+ajax聊天室演示 <?php echo $title; ?></title>
<meta http-equiv='pragma' content='no-cache' />
<meta http-equiv=content-type content="text/html; charset=<?php echo $charset; ?>" />
<meta name="keywords" content="<?php echo $lang["keywords"]; ?>">
<meta name="description" content="mini ajax chatroom by longbill. <?php echo $description; ?>">
<style type='text/css'>
body { text-align:center; color:#333333; font-size:12px; font-family:宋体;}
a { text-decoration:none; color:#a2b700; }
.mydiv { text-align:left; margin:5px; padding:5px; border:1px solid #ff8c05; background-color:#fdd283; width:600px; }
.inputtext { border:0px; border-bottom:1px solid #333333; background-color:transparent;}
.submit { border:1px solid #ff8c05; background-color:transparent; }
.contents { border:1px solid #ff8c05;margin:5px; margin-top:10px;background-color:#ffffff; overflow:auto;word-break:break-all;word-wrap :break-word;}
.bg { background-color:#ffffff; }
.content { border:0px;background-color:transparent;width:auto; font-size:16px; font-family:fixedsys; margin:2px; padding:1px; }
.time { color:#aaaaaa; font-size:10px; font-family:arial;}
.online { margin:5px; padding:0px; display:inline; }
.mybut { width:20px; height:20px; background-color:#ff8c05; text-align:center; font-size:18px; color: #333333;}
</style>
<script>
function $(obj) {
return document.getelementbyid(obj);
}
function setcookie(name, value, t) {
var cookieexp = 5 * 30 * 24 * 60 * 60 * 1000; //5 months
var cookiestr = name + "=" + escape(value) + ";";
var expires = "";
var d = new date();
var t2 = (!t) ? cookieexp : t * 60 * 1000;
d.settime(d.gettime() + cookieexp);
expires = "expires=" + d.togmtstring() + ";";
document.cookie = cookiestr + expires;
}
function getcookie(name) {
var start = document.cookie.indexof(name + "=");
var len = start + name.length + 1;
if ((!start) && (name != document.cookie.substring(0, name.length)))
return "";
if (start == -1)
return "";
var end = document.cookie.indexof(";", len);
if (end == -1)
end = document.cookie.length;
return unescape(document.cookie.substring(len, end));
}
function createajax() {
if (window.xmlhttprequest) {
var ohttp = new xmlhttprequest();
return ohttp;
} else if (window.activexobject) {
var versions = [
"msxml2.xmlhttp.6.0",
"msxml2.xmlhttp.3.0"
];
for (var i = 0; i < versions.length; i++) {
try {
var ohttp = new activexobject(versions[i]);
return ohttp;
} catch (error) {}
}
}
throw new error("your browser doesn't support xmlhttprequest");
}
function pickcolor() {
if (!window.isie)
return;
var scolor = $('dlghelper').choosecolordlg();
var color = scolor.tostring(16);
while (color.length < 6)
color = "0" + color;
window.color = color;
color = "#" + color;
$('div_color').style.backgroundcolor = color;
$('div_color').value = color;
}
var isie = (document.all && window.activexobject) ? true : false;
</script>
</head>
<body >
<center>
<div class=mydiv style='text-align:center; border:0px; background-color:transparent; font-size:25px; color:#ff8c05;'><?php echo $title; ?></div>
<div class="mydiv login" id='div_description'>
<?php
echo $description; ?>
</div>
<div class="mydiv rooms" id='div_msg'>
<div class='contents' style='height:350px;' id='div_contents'>loading...</div>
</div>
<div class="mydiv login" id='div_name' style='display:block;'>
name:<input type=text class="inputtext bg" size=8 id='chat_user' value='' maxlength=30 />
<object id=dlghelper classid="clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b" width="0px" height="0px"></object>
<input class="inputtext" style='width:50px;cursor:hand;10px;background-color:#000000;color:#ffffff;' id='div_color' onclick="pickcolor()" value="#000000" onblur="this.style.backgroundcolor=this.value;window.color=this.value.replace('#','');" />
size:<input class="inputtext bg" type=text style='width:20px' maxlength=3 id='input_size' value='16' />(px)
font:<select id='input_font' class='inputtext bg' style='width:70px;'>
<option value='fixedsys'>fixedsys</option>
<option value='heiti'>黑体</option>
<option value='songti'>宋体</option>
<option value='kaiti'>楷体</option>
</select>
bold:<input type=checkbox id='input_bold' class='inputtext' style='border-bottom:0px;' />
window:<a class='mybut' href='#' onclick='resize(1)'>+</a>
<a class='mybut' href='#' onclick='resize(0)'>-</a>
<a class='mybut' style='width:25px;font-size:16px;' href='#' onclick='clearall()'>clear</a>
</div>
<div class="mydiv login" id='div_word'>
<textarea type=text class="inputtext bg" rows=1 scrolling=no style='height:20px;overflow:hidden;width:500px;' id='chat_word' onfocus="if (this.value == '<?php echo $lang["hereyourwords"]; ?>') this.value=''; window.editing=0; "
onkeydown="return check_send(event);" ><?php echo $lang["hereyourwords"]; ?></textarea>
<input type=button class=submit value='send' onclick="chat_send();$('chat_word').style.height=20;" onfocus="this.blur();"/>
</div>
<div class='mydiv' style='display:<?php
if (!$disonline) echo "none"; ?>' id='div_online'>loading online...</div>
<script>
var debug = 0;
var lastmod = < ? php echo time() - $earlier * 60;
? > ;
var login = 1;
var loading = false;
var olduser = getcookie('chatusername');
if (olduser != "")
$('chat_user').value = olduser;
var room = "<?php echo $room; ?>";
var first = 1;
var dis = "<?php echo $least; ?>";
var lastword;
var color = '';
var touchs = <?php echo $touchs;?> ;
var dotouch = true;
var maxdisplay = <?php echo $maxdisplay;?> ;
var nowdisplay = 1;
var sending = 0;
var loaded_lines = [];
var editing = 0;
function encode(s) {
return (encodeuricomponent) ? encodeuricomponent(s) : s;
}
$('chat_user').onfocus = setonfocus;
$('input_size').onfocus = setonfocus;
function setonfocus() {
window.editing = 1;
}
function setonblur() {
window.editing = 0;
}
var keep_ajax;
function keeponline() {
var name = $('chat_user').value;
if (!name)
return;
keep_ajax = createajax();
keep_ajax.open('post', '<?php echo basename(__file__); ?>', 1);
keep_ajax.setrequestheader("content-type", "application/x-www-form-urlencoded");
keep_ajax.onreadystatechange = function () {
if (keep_ajax.readystate == 4 && keep_ajax.status == 200) {
//alert(keep_ajax.responsetext);
}
}
keep_ajax.send("action=keep&name=" + encode(name));
}
setinterval("keeponline()", touchs * 1000);
function quitroom() {
if (confirm("你真的要离开聊天室吗?")) {
var ajax = createajax();
ajax.open('post', '<?php echo basename(__file__); ?>', 0);
ajax.setrequestheader("content-type", "application/x-www-form-urlencoded");
ajax.send("action=quit&name=" + encode($('chat_user').value));
//alert("sending close action=quit&name="+encode($('chat_user').value));
//alert("response:"+ajax.responsetext);
} else
return '';
}
document.body.onbeforeunload = quitroom;
setinterval(" load_word()", (debug) ? 6000 : 1000);
var load_word_ajax;
//下载完成后的处理函数
function load_word_change() {
if (load_word_ajax.readystate == 4) {
if (load_word_ajax.status != 200) {
load_word_error();
return;
}
window.loading = false;
var body = $('div_contents');
try {
if (debug)
alert(load_word_ajax.responsetext);
eval("var arr = " + load_word_ajax.responsetext);
} catch (e) {
alert('error 101 json syntax error! ' + load_word_ajax.responsetext);
return;
}
if (!arr || !arr.lastmod || typeof(arr.lastmod) == "undefined") {
return;
}
var html = "";
var line = arr.lines;
var i = 0;
var v1 = 0;
var div_online = $('div_online');
if (window.first) {
body.innerhtml = "";
window.first = false;
}
if (arr.onlines) {
$('div_online').innerhtml = "";
for (var i = 0; i < arr.onlines.length; i++)
addonline(arr.onlines[i]);
}
for (var i = 0; i < line.length; i++) {
var linekey = line[i].word.substring(line[i].word.length - 20, line[i].word.length) + line[i].time;
if (window.loaded_lines[linekey] === true) {
if (debug)
alert("jump:" + linekey);
continue;
}
var div1 = document.createelement("div");
window.nowdisplay++;
if (window.nowdisplay > window.maxdisplay)
window.nowdisplay = 1;
if ($("contentitem" + window.nowdisplay))
body.removechild($("contentitem" + window.nowdisplay));
div1.classname = "content";
div1.id = "contentitem" + window.nowdisplay;
div1.innerhtml = line[i].word + " <span class='time'>(" + line[i].time + ")</span>";
body.appendchild(div1);
window.loaded_lines[linekey] = true;
body.scrolltop = 655350;
v1 = 1;
}
if (v1) {
window.focus();
document.body.focus();
window.lastmod = arr.lastmod;
if (debug)
alert("lastmod = " + arr.lastmod + " window.lastmod=" + window.lastmod);
if ($('chat_word').disabled == false && window.editing != 1) {
$('chat_word').focus();
}
}
}
}
function load_word_error() {
window.loading = false;
window.status = 'error 102:while loading words';
settimeout("window.status = '';", 5000);
}
function load_word() {
load_word_ajax = createajax();
if (window.loading) {
try {
load_word_ajax.abort();
window.loading = false;
} catch (e) {}
}
if (!window.lastmod) {
alert("window.lastmod=" + window.lastmod);
return;
}
load_word_ajax.open('post', '<?php echo basename(__file__); ?>', true);
load_word_ajax.onreadystatechange = load_word_change;
var urlstring = '';
urlstring += "lastmod=" + window.lastmod;
urlstring += "&room=" + room;
urlstring += "&action=read";
urlstring += "&name=" + encode($('chat_user').value);
if (window.first) {
urlstring += "&first=true";
urlstring += "&dis=" + dis;
}
//如果到了取得在线用户的时间
if (window.dotouch) {
urlstring += "&touchme=true";
window.dotouch = false;
//垃圾内存回收
try {
collectgarbage();
} catch (e) {}
}
window.loading = true;
if (debug)
alert("sending:" + urlstring);
load_word_ajax.setrequestheader("content-type", "application/x-www-form-urlencoded");
load_word_ajax.send(urlstring);
}
function touchme() {
window.dotouch = true;
settimeout("touchme()", window.touchs * 1000);
}
function showalert(a, n) {
if (!n)
n = 0;
if (n > 3)
return;
if (!a) {
a = 0;
b = 1;
} else {
a = 1;
b = 0;
}
document.title = mytitle[a];
settimeout("showalert(" + b + "," + (n + 1) + ");", 500);
}
function addonline(name) {
if ($(name))
return;
var d1 = document.createelement("div");
d1.id = name;
d1.innerhtml = name;
d1.classname = "online";
$('div_online').appendchild(d1);
}
touchme();
function check_send(e) {
if (!e)
e = window.event;
var obj = $('chat_word');
if (isie)
obj.style.height = obj.scrollheight + 3;
if (e.keycode == 13) {
if ((!e.shiftkey && !e.altkey && !e.ctrlkey) || !isie) {
chat_send();
obj.style.height = 20;
return false;
} else if (isie)
obj.style.height = obj.scrollheight + 18;
}
return true;
}
var send_ajax;
send_ajax_change = function () {
if (send_ajax.readystate == 4) {
if (send_ajax.status != 200) {
send_ajax_error();
return;
}
if (debug)
alert("send_ajax response:" + send_ajax.responsetext);
if (send_ajax.responsetext.indexof("name") != -1) {
alert('已经有人使用你的昵称了');
$('chat_user').value = "";
$('chat_user').focus();
} else if (send_ajax.responsetext.indexof("repeat") != -1) {
$('chat_word').value = window.lastcontent;
}
on_send_ok();
if (!window.loading) {
window.dotouch = true;
load_word();
}
$('chat_word').disabled = false;
$('chat_word').focus();
}
}
function on_send_begin() {
with ($('chat_word')) {
disabled = true;
style.backgroundcolor = "#eeeeee";
}
window.sending = 1;
}
function on_send_ok() {
window.sending = 0;
with ($('chat_word')) {
value = '';
disabled = false;
focus();
style.backgroundcolor = "#ffffff";
}
}
function on_send_error() {
window.sending = 0;
with ($('chat_word')) {
disabled = false;
focus();
style.backgroundcolor = "#ffffff";
}
}
function send_ajax_error() {
alert('error 103 when send words you can send them again!');
$('chat_word').value = window.lastcontent;
window.sending = 0;
on_send_error();
}
function chat_send() {
send_ajax = createajax();
send_ajax.open('post', '<?php echo basename(__file__); ?>', true);
send_ajax.setrequestheader("content-type", "application/x-www-form-urlencoded");
send_ajax.onreadystatechange = send_ajax_change;
var urlstring = '';
var name = $('chat_user').value.replace(" ", "");
var content = $('chat_word').value;
var bold = ($('input_bold').checked) ? "bold" : "";
var size = parseint($('input_size').value);
var font = $('input_font').value;
if (name == "") {
alert('please enter your nick name first!!');
$('chat_user').focus();
return;
}
if (content == "" || content == " " || content == " " || content == " ") {
alert('please enter your words!');
$('chat_word').focus();
$('chat_word').value = "";
return;
}
if (size > 100)
size = 100;
else if (size < 0)
size = 1;
urlstring += "action=write";
urlstring += "&name=" + encode(name);
urlstring += "&content=" + encode(content);
urlstring += "&bold=" + bold;
urlstring += "&color=" + window.color;
urlstring += "&size=" + size;
urlstring += "&font=" + font;
urlstring += "&room=" + room;
window.sending = 1;
window.lastcontent = content;
on_send_begin();
if (debug)
alert("sending:" + urlstring);
send_ajax.send(urlstring);
settimeout("if (window.sending) send_ajax.abort(); on_send_error();", 5000);
setcookie("chatusername", $('chat_user').value);
}
function resize(s) {
var o = $('div_contents').style;
var h = parseint(o.height);
h = (s) ? h + 50 : h - 50;
if (h <= 50 || h >= 3000)
return;
o.height = h;
$('div_contents').scrolltop = 655350;
}
function clearall() {
$('div_contents').innerhtml = "";
}
</script>
</center>
</body>
</html>
<?php
}
?>
Salin selepas log masuk