2012-02-21 95 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