首頁 後端開發 php教程 PHP聊天室技術_PHP教程

PHP聊天室技術_PHP教程

Jul 21, 2016 pm 04:02 PM
php 上網 交友 前言 科技 方式 網站 聊天 聊天室

PHP聊天室技術 黃國輝

1.前言

上網聊天是時下最受歡迎的交友方式。各大網站推出的聊天室都各具特色。

聊天室主要分為WebChat、BBSChat兩種。 BBSChat是基於Telnet的Tcp協議,是BBS的附設功能,需要客戶端Telnet程式。 WebChat則採用瀏覽器方式,其實是多人共同使用的CGI程式。其基本原理是把每個使用者的發言通過瀏覽器傳給系統,再由系統收集處理後分發給特定使用者。

WebChat一般採用Server Push或Client Pull技術。兩種技術的差別在於使用不同的方式將資料分發給用戶,Server Push是由伺服器將資料以多重MIME編碼,推給(push)用戶端,目前較少網站使用這種方式。 Client Pull則是使用者從伺服器拉(pull)想要的資料。

最常用的Client Pull就是利用Html語言的Meta標籤http-equiv="Refresh" 的屬性,每隔一段時間就檢查伺服器上是否有新的資料。例如,每隔5秒鐘就會刷新一次頁面。這種方法簡單有效,缺點是刷新時會產生閃爍的現象;而且為了保持效率,每次刷新都會把舊的聊天內容清除,用戶想查看或保留對話內容都很不方便。為此,採用JavaApplet作為聊天室的前端,利用刷新把手從伺服器Pull的資料透過JavaApplet來顯示也是一種解決方案。還有本文要介紹的讓聊天程式保持連線的方案。方法一,把聊天程式設定為無限大,就能讓瀏覽器不停地保持下載的連線狀態;方法二,聊天程式中存在著無限循環,因為可以方便地設定更進階的功能,所以在此選擇採用。

Web伺服器採用FreeBSD Apache,原因是兩者的組合具有最強的效能,而且花費為零。還需要考慮的是用什麼方式來存放資料呢。用文件相對而言容易實現,但是多人使用,頻繁地對同一文件進行IO操作,難免會影響效率,況且FreeBSD的IO性能不佳。可以考慮使用RamDisk,將檔案整個放進內存,以提高速度。或在記憶體中劃分出一塊高速空間以資料存放。筆者使用的是資料庫方式:MySQL。因為資料庫就是為大批量使用者同時使用而設計,利用它可以省去設計高速空間操作的複雜編寫,速度也可保證。如將整個資料庫放進內存,效果更好。

程式用PHP Html JavaScript編寫。聊天室主要是對Html的Form中的各種元素進行操作。 JavaScript是基於物件的語言,對Html中的各種元素都當作物件看待,所以每個元素的方法和屬性都很豐富,操作比較方便。而PHP只有在Form經過Post後,將Form中的元素轉成對應的變量,才能處理使用者輸入的資料。從互動性來說比較差,這也是使用JavaScript的原因。採用PHP的原因是因為比起其它CGI語言,其速度和安全性都較佳,開發也比較容易。

2. 不斷刷新的聊天室

一個標準的聊天室頁面由三個Frame組成,分別是顯示在線用戶的Online、用戶發言及功能設定的Say和顯示聊天內容的List。用戶在Say Frame中敲入發言內容後按發送,資料經過處理後保存在Mysql資料庫,同時被保存的還包括發言人、聊天對象及發言的時間。使用者一進入聊天室,List Frame從Mysql資料庫中把發言時間大於使用者進入時間的發言提出顯示出來。而後續顯示新的發言內容的關鍵,在於顯示聊天內容的那段程式是無限循環的。
? #Mysql資料庫連線
mysql_select_db(chat,$db);

顯示歡迎進入聊天室設定$init為資料庫中發言時間比進入時間大的第一個資料的ID號碼#是資料擷取的標誌位元while (1==1) { #無限迴圈開始擷取從$init到最後的資料;
while (每一個資料$text) {
$emote =strip_tags($text); #防止使用者直接輸入Html語言
if (eregi("^/",$emote)) #判斷發言是否有系統指令(以/開頭)
系統特殊處理
else 顯示發言
}
設定$init為最後資料的ID號
flush(); #清出輸出緩衝,使發言馬上顯示
sleep(2); #使程式暫停2秒,節省系統資源
mysql_free_result($result); #釋放資料庫結果佔用的記憶體
}



因為程式無限循環,在每次循環中輸出的發言是先置入輸出緩衝區內。透過flush()馬上把緩衝區的內容向使用者的List Frame送出,達到了即時的聊天效果。循環最後要釋放Mysql結果集所佔用的內存,否則因為無限循環的緣故,系統資源很快就會被耗盡。
使用者在Login後將建立一個Online的表格用於線上使用者的統計,主要是為了防止User表過大,程式中常用到的檢索會拖慢系統的運作。這其中用的最多的是Online Frame,在採用Client Pull的Refresh Meta,每隔一段時間就會查詢Online表,以刷新線上的用戶。如果使用者不發言超過規定時間,系統會呼叫自訂函數將使用者設為TimeOut,強制退出聊天室。

3. 使用者功能簡介

使用者的功能設定在Say Frame中,可以選擇發言貼圖、說話的語氣等。發言經過特殊的處理後儲存到Mysql,例如選擇了一個貼圖後,系統將添加到發言的前面,就可以實現貼圖的效果。
對於聊天室常用到的Emote,例如用戶A輸入“/hello”按發送,List Frame中顯示出來的是“用戶A愉快地和大家打招呼”,為了保持效率,用戶輸入的Emote會原文直接儲存到資料庫,而解析轉換的工作由List Frame來完成。
悄悄話只有自己和聊天對象可以看到,實現上因為發言預先保存有發言人和聊天對象,只要做一個簡單的判斷即可。還有聊天室常有的屏蔽某用戶發言的功能,透過設置一個臨時的陣列來實現,沒必要保存在用戶的資料庫中。
聊天室人多的時候,大家爭先發言常使人眼花繚亂,這時可以選擇是否屏蔽無關的發言,即意味著只要不是對所有人和自己的發言將不會顯示出來。當然,因為系統會用特殊的顏​​色來標識和自己有關的發言,就算不選擇該功能,用戶還是能快速地從眾多發言中找到和自己相關的。
使用者可以在特定時間(系統比較空閒時)將當天和自己有關的發言打包。因為儲存發言的表格資料成長速度很快,為維持運作效率,系統隔天就會把它複製後清空。這樣使用者檢索打包發言內容就不會影響聊天系統的運作。
出於安全的考慮,聊天室的管理功能是獨立的,並沒放在聊天頁面中。主要有使用者資料管理和將搗亂使用者Kick Out(踢人)兩種功能。將用戶踢出聊天室後將使他在一定的時間內不能再進入聊天室。
聊天室的安全要求雖然不像電子商務那麼高,但如果用戶被冒名頂替、用戶的發言被竊聽,或者亂踢人,是非常令人不快的。使用者都要在Login中填入名字和密碼才能進入聊天室,但透過檢視Login的原始碼,雖然無法看到Php的部分,Htnl部分的原始碼卻顯示Login是呼叫Chat.php程式而進入聊天室的。所以為了防止使用者直接進入聊天室,系統會先判斷新建立的聊天室是否由Login產生的,不是則退出。同理,在聊天室的List Frame和Post Frame也可加上這樣的防護。當然,在List Frame和Post Frame中檢查使用者的身分和密碼,就萬無一失了,只是加重了系統的負擔。
綜上所述,能看到系統的原始碼無疑是危險的開端,所以系統的編寫盡量用看不到原始碼的Php;設定由Login開啟的聊天室隱藏了瀏覽器的工具條、狀態欄等,並且屏蔽了滑鼠的右鍵及快捷鍵。

4. 總結

用Php編寫的聊天室具有高效穩定的特點,是編寫網路互動程式的最佳選擇。

參考文獻:
[1] Rasmus Lerdorf著. PHP Manual [M].電子文檔,2000


www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/316554.htmlTechArticlePHP聊天室技術黃國輝1.前言 上網聊天是時下最受歡迎的交友方式。各大網站推出的聊天室都各具特色。 聊天室主要分為WebChat、BBSChat兩種。 ...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles