值得分享的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 13 PHP
php array_walk() 数组函数
Jul 12 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
PHP的博客ping服务代码
Feb 04 PHP
php结合curl实现多线程抓取
Jul 09 PHP
PHP可变变量学习小结
Nov 29 PHP
基于laravel制作APP接口(API)
Mar 15 PHP
微信支付开发动态链接Native支付
Jul 12 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
PHP钩子实现方法解析
May 21 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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
重置版战役片段
2020/04/09 魔兽争霸
老照片 - 几十年前的收音机与人
2021/03/02 无线电
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
vue实现分页组件
2020/06/16 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
python如何写个俄罗斯方块
2020/11/06 Python
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
十月份红领巾广播稿
2014/01/22 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
忠诚教育心得体会
2014/09/03 职场文书
党性分析材料格式
2014/12/19 职场文书
写给老师的感谢信
2015/01/20 职场文书
党员承诺书格式范文
2015/04/28 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电