2012-06-19 62 views
3

我有一個PHP腳本,當服務器發生特定事件時,必須重新加載客戶端上的頁面(服務器推送)。所以我必須聽取更改。我的想法是有一個文本文件,其中包含當前頁面的頁面加載數量。所以我想監視文件,並在修改後立即使用服務器推送來更新客戶端上的內容。問題是如何跟蹤文件中的PHP更改?使用PHP跟蹤文本文件中的更改

+1

PHP沒有這樣的機制,因爲沒有連續輪詢文件來查看時間戳/大小是否發生了變化。大多數現代操作系統都有通知系統,您可以將它們掛鉤,但是,哪些操作可以爲您解除繁重的工作。但既然你沒有說你正在使用哪個操作系統... –

+0

http://en.wikipedia.org/wiki/Comet%5F%28programming%29這可能有幫助 – Tivie

+0

但是不會重新加載頁面原因櫃檯也改變了?所以你最終會得到一個不斷刷新的頁面。 –

回答

1

你可以這樣做:

<?php 
while(true){ 
    $file = stat('/file'); 
    if($file['mtime'] == time()){ 
     //... Do Something Here ..// 
    } 
    sleep(1); 
} 

這將不斷尋找在每秒一個文件的修改時間的變化。如果你不限制它,你可以殺死你的磁盤IO,並可能需要調整你的ulimit。

+0

確保你包含一些東西來最終打破這個循環!這會讓機器立刻崩潰。 –

0

這將檢查你的文件一變:

<?php 
    $current_contents = ""; 

    function checkForChange($filepath) { 
    global $current_contents; 

    $new_contents = file_get_contents($filepath); 
    if (strcmp($new_contents, $current_contents) { 
     $current_contents = $new_contents; 
     return true; 
    } 

    return false; 
    } 

但是,這不會解決你的問題。服務客戶端的php文件在呈現的html發送給客戶端之前完成執行。該客戶端需要回調一些php文件來檢查更改...因爲這也是一個http請求,該文件將完成執行並忘記內存中的任何內容。

爲了正確地解決這個問題,您可能必須退出檢查文件的想法。服務器需要知道何時以及如何聯繫當前連接的客戶端,或者這些客戶端需要定期輪詢輕量級服務。

0

這是一種詭計,但是如何創建一個吸引頁面的cron作業,將它存儲在作用域或表中,然後每隔30秒比較一下呢?