1,配置文件
創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為永興企業(yè)提供專業(yè)的網站制作、網站設計,永興網站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
復制代碼代碼如下:
?php
define('PATH',dirname($_SERVER['SCRIPT_NAME'])); //聊天室目錄
define('CHAT_NAME','PHP聊天室'); //聊天室名稱
define("MESS", "mess.txt"); //聊天信息
define("PERSON", "person.txt"); //在線人名單
define("RETIME",3); //刷新時間
define("LINE",11); //公共窗口顯示的行數(shù)
define("PRLINE",5); //私聊窗口顯示的行數(shù)
define("MAX",50); //聊天室人數(shù)限制
define("MAXTIME",600000); //最大不發(fā)言時間,單位是毫秒
define("WELCOME","font color=blue歡迎光臨".CHAT_NAME.",請遵守聊天室規(guī)則,不要惡意刷新,不要使用不文明用語。/font"); //歡迎語
?
2,公共函數(shù)文件
(1)chklogin()函數(shù)檢查用戶昵稱是否重復。參數(shù)$user是登錄用戶的昵稱。當函數(shù)返回值為True時,昵稱不可用;返回值為False時,昵稱可用。
復制代碼代碼如下:
function chklogin($file,$user){
$boo = false;
if(file_exists($file)){
$userarr = file($file);
/* 判斷昵稱是否重復 */
foreach($userarr as $value){ //判斷昵稱是否重復
$tmparr = explode('#',$value); //使用“#”作為分隔符來拆分字符串
if($user == $tmparr[0]){ //如果用戶數(shù)組中包含此用戶
$boo = true;
break;
}
}
}
return $boo;
}
(2)addlogin()函數(shù)將登錄的用戶昵稱寫入文件中,保存格式為:昵稱#IP#性別,參數(shù)$file是保存的文件地址,$user是用戶昵稱,$ip是登陸IP,$sex表示用戶性別。
復制代碼代碼如下:
function addlogin($file,$user,$ip,$sex){
$tmp = $user.'#'.$ip.'#'.$sex.chr(13).chr(10); //chr(13) 是一個回車,Chr(10) 是個換行符,chr(32) 是一個空格符
$fp = fopen($file,'a'); //寫入方式在文件末尾追加信息
$boo = fwrite($fp,$tmp);
fclose($fp);
return $boo;
}
(3)storeuser()函數(shù)的作用是將用戶信息存為一個數(shù)組。格式為“用戶名,用戶性別”,參數(shù)$file是用戶列表文件。代碼如下:
復制代碼代碼如下:
function storeuser($file){
$tmparr = file($file); //將文件內容寫入數(shù)組
$userarr = array(); //創(chuàng)建數(shù)組
foreach($tmparr as $value){ //循環(huán)輸出數(shù)組內容
$tmparr = explode('#',$value); //使用#拆分字符串
$userarr[] = $tmparr[0].','.$tmparr[2]; //將用戶名和用戶性別保存到新數(shù)組中
}
return $userarr;
}
(4)addmess()函數(shù)將發(fā)言內容寫入文件中。參數(shù)$file是保存的文件地址,$mess是要保存的內容
復制代碼代碼如下:
function addmess($file,$mess){
$fp = fopen($file,'a'); //以追加的形式打開文件
$boo = fwrite($fp,$mess.chr(13).chr(10)); //將信息寫入文件中
fclose($fp); //關閉文件
return boo;
}
(5)deluser()函數(shù)的作用是刪掉用戶。參數(shù)$file是保存的文件地址,$user是要刪除的用戶
復制代碼代碼如下:
function deluser($file,$user){
$tmparr = file($file); //將文件內容寫入數(shù)組
$rearr = array(); //創(chuàng)建數(shù)組
foreach($tmparr as $value){ //循環(huán)輸出數(shù)組內容
$tmp = explode('#',$value); //使用#拆分字符串
if($tmp[0] != $user){ //如果變量中的用戶名和當前用戶不相等
$rearr[] = $value; //將該用戶信息保存到新數(shù)組中
}
}
$fp = fopen($file,'w+'); //以只寫的方式打開文件
foreach($rearr as $value){ //循環(huán)數(shù)組
fwrite($fp,$value); //寫入數(shù)組內容
}
fclose($fp); //關閉文件
}
(6)getRows()函數(shù)的作用是返回文件的行數(shù),參數(shù)$file是文件名
復制代碼代碼如下:
function getRows($file){
if(file_exists($file)){ //如果文件存在
$fl = file($file); //將文件按行寫入數(shù)組
return count($fl); //求出數(shù)組長度并返回
}else{
return 0; //如果文件不存在,返回0
因實驗室項目-網站開發(fā)需求,需要增加會員聊天功能,特修改phpfreechat-1.7(phpfreechat官網)以適應項目需求。我所選擇的是phpfreechat-1.7,因此下面的文字只針對phpfreechat-1.7,忽略phpfreechat-2.1.0版本phpfreechat,顧名思義,PHP,free,chat,是一款開源的網頁版聊天程序,前臺是css+js,用到了prototype庫;后臺是php,數(shù)據(jù)庫支持方面包括MySQL,orcal,file比較全。首先介紹一下phpfreechat的優(yōu)點,最大的優(yōu)點是開放源代碼,而且功能比較齊全,對開發(fā)者而言可定制性強,通過傳遞參數(shù)即可實現(xiàn)包括前臺樣式,后臺數(shù)據(jù)庫的定制。并且提供了很多主題供開發(fā)者定制。缺點便是可參考的文檔太少。后臺代碼的耦合性太大,不便于開發(fā)者嵌入到自己的網站中。沒有采用MVC架構,代碼比較混雜。前臺js用到了prototype庫,所以開發(fā)過程中不能使用主流的jQuery庫,否則會沖突,造成了很大的不便。后臺的數(shù)據(jù)庫設計不合理,將所有的內容存儲在一個table中,當用戶量大時性能會很低,而且不容易理解數(shù)據(jù)庫的設計。只能一點一點看代碼去理解。
下面介紹一下我的開發(fā)過程。我做的主要工作便是根據(jù)項目的需求將整個代碼部分的前端后臺進行分離。前臺主要是用戶參數(shù)和聊天界面的初始化,后臺主要是響應前臺的Ajax請求讀取和寫數(shù)據(jù)庫。同時寫死了很多不需要的可定制的代碼。提高了初始化的效率。
總結一下就是,做聊天部分前期沒有詳細考察那些開源的聊天程序,上手比較倉促,做了段時間后由于時間關系有點騎虎難下,所以前期考察哪個開源軟件更合適很重要!!但是還是從中學到了很多東西,設計模式,代碼風格之類的,收獲很大。
你不要這么設置 你把那一列 作為 最后一次通信的時間戳 (不是最后一次說話的時間)
你聊天室 是不是每隔 一段時間 (比如 5秒) 自動刷新? 每次刷新 就重新設置該用戶 這個字段為當前時間戳 那么 當 這個用戶下線或者直接關閉網頁 超過一段時間(比如 一分鐘,也就是這個字段停留在一分鐘前的時間戳,那就判定為下線)
你好,
你有那種,
可以互聯(lián)互通的,
一種窗口么,
我可以這樣,
直接教你怎么操作,
如果光說的話,
或者用語言文字表述的話,
是很困難的。
首先聊天室主要的瓶頸并不在于用什么語言做后端,而在于整體處理架構。
當你打算做聊天室的時候你可以自己看看如何解決以下問題:
數(shù)據(jù)的傳輸(如何及時把收到的數(shù)據(jù)傳輸給別人)
數(shù)據(jù)庫的處理(對于數(shù)據(jù)的操作,萬人在線的聊天室數(shù)據(jù)量產生肯定很大,那么怎么保證數(shù)據(jù)庫能扛得下去)
web服務器是否有能力對抗那么大的并發(fā)數(shù)量
服務器的帶寬是否能支撐下去
以上四點是基于B/S架構必有的問題,如果并非B/S架構那么后端也沒必要使用PHP吧?
第一點、可以使用websocket進行解決,但缺點是不能支持舊版本的瀏覽器
(如果需要支持可以使用AJAX輪詢進行處理,但會加大服務器壓力)
第二點、可以增加緩存層,所有數(shù)據(jù)先進緩存,然后一定時間把緩存寫入數(shù)據(jù)庫。前提是需要內存足夠大
(或者可以使用數(shù)據(jù)庫中間件進行讀寫分離,或者直接分表處理)
第三點、再對WEB服務器優(yōu)化后你能做的只有創(chuàng)建集群,用幾臺機去緩解壓力
第四點、買帶寬
說白了,沒有一定的金錢做為支持的背景下thinkphp和c做出來的性能相差不大,因為瓶頸并不在它那