原理是,利用javascript的settimeout重複檢查一個.txt檔案的大小
然後將其大小數字輸入一個hidden的input裹,每次檢查大小後,也比較input裹的大小數目,如果.txt檔案被更改,則會與input裹的數字(也就是前一次檢查時的大小數目)不一樣,這個時候就下載.txt的內容,然後顯示在<div id="show"></div>裹,如此類推
問題是,怎樣獲取.txt的檔案大小呢?
原本這個聊天室是利用.txt存訊息,經由ajax不斷下載這個.txt獲得全部訊息,可想而之若果.txt裹的字數非常多時(可能高達幾mb),以ajax不斷下載的情況下,使用的帶寬將會以驚人的速度消耗;因此,我想利用不斷檢查檔案大小(訊息不能被修改,只能不斷地加上,所以檔案大小若果沒變的話,同樣內容亦不會變)檢測有否新留言加入,代替直接不斷地下載.txt檔案,以節省能源 若果javascript不能檢測檔案大小,還能有其他方法不斷地檢測大小以供利用ajax更新嗎?
剛剛腦子一亮,想到以下方案代替檢測大小 先開啟一個新的.txt,定名為update.txt,內容只能是0-9,當有新留言時,除了將留言加入在儲存訊息之用的com.txt外,還更改update.txt裹的文字,將裹面的數字加上1;在檢測有否新留言時,先利用ajax獲取update.txt裹的數字,將它放在一個hidden的input裹,每隔5秒,再次取update.txt裹的數字,看看是否跟先前的那一次相同,若是,則代表有新留言,然後下載com.txt的內容並顯示,若否,則代表沒有新留言加入,如此類推;目的是利用一個字元代替下載com.txt的需要,以節省帶寬和伺服器的負荷 你認為行嗎?
我知道區區一個聊天室系統,並不需要這麼笨拙的方法,這個系統其實是配合一個發貼系統,作者在編寫文章時,我希望其他人能夠觀看到他的文章進度,而且需要為文章作一個暫存,以供作者能隨時修改文章(因此不能利用MySQL),所以每發一個貼,就要為作者新增一個.txt檔案,並每隔一段時間將文章存入.txt裹,觀看者則利用ajax,不斷下載他的.txt,當然觀看者還能即時留言給他,整個就像一個聊天室,但現在問題在於能否有別的方法代替下載com.txt
那麼,javascript能否實現檢查檔案的最後更新時間?
對不起,最近在看有關sever push技術,非常有趣~~ [email protected]的回答非常精彩!
最後還是利用php的死循環來不停檢測檔案size是否跟前一次更新時的一樣~
最後一條問題~ 為什麼php的while死循環執行了一段時間後,會自動結束,有沒有解決方法,可以令死循環繼續無限地循環下去,直到循環正常地結束? 這是碼源: while($time == filesize($file)){ } echo ........檔案內容........; 其中$time是利用ajax傳送過來、有關上一次更新時該檔案的size的值, 利用while,如果上次更新時的size跟現在的file size一樣,則繼續循環直到file size跟上次的size不一樣,這樣,while便正常地結束,然後就是執行輸出檔案內容
對,php回應後,ajax連接就會斷開,這是一次性的 所以當死循環傳來數據時,有2種可能性,1是check到size不同,2是超時 當兩者傳回是但一個時,可以利用ajax再次執行死循環,直到有下一次更新為止
已經有初步的成果了
<?php $time = $_POST['id']; $file = 'cache/art/'.$_POST['file'].'_a.txt'; while($time == filesize($file)){ clearstatcache(); } echo filesize($file); ? >
當$file更新時,頁面立即收到最新size,是個好開始~ 而且測試了內存,佔用率非常低~!
<?php $time = $_POST['id']; try{ do{ clearstatcache(); sleep(3); $file = filesize('cache/art/'.$_POST['file'].'_a.txt'); if($time != $file){ echo $file; } clearstatcache(); } while($time == $file); }catch(Exception $e){ } ? >
以上代碼,雖然work,但有一個問題 當$time跟$file一樣時,就會無限循環,直到他們不一樣為此,然後就會輸出最新的$file數值 但是我發現這碼,對於在循環中時更新檔案,雖然while會正常地停止,但卻輸出不了$file的數值