2012-02-21 98 views
1

我有這樣的循環中長輪詢:PHP長輪詢失敗

$time = time(); //send a blank response after 15sec 
    while((time() - $time) < 15) { 
      $last_modif = filemtime("./logs.txt"); 
      if($_SESSION['lasttime'] != $last_modif) { 
       $_SESSION['lasttime'] = $last_modif; 
       $logs = file_get_contents("./logs.txt"); 
       print nl2br($logs); 
       ob_flush(); 
       flush(); 
       die(); 
     } 

     usleep(10000); 
    } 

的問題是:「如果」條件是從來沒有在while循環的中間進入,即使logs.txt被修改。我必須等15秒,直到下一次調用此文件才能獲取更新的內容(因此它變成了常規的「setTimeout風格」AJAX輪詢,而不是長時間輪詢)。任何想法爲什麼?

+0

我們看不到$ _SESSION ['lasttime']和$ last_modif在哪裏變化,您在沒有if的情況下嘗試它並檢查它是否可用 – ZiTAL 2012-02-21 14:22:29

+0

對不起,我沒有添加它們,因爲我知道它們不相關:/ my問題是回答,但再次感謝 – Cystack 2012-02-21 14:39:30

回答

3

這是因爲filemtime()函數:其結果被緩存。因此,每次循環執行時,時間戳都相同,持續15秒。

我還沒有嘗試過自己,但according to w3cschools

此函數的結果會被緩存。使用clearstatcache()清除緩存。

希望有所幫助!

+0

你不應該鏈接到w3schools,謝謝你的答案,雖然,就像一個魅力! – Cystack 2012-02-21 14:38:53

+0

W3Schools?這似乎是一個奇怪的地方去尋求PHP建議。 [PHP.net](http://php.net/manual/en/function.filemtime.php)雖然說了同樣的事情,所以w3schools不能全部壞。 – 2012-02-21 14:40:58

+0

是的,它並不是那麼糟糕,我已經打開了網站的另一件事,我需要檢查SQL。我有點喜歡它的簡潔。 – Mercutionario 2012-02-21 14:43:54