值得分享的php+ajax实时聊天室


Posted in PHP onJuly 20, 2016

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 工厂模式使用方法
May 18 PHP
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
PHP中函数rand和mt_rand的区别比较
Dec 26 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
php集成动态口令认证
Jul 21 PHP
php阳历转农历优化版
Aug 08 PHP
php中this关键字用法分析
Dec 07 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
php验证身份证号码正确性的函数
Jul 20 #PHP
PHP加密解密类实例代码
Jul 20 #PHP
php图片添加水印例子
Jul 20 #PHP
支付宝服务窗API接口开发php版本
Jul 20 #PHP
PHP二维数组矩形转置实例
Jul 20 #PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 #PHP
PHP的AES加密算法完整实例
Jul 20 #PHP
You might like
Smarty模板快速入门
2007/01/04 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
PHP图片水印类的封装
2017/07/06 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
js word表格动态添加代码
2010/06/07 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python多进程读图提取特征存npy
2019/05/21 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
Python 如何批量更新已安装的库
2020/05/26 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
文员自我评价怎么写
2013/09/19 职场文书
2013年员工自我评价范文
2013/12/27 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
英语教师求职信范文
2015/03/20 职场文书
结婚典礼主持词
2015/06/29 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
教师理论学习心得体会
2016/01/21 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技