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);
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

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

Fibers在PHP8.1中引入,提升了並發處理能力。 1)Fibers是一種輕量級的並發模型,類似於協程。 2)它們允許開發者手動控制任務的執行流,適合處理I/O密集型任務。 3)使用Fibers可以編寫更高效、響應性更強的代碼。

PHP社區提供了豐富的資源和支持,幫助開發者成長。 1)資源包括官方文檔、教程、博客和開源項目如Laravel和Symfony。 2)支持可以通過StackOverflow、Reddit和Slack頻道獲得。 3)開發動態可以通過關注RFC了解。 4)融入社區可以通過積極參與、貢獻代碼和學習分享來實現。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版
SublimeText3 Linux最新版

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能