關於HTTP長連接的「伺服器推」技術原理可以查看IBM的這篇文章,我簡單的做了個DEMO.
首先是首頁,包含一個文字輸入和一個顯示聊天內容的iframe,還有一個隱藏iframe用來提交form表單:
程式碼如下:
<?php //chat.php header('cache-control: private'); header('Content-Type: text/html; charset=utf-8'); ?> <html> <script type="text/javascript"> function submitChat(obj) { obj.submit(); document.getElementsByName('content')[0].value = ''; } </script> <iframe src="./chat_content.php" height="300" width="100%"></iframe> <iframe name="say" height="0" width="0"></iframe> <form method="POST" target="say" action="./say.php" onsubmit="submitChat(this)"> <input type="text" size="30" name="content" /> <input type="button" value="say" onclick="submitChat(this.form)" /> </form> </html>
另外一個就是保存用戶提交的聊天內容了,我簡單的寫一下文本,而且沒有做什麼鎖定,這個只是簡易版本:
程式碼如下:
<?php $content = trim($_POST['content']); if ($content) { $fp = fopen('./chat.txt', 'a'); fwrite($fp, $content . "\n"); fclose($fp); clearstatcache(); } ?>
接下來看主要的HTTP長連結部分,也就是chat_content.php檔:
程式碼如下:
<?php header('cache-control: private'); header('Content-Type: text/html; charset=utf-8'); //测试设置30秒超时,一般会设置比较长时间。 set_time_limit(30); //这一行是为了搞定IE这个BT echo str_repeat(' ', 256); ob_flush(); flush(); $fp = new SplFileObject('./chat.txt', 'r+'); $line = 0; $totalLine = 0; while (!$fp->eof()) { $fp->current(); $totalLine++; $fp->next(); } $fp->seek($totalLine); $i = $totalLine - 1; while (true) { if (!$fp->eof()) { if ($content = trim($fp->current())) { echo '<div>'; echo htmlspecialchars($content); echo "</div>"; flush(); $fp->next(); $i++; } } else { $fp->seek($i - 1); $fp->next(); } { //这里可以添加心跳检测后退出循环 } usleep(1000); } ?>
我一行行解釋一下,其實也比較容易理解:
06. 設定一個超時時間,由於要保持HTTP長連接,這個時間肯定要比較長,可能要幾個小時吧,上面提到的文章裡也有說明,這種HTTP長連線只能打開兩個,由於瀏覽器的限制。另外其實即使你設定了一個永不超時,其實上伺服器部分(如Apache)的設定檔也可能對HTTP請求設定了最長等待時間,所以也可能效果會不是你想的,一般預設可能都是15分鐘超時。如果有興趣可以自己嘗試修改。
09. 這裡輸出了一段空白,主要是手冊上已經說明了,IE瀏覽器在前面256個字符是不會直接輸出的,所以我們先隨便輸出些空白,以便讓後面的內容輸出來,可能其他瀏覽器也有其他瀏覽器的設置,具體可以查看PHP手冊的frush函數的說明。接下去11、12行就是強制把這些空白符號丟給瀏覽器輸出。
13. ~ 20. 這裡主要是為了計算檔案行數,以便從這一行後面開始讀取內容。
接下去的while循環就是一個死循環了,就是循環輸出文件內容,每次判斷是否到達文件末尾,如果有用戶寫入文件,則當前檢測肯定不是文件末尾,就將該行讀取出來輸出,否則將指針往前移動一行,繼續循環,每次等待1000微秒,
39. 如果一直保持長連接,那麼即使客戶端斷開,服務端也不一定能知道客戶端已經斷開,所以這裡可能還需要做一些心跳記錄,例如每個用戶保持一個心跳flag,每格幾秒更新一下最後心跳時間,當檢測最後時間很久沒更新後,推出這個死循環,關閉這個HTTP連線。

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 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

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