非常经典的一款php+ajax实时聊天室,其中使用PHP文件保存聊天记录,按天划分,PHP实现聊天的功能只有一个文件,整合了PHP与AJAX技术,也就是说只要运行这一个文件就可以启动PHP的聊天室了,关于代码上面也是非常的简单,但是实现了聊天室一般的功能,聊天时的昵称,更改昵称的颜色,聊天字号大小,字体,加粗,窗体的变大变小等等,如果你想搞个聊天室来玩玩,这个源码完全可以满足普通的需求。
具体的效果看如下图:
关键代码:
<?php
header(\'content-type:text/html;charset=utf-8\');
//显示在线用户
$disonline = 1;
//新登陆时显示最近内容的条数(默认为30条)
$leastnum = 30;
//默认的房间名(默认是每天换一个文件),如果去掉d,则是每月换一个文件
$room = date(\"Y-m-d\");
//房间保存路径,必须仿quot;/\"结尾,可以丿quot;../\",等
$roomdir = \"rooms/\";
//编码方式
$charset = \"UTF-8\";
//客户端最大显示内容条数(建议不要太大)
$maxdisplay = 300;
//语言包
$lang = array(
//聊天室描述
\"description\"=>\"聊天室.\",
//聊天室标题
\"title\"=>\"Welcome...!\",
//第一个到聊天室的欢迎
\"firstone\"=>\"<span style=\'font-size:16px;color:blue;\'>Welcome...!</span>\",
//当信息有禁止内容时显示
\"ban\" => array(\'法轮功\', \'共产党\', \'李洪志\', \'fuck\', \'叼\', \'你妈的\', \'他妈的\'),
//关键字
\"keywords\"=>\"Welcome...!\",
//发言提示
\"hereyourwords\" => \"在这里发言!\"
);
$touchs = 10;
$title = $lang[\"title\"];
$earlier = 10;
$description = $lang[\"description\"];
$origroom = $room;
$least = ($_GET[\"dis\"])?intval($_GET[\"dis\"]):$leastnum;
if ($_GET[\"room\"]) $room = $_GET[\"room\"];
$room = checkfilename($room);
if (!$room) $room = $origroom;
$filename = $roomdir.$room.\".dat.php\";
$datafile = $roomdir.$room.\".php\";
if (!is_dir($roomdir)) {
@mkdir($roomdir, 0777) or exit(\'no this dir.\');
}
if(file_exists($filename)){
if ((int)filemtime($filename) + 1800 < time()) {
unlink($filename);
}
}
if (!file_exists($filename)) @file_put_contents($filename,\'<?php die();?>\'.\"\\n\".time().\"|\".$lang[\"firstone\"].\"\\n\");
if (!file_exists($datafile)) @file_put_contents($datafile,\'<?php die();?>\'.\"\\n\");
$action = $_GET[\"action\"];
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;
}
}
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)
{
if (function_exists(\'json_encode\')) return json_encode($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(\"\\r\",\"\\n\"),\"\",$item).\'\"\';
else $json.=$item;
}
$json.= ($isarr)?\"]\":\"}\";
return $json;
}
if ($action == \"write\")
{
$color = $_GET[\'color\'];
if (!eregi(\"[0-9a-fA-F]{6}\",$color) || $color == \"#000000\") $color = \"\";
$color = \"#\".$color;
$size = intval($_GET[\"size\"]);
$arr = @file(\"php://input\");
$name = str_replace(array(\"\\n\",\"\\r\"),\"\",$arr[0]);
$ip = get_ip();
if ($disonline)
{
$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.\"\\n\");
@flock($fp, LOCK_UN);
}
@fclose($fp);
}
}
else
{
echo \"NAME\";
die();
}
}
}
$s = \"\";
$style = \"\";
$font = $_GET[\"font\"];
if ($font == \"songti\") $font = \"宋体\";
else if ($font == \"heiti\") $font = \"黑体\";
else if ($font == \"kaiti\") $font = \"楷体_GB2312\";
else $font = \"\";
$style .= (!$font)?\"\":\"font-family:\".$font.\";\";
$style .= (!$_GET[\"bold\"])?\"\":\"font-weight:bold;\";
$style .= (!$color || $color == \"#\")?\"\":\"color:{$color};\";
$style .= (!$size || $size == \"16\")?\"\":\"font-size:{$size}px;\";
$t = time();
for($i = 1;$i<count($arr);$i++)
{
$content = $arr[$i];
$content = str_replace(array(\"\\n\",\"\\r\"),\"\",$content);
if ($content == \"\") continue;
$content = preg_replace(\"!<img\\s+(.*?)/>!i\", \"[img $1/]\", $content);
$content = str_replace(array(\'<\', \'>\'), array(\'<\', \'>\'), $content);
$content = preg_replace(\"!\\[img (.*?)/\\]!i\", \"<img $1/>\", $content);
$content = str_replace($lang[\'ban\'], \'\', $content);
$content = ($style)?\"<span style=\'{$style}\'>{$content}</span>\":$content;
$ubbarray = array(\'[:ani_wink:]\',
\'[:big_eyes:]\',
\'[:cool:]\',
\'[:cry:]\',
\'[:eye_roll:]\',
\'[:grin:]\',
\'[:happy:]\',
\'[:not_impressed:]\',
\'[:smile:]\',
\'[:smile_eyes:]\',
\'[:stickout:]\',
\'[:straight:]\',
\'[:surprised:]\',
\'[:unhappy:]\',
\'[:wink:]\');
$content = str_replace($ubbarray,
array(\'<img src=\"smilies/ani_wink.gif\" />\',
\'<img src=\"smilies/big_eyes.gif\" />\',
\'<img src=\"smilies/cool.gif\" />\',
\'<img src=\"smilies/cry.gif\" />\',
\'<img src=\"smilies/eye_roll.gif\" />\',
\'<img src=\"smilies/grin.gif\" />\',
\'<img src=\"smilies/happy.gif\" />\',
\'<img src=\"smilies/not_impressed.gif\" />\',
\'<img src=\"smilies/smile.gif\" />\',
\'<img src=\"smilies/smile_eyes.gif\" />\',
\'<img src=\"smilies/stickout.gif\" />\',
\'<img src=\"smilies/straight.gif\" />\',
\'<img src=\"smilies/surprised.gif\" />\',
\'<img src=\"smilies/unhappy.gif\" />\',
\'<img src=\"smilies/wink.gif\" />\'),
$content);
$s.= $t.\"|\".$name.\":\".$content.\"\\n\";
}
if (!$name) die(\"No Name!!\");
if (!$s) die(\"No Content!!\");
$fp = @fopen($filename,\"a+\");
if (!$fp) die(\"repeat\");
if (@flock($fp, LOCK_EX))
{
@fputs($fp,$s);
@flock($fp, LOCK_UN);
}
else die(\"repeat\");
@fclose($fp);
echo \"OK\";
}
else if (trim($action) == \"read\")
{
if (get_magic_quotes_runtime()) {
set_magic_quotes_runtime(0);
}
$first = $_GET[\"first\"];
$lastmod = intval($_GET[\"lastmod\"]);
$alastmod = @filemtime($filename);
$name = file_get_contents(\"php://input\");
$name = str_replace(\"\\n\",\"\",$name);
$ip = get_ip();
$json = array();
$json[\"lastmod\"] = $alastmod;
$item = array();
$newonline = array();
$offline = array();
$lines = @file($filename);
if ($alastmod > $lastmod && !$first)
{
foreach($lines as $l)
{
$item2 = array();
$l = str_replace(array(\"\\n\",\"\\r\"),\"\",$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\"] = stripslashes($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(\"\\n\",\"\\r\"),\"\",$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\"] = stripslashes($arr[1]);
$item[] = $item2;
}
$item = array_reverse($item);
}
$s = \"\";
$nt = time();
$onlines = array();
if($disonline)
{
$users = @file($datafile);
foreach($users as $l)
{
$l = str_replace(array(\"\\r\",\"\\n\"),\"\",$l);
if (strpos($l,\"|\") === false)
{
$s.=$l.\"\\n\";
continue;
}
$arr = explode(\"|\",$l);
if ($nt - intval($arr[1]) < $touchs*2+1)
{
if (trim($name) == trim($arr[2]))
{
$s.= $arr[0].\"|\".time().\"|\".$name.\"|\".get_ip().\"|\\n\";
}
else $s.=$l.\"\\n\";
$onlines [] = $arr[2];
}
}
@file_put_contents($datafile,$s);
$json[\"onlines\"] = $onlines;
}
$json[\"lines\"] = $item;
echo array2json($json);
if (!get_magic_quotes_runtime()) {
set_magic_quotes_runtime(1);
}
}
else
{
?>
安装说明:
因为这一款php+ajax实时聊天室的聊天记录是保存到PHP文件中的,所以不用导入数据库,安装自然也就方便多了,只需要将下载的文件包解压缩到可以运行PHP的根目录下即可.
源码下载:php+ajax实时聊天室
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持phpstudy。
本文地址:https://www.stayed.cn/item/1901
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我