查看完整版本: PHP實現聊天室的主動更新與被動更新
頁: [1] 2

joey0415 發表於 2007-3-8 10:34 PM

PHP實現聊天室的主動更新與被動更新

聊天的內容如何顯示在屏幕上,一種是每隔一段時間刷新一次頁面,讀入全部聊天
內容,然後顯示,這裡採用的是js的document.write的方法實現不刷新的聊天頁面
! 1 主頁面的生成,規定了CSS類型,顯示歡迎詞
function write2(){
if(this.u.document==null)return;
this.u.document.writeln("<html><head>");
this.u.document.writeln("<meta http-equiv=Content-Type content=text/ht
ml; charset=gb2312>");
this.u.document.writeln("<style type=text/css>");
this.u.document.writeln(".p9 { font-size: 11pt; line-height: 15pt}");
this.u.document.writeln("body { font-size: 11pt; line-height: 15pt}");
this.u.document.writeln("a:visited { font-size: 11pt;color: ext-decoration: none;}");
this.u.document.writeln("a:link { font-size: 11pt;color: -decoration: none}");
this.u.document.writeln("a:hover { font-size: 11pt;color:
this.u.document.writeln("</style>");
this.u.document.writeln("</head>");
this.u.document.writeln("<body);
//.................. 這裡插入生成在線人數組的程序段

this.u.document.writeln("<script>");
this.u.document.writeln("<p class=p9 align=left>");
this.u.document.writeln("<p align=center>歡迎光臨PlayBoy聊天室,本聊天室
正在測試階段,如有問題請與<div class='locked'>下載: <em>訪客無法瀏覽下載點,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
</p>");
}
2 初始化進入信息,第一次進入聊天室
if($action == "enter")
{
/////////////////// 調用顯示主屏幕的js程序 ////////////////////
print("parent.write2();n");
//發言內容,某某進入聊天室了
$message = "<div class='locked'>下載: <em>訪客無法瀏覽下載點,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>來
到聊天室".$message." ".date("m月d日 H:i")."<script>parent.add('$name',
'$photo');parent.write1();</script><br>";
}
//更新發言內容
while(file_exists($lockfile)){ $pppp++; }
//發言的鎖定
fclose(fopen($lockfile,"w"));
//讀入發言的總句數,也就是所有人一共發了多少言!我們可以保存每一個發言,但
是這樣會佔用大量的磁盤空間,我們採用了一種取模的方法,循環使用文件來減少
文件操作!
$talkmessage = file($filename);
$number = chop($talkmessage);
//發言數增加一,然後保存
$talkhandle = fopen($filename,"w");
$number++;
fputs($talkhandle,$number);
fclose($talkhandle);
/去掉鎖定
unlink($lockfile);
//對發言總數對10取模,作為文件名保存發言內容,也就是說第11句和第1句使用同
一個文件名,由於不可能同時有10句話沒有更新,所以這是數在人不是非常多的情
況下很好!當然,考慮到人多的情況,可以設成100.
$filehandle = fopen("messageonline".($number%10).".php","w");
fputs($filehandle,$message);
fclose($filehandle);
//顯示進入信息
print("parent.u.document.writeln("$message");n");
//調用主動刷新js程序,傳遞已經顯示的發言數目
print("parent.flushwin($number)n");
//保存最後一次顯示的發言
$last = $number;
}

3 處理發送表單的請求
//不處理空的發言和超過一定數目的發言
if( ($message != "")&&(strlen($message)<150))
{
//檢查發言者是否在線,防止意外
$onlineperson = file("useronline.dbf");
$personsign=0;
for($i=0;$i<count($onlineperson);$i++)
{
$person = split($split,$onlineperson[$i],99);
if($person == $name)
{
$personsign = 1;
$person = date("U");
break;
}
}
//在線時的處理程序
if($personsign == 1)
{
//添加發言時間的部分
$message = $message." <font size=1>".date("m月d日 H:i")."</font><br>";

//鎖定發言總數文件
while(file_exists($lockfile)){ $pppp++; }
fclose(fopen($lockfile,"w"));
//讀入發言總數
$talkmessage = file($filename);
$number = chop($talkmessage);
//總數加1,然後保存
$talkhandle = fopen($filename,"w");
$number++;
fputs($talkhandle,$number);
fclose($talkhandle);
unlink($lockfile);
//總數對10取模後以文件形式保存發言內容
$filehandle = fopen("messageonline".($number%10).".php","w");
fputs($filehandle,$message);
fclose($filehandle);
}
}
//////////////////////////////////////////////////////////////////
這樣,表單的處理已經完成,下面的主動更新程序將會把新的發言內容顯示在屏幕

//////////////////////////////////////////////////////////////////
4 主動更新的自動循環調用方法
可以使用<meta http-equiv="reflesh" cmessageflush.php?name=<? print($name); ?>&&pass=<? print($pass);
?>&&last="+winnumber;
flush.location=url
flushflag=false
}
//否則等待一個循環
flushtimerID=setTimeout("flushstart()",2000);
flushtimerRunning=true;
}
這種方法保證了在主程序不死的情況下,後台更新程序會一直運行下去!

5 主動更新程序
<script Language='JavaScript'>
<?
//讀入最大的發言數目
$message = file($filename);
$number = chop($message);
//從上次顯示的下一個發言開始到最大發言結束,顯示發言內容
for($i=$last+1;$i<=$number;$i++)
{
//讀入下一個發言內容
$filename = "messageonline".($i%10).".php";
$message = file($filename);
$tempmessage = split($split,$message,99);
//顯示發言內容
print("parent.u.document.writeln("$message");rn");
}
//更新發送表單最後一個發言的數目
print("parent.d.document.inputform.last.value=$number;n");
//通知主程序本次更新已經完成
print("parent.flushflag=true;n");
?>
</script>

這樣,每個發送的發言,經過被動更新程序處理保存到文件內,然後由一個循環的主
動更新程序完成顯示任務!!!...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

isttoday 發表於 2007-6-1 09:17 PM

現在對於js語言...一d都唔識..
看上來好辛苦:19:
其實只用php也應該能做到

[ 本帖最後由 isttoday 於 2007-6-1 09:20 PM 編輯 ]

a8022713 發表於 2010-7-19 03:18 AM

現在ajax發展的不錯
可以考慮用ajax寫看看阿

s947477 發表於 2010-7-20 12:49 PM

恩~~謝謝分享
ajax  非對偁傳輸  現在很熱門呦~

jack710921 發表於 2011-1-3 05:38 PM

正好在學習ajax,謝謝大大分享!<br><br><br><br><br><div></div>

bbbbad30 發表於 2012-5-1 09:45 AM

感謝分享 Javascript 其實還是很好用的 QQ

mtyoung 發表於 2012-5-25 09:31 PM

本帖最後由 mtyoung 於 2012-5-25 09:31 PM 編輯

try to use mq with php
preform as HTTP persistent connection

tj951753 發表於 2014-6-21 02:02 PM

感謝大大 ... ajax真的是很強大的東西

我的JS爛透了 ...

正需要這個呢 !!

alpe 發表於 2014-6-28 02:36 PM

囧.  現在的話請用 websocket  
html5 的 webscoket 支援度很高了

gbluefox617 發表於 2014-6-29 05:52 PM

同意樓上的,HTML5的websocket很不錯,建議看看文檔,很簡單<br><br><br><br><br><div></div>

2060186 發表於 2014-6-30 01:38 AM

同意樓上的 AJAX 真的好用 用一個下午就可以學懂了, 配合JSON 作資料傳送很不錯

jamisonwen 發表於 2014-7-1 11:05 PM

nodeJS在開發聊天室也很適合
近期也蠻夯的提供給樓主參考

smallnet 發表於 2014-8-22 06:14 PM

我之前也是用nodeJS開發聊天室,因為它是用Google V8引擎,實際上線後就算同時幾百人在線時,系統吃的資源也很少...非常值得推薦哦!

PPOOQ 發表於 2014-8-22 11:04 PM

要不要用 nodejs/websocket/socket.io 阿 XD  用 php 寫.....因為不是 event driven ,人一多就會被卡死了... 現在新的瀏覽器都有支援 websocket  啦~

h19024 發表於 2014-9-4 12:03 AM

想請問大大html5 WebSocket和nodejs的比較
各有什麼優缺點?<br><br><br><br><br><div></div>
頁: [1] 2