值得分享的php+ajax实时聊天室
来源: 阅读:591 次 日期:2016-08-12 14:19:12
温馨提示: 小编为您整理了“值得分享的php+ajax实时聊天室”,方便广大网友查阅!

非常经典的一款php+ajax实时聊天室,其中使用PHP文件保存聊天记录,按天划分,PHP实现聊天的功能只有一个文件,整合了PHP与AJAX技术,也就是说只要运行这一个文件就可以启动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"=>"Welcome...!",

//当信息有禁止内容时显示

"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,''."\n".time()."|".$lang["firstone"]."\n");

if (!file_exists($datafile)) @file_put_contents($datafile,''."\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

{

if ($keys[$i] !== $i)

{

$isarr = false;

break;

}

}

$json = $space;

$json.= ($isarr)?"[":"{";

for($i=0;$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

{

$content = $arr[$i];

$content = str_replace(array("\n","\r"),"",$content);

if ($content == "") continue;

$content = preg_replace("!!i", "[img $1/]", $content);

$content = str_replace(array('<', '>'), array('<', '>'), $content);

$content = preg_replace("!\[img (.*?)/\]!i", "", $content);

$content = str_replace($lang['ban'], '', $content);

$content = ($style)?"{$content}":$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('',

'',

'',

'',

'',

'',

'',

'',

'',

'',

'',

'',

'',

'',

''),

$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的根目录下即可.

以上就是本文的全部内容,希望对大家的学习有所帮助

更多信息请查看 网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们| 联系我们| 人才招聘| 网站声明| 网站帮助| 非正式的简要咨询| 简要咨询须知| 加入群交流| 手机站点| 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00) 版权所有:
云南网警报警专用图标
Baidu
map