PHP實現 伺服器推 (flush函式使用)

2021-08-30 09:39:28 字數 1215 閱讀 6318

最近一直在做自己的圖書站,分別使用過傑奇和讀吧兩套不同的系統,對於這兩套系統也是又愛又恨,愛的是他們的功能強大,恨他們都同屬沒有開源精神的產物。呵呵,作為一名窮程式設計師,俺可以理解作者的苦衷,這裡就不批判了。

年假期間,無事可做,翻看自己以前的採集**,發現很多可以優化和提公升的地方,就簡單做了下優化,其中也使用了使用者體驗更加優秀的伺服器推技術,這裡簡單的介紹下核心的函式:flush。

先看看手冊中的解釋:

flush — 重新整理輸出緩衝;

說明:

void flush ( void )

重新整理php程式的緩衝,而不論php執行在何種情況下(cgi ,web伺服器等等)。該函式將當前為止程式的所有輸出傳送到使用者的瀏覽器。

flush() 函式不會對伺服器或客戶端瀏覽器的快取模式產生影響。因此,必須同時使用 ob_flush() 和flush() 函式來重新整理輸出緩衝。

個別web伺服器程式,特別是win32下的web伺服器程式,在傳送結果到瀏覽器之前,仍然會快取指令碼的輸出,直到程式結束為止。

有些apache的模組,比如mod_gzip,可能自己進行輸出快取,這將導致flush()函式產生的結果不會立即被傳送到客戶端瀏覽器。

甚至瀏覽器也會在顯示之前,快取接收到的內容。例如 netscape 瀏覽器會在接受到換行或 html 標記的開頭之前快取內容,並且在接受到

標記之前,不會顯示出整個**。

一些版本的 microsoft internet explorer 只有當接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。

根據上面的解釋,我們簡單的使用flush函式來實現乙個例子:

<?php

for ($i=10; $i>0; $i--)

?>

上面的這段**,應該隔一秒鐘輸出一次$i。但是實際中卻不一定是這樣。有可能是等了10秒鐘後,所有的輸出同時呈現出來,後面的輸出開始正常。php手冊中對此也做出了解釋,就是各種快取在起作用,那我們該如何解決呢?!

答案來了:^_^

一、<?php

ob_end_clean();//修改部分

for ($i=10; $i>0; $i--)

?>

二、<?php

for ($i=10; $i>0; $i--)

?>

寫到這裡,發現乙個哥們的文章,比我寫的更加透徹,在次引用:

剖析php中的輸出緩衝

戴爾推PowerEdge 14G伺服器 實現智慧型化

北京時間5月10日訊息,戴爾展示了第14代poweredge伺服器產品,其將搭載英特爾xeon處理器,並有一系列新功能。據悉,poweredge 14g採用流線型的前端設計,引入摺邊結構元素,減少了伺服器使用塗料帶來的環境汙染。poweredge 14g將嵌入儲存和資料中心一體機 超融合一體機,以及...

多路IO轉接伺服器實現方法三 epoll 函式

epoll是linux下多路復用介面select poll的增強版本。它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率,因為它會復用檔案描述符集合來傳遞結果而不用每次等待時間之前都必須重新準備要被監聽的檔案描述符集合 獲取事件的時候,它無須遍歷整個被監聽的檔案描述符集,只要遍歷...

PHP實現多伺服器SESSION共享

現在稍微大一點的 基本上都有好幾個子網域名稱,比如www.feiniu.com,search.feiniu.com,member.feiniu.com,這些 如果需要共用使用者登入資訊,那麼就需要做到session共享,當然前提是有相同的主域。客戶端訪問php頁面,執行session start,生...