搜尋
首頁後端開發php教程php伺服器推技術的聊天室

有幾個概念之間的關係,這裡補充下: 在程式碼中使用ob_start(), 就相當於在php.ini中使用output_buffering=on一樣,使用伺服器快取。 在程式碼中使用ob_end_flush() 就相當於在php.ini中使用output_buffering = false一樣,關閉伺服器快取。
  1. //chat.php
  2. header('cache-control: private');
  3. header('Content-Type : text/html; charset=utf-8');
  4. ?>
  5. 函數submitChat(obj) {
  6. obj. submit();
  7. document.getElementsByName('content')[0].value = '';
  8. }
複製程式碼

儲存使用者提交的聊天內容 簡單版本:

  1. $content = trim($_POST['content']);
  2. if ($content) {
  3. $fp = fopen('./chat.txt', 'a');
  4. fwrite($fp, $content . "n");
  5. fclose($fp);
  6. clearstatcache() ;
  7. }
  8. ?>
複製程式碼

主要的HTTP長連接部分,chat_content.php檔案:

  1. header('快取控制:私有');

  2. header('內容-Type: text/html; charset=utf-8');
  3. //測試設定30秒逾時,一般會設定比較時間。
  4. set_time_limit(30);
  5. //這行是為了搞定IE這個BT
  6. echo str_repeat(' ', 256);
  7. ob_flush();

  8. flush();
  9. $line = 0;

  10. $totalLine = 0;
  11. while (!$fp->eof() ) {
  12. $fp->current();
  13. $totalLine++;
  14. $fp->next();
  15. }
  16. $fp ->seek($totalLine);

  17. $i = $totalLine - 1;
  18. while (true) {
  19. if (!$fp->eof()) {
  20. if ($ content = trim($fp->current())) {
  21. echo '
    ';
  22. echo htmlspecialchars($content);
  23. echo "
" ;
  • 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連線。

    示範範例2: 傳統的B/S結構的應用程序,都是採用"客戶端拉"結束來實現客戶端和伺服器端的資料交換。 本文將透過結合Ticks,來實現一個伺服器推的PHP聊天室簡單構想。

    PHPer,尤其是用過set_cookie, header的,一定看過這樣的提示訊息:"Warning: Cannot modify header information - headers already sent by.....", 這是因為透過HTTP協定通信 ,封包會包含兩個部分,一個是Header,一個是data。 一般來說,都是先Header部分,在Heaer部分指明了Data部分的長度,然後使用\r\n\r\n來表示header部分結束,接下來是Data部分。

    當有任何輸出時,Header部分就發送了,此時,再想header函數來改變一些Header部分的域訊息,就會得到上面的提示訊息。 一個簡單的方法就是使用output_buffering。讓它來快取伺服器的輸出,不要太早將Header部分發給客戶端。 那麼,如果不使用output_buffering,是不是就可以實現,每當伺服器有輸出,就立即傳送給客戶端呢? 做個如下試驗:

    1. //設定php.ini中output_buffering=0 或使用ob_end_flush()關閉快取
    2. set_time_limit(0); 🎜>for($i=0;$i echo "Now Index is :". $i;
    3. sleep(1);
    4. }
    5. ?>
    複製程式碼
    結果發現,還是要等到腳本全部執行完以後,才能一次看到所有的結果。為什麼呢? 這是因為只是解決了快取問題,但還有一個緩衝問題,PHP會緩衝程式的輸出。 所以,此時還需要調用,flush(), 來強制使得PHP將所有的程式輸出傳送給客戶端。

    1. //設定php.ini中output_buffering=0

    2. ob_end_flush();//關閉快取
    3. set_time_limit(0);

    4. for($i=0;$i echo "Now Index is :". $i;
    5. flush();
    6. sleep(1);
    7. }
    8. ?>
    複製程式碼

    複製程式碼

    現在是不是看到了,不斷有伺服器的資料顯示出來?

    1 2 下一頁 尾頁


    陳述
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    哪些常見問題會導致PHP會話失敗?哪些常見問題會導致PHP會話失敗?Apr 25, 2025 am 12:16 AM

    PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

    您如何在PHP中調試與會話相關的問題?您如何在PHP中調試與會話相關的問題?Apr 25, 2025 am 12:12 AM

    在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

    如果session_start()被多次調用會發生什麼?如果session_start()被多次調用會發生什麼?Apr 25, 2025 am 12:06 AM

    多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

    您如何在PHP中配置會話壽命?您如何在PHP中配置會話壽命?Apr 25, 2025 am 12:05 AM

    在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

    使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

    使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

    您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

    在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

    什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

    SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

    您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

    在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

    See all articles

    熱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

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

    熱工具

    Dreamweaver Mac版

    Dreamweaver Mac版

    視覺化網頁開發工具

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    Safe Exam Browser

    Safe Exam Browser

    Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具