在PHP中,flush()函數(shù)是非常重要和實(shí)用的一個(gè)函數(shù)。它能夠在Web頁(yè)面輸出運(yùn)行時(shí)輸出的全部或部分?jǐn)?shù)據(jù),而并不等待全部的代碼輸出執(zhí)行完成后再將其一次性輸出給瀏覽器。 在本文中,我們將學(xué)習(xí)flush函數(shù)的使用方法和場(chǎng)景。
在一個(gè)較大的WEB應(yīng)用程序中,數(shù)據(jù)處理是非常耗時(shí)并且需要進(jìn)行耗時(shí)較久的操作,例如長(zhǎng)時(shí)間的數(shù)據(jù)查詢或者數(shù)據(jù)的修改。 在這種情況下,每一個(gè)數(shù)據(jù)處理的請(qǐng)求都需要等待完成才能響應(yīng)請(qǐng)求者。 這時(shí)就需要一種方式來(lái)在處理數(shù)據(jù)的同時(shí),向客戶端實(shí)時(shí)返回一部分?jǐn)?shù)據(jù)。 所以說(shuō),flush函數(shù)的出現(xiàn)為我們提供了一種很好的數(shù)據(jù)傳輸和管理方式。
這里我們先看一個(gè)小例子:
echo "flush test 1"; flush(); sleep(2); echo "flush test 2"; flush(); sleep(2); echo "flush test 3"; flush();
執(zhí)行這個(gè)文件會(huì)看到:“flush test 1”、“flush test 2”、“flush test 3”在間隔2秒后一個(gè)一個(gè)輸出。這個(gè)例子很簡(jiǎn)單,只是詳細(xì)說(shuō)明了flush函數(shù)的基本用法。
在Web頁(yè)面中,有時(shí)候我們需要實(shí)時(shí)的輸出信息,而這些信息在執(zhí)行過(guò)程中是需要不斷更新的。 下面舉一個(gè)進(jìn)度條更新的例子。
/* 下面是一個(gè)更新進(jìn)度條的例子 */ for ($i = 1; $i<= 100; $i++) { echo "\n"; flush(); echo $i."%"; sleep(1); }
執(zhí)行這個(gè)文件,可以看到一個(gè)進(jìn)度條從1%到100%逐漸增長(zhǎng)的過(guò)程。在Web應(yīng)用程序中,更新進(jìn)度條是比較常見(jiàn)的一種場(chǎng)景。 在這個(gè)例子中我們先通過(guò)for循環(huán)模擬了1~100的迭代過(guò)程,每隔1秒鐘輸出一個(gè)百分比即可實(shí)現(xiàn)進(jìn)度條的更新。為什么需要加上flush()呢? 因?yàn)閒lush可以調(diào)用PHP的緩沖區(qū),實(shí)時(shí)輸出數(shù)據(jù),所以我們可以通過(guò)執(zhí)行flush()函數(shù)將當(dāng)前緩存的數(shù)據(jù)強(qiáng)制輸出。
另一個(gè)實(shí)現(xiàn)方式是在Web頁(yè)面使用ajax來(lái)更新進(jìn)度條,但這種方式還需要提交請(qǐng)求。使用flush函數(shù)時(shí)我們可以不斷的更新數(shù)據(jù),只要瀏覽器始終處于活動(dòng)狀態(tài)。
在這里我們必須要注意,flush函數(shù)會(huì)產(chǎn)生一個(gè)巨大的開(kāi)銷,因?yàn)樗鼤?huì)阻塞服務(wù)器的CPU。 所以說(shuō),為了保證程序的性能和穩(wěn)定性,我們需要合理使用flush函數(shù)。
總之,flush函數(shù)可以實(shí)現(xiàn)信息的實(shí)時(shí)輸出,輕松控制數(shù)據(jù)的傳輸,達(dá)到一個(gè)比較好的網(wǎng)站交互效果。 合理選擇使用場(chǎng)景,才能更好的開(kāi)發(fā)出好的Web應(yīng)用程序。