2012-07-30 75 views
0

我的php腳本似乎有些不對,但我不知道它是什麼。似乎錯誤的唯一可能的事情是與緩存有關,但我不確定。這裏是我的劇本,我會告訴你發生了什麼下面的代碼:php無限循環和彗星?

<?php 
set_time_limit(0); 
header('Content-Type:text/event-stream'); 
$prevmod=$lastmod=filemtime('chattext.txt'); 
function waitformod(){ 
global $lastmod; 
global $prevmod; 
while($prevmod==$lastmod){ 
    usleep(100000); 
    clearstatcache(); 
    $lastmod=filemtime('chattext.txt'); 
    } 
echo 'data:'.file_get_contents('chattext.txt').PHP_EOL.PHP_EOL; 
flush(); 
$prevmod=$lastmod; 
} 
while(true){ 
waitformod(); 
} 
?> 

這應該使用JavaScript的EventSource使用,每當它被修改發送chattext.txt的內容。但是,該文件不輸出任何內容。我認爲這是因爲無限循環。有沒有什麼辦法解決這一問題?

+0

請澄清... – Petah 2012-07-30 05:10:19

+0

發生這種情況:1)我修改文件2)PHP文件發送chattext.txt,因爲它是在我修改文件之前。這是否更有意義? – Markasoftware 2012-07-30 05:12:15

+0

你的意思是你使用'global'這個事實的一部分? – Shoe 2012-07-30 05:18:21

回答

1

像這樣的工作更好嗎?

<?php 

set_time_limit(0); 
header('Content-Type:text/event-stream'); 

$prevmod = $lastmod = filemtime('chattext.txt'); 

function waitformod(){ 
    global $lastmod; 
    global $prevmod; 

    while($prevmod == $lastmod) { 
     usleep(100000); 
     clearstatcache(); 
     $lastmod = filemtime('chattext.txt'); 
    } 

    echo 'data:'.file_get_contents('chattext.txt').PHP_EOL.PHP_EOL; 
    flush(); 

    $prevmod = $lastmod; 
} 

while(1) { 
    waitformod(); 
} 

您當前的代碼看起來像是讀取文件,輸出它,等待它改變,然後終止。

+0

這似乎太棒了!只是問(這不重要)在這種情況下,flush()會做什麼?我聽說過它,但不知道它的作用。 – Markasoftware 2012-07-30 05:19:31

+0

它(嘗試)強制服務器刷新輸出緩衝區並在此時將所有數據發送到客戶端。輸出通常是緩衝的,不會立即發送。 – drew010 2012-07-30 05:22:38

+0

它看起來像這樣會工作,但它不輸出任何東西。我認爲這是無限循環。我怎樣才能解決這個問題? – Markasoftware 2012-07-31 02:29:03