2016-10-10 96 views
2

我正在玩長時間輪詢並試圖停止由AJAX調用啓動的腳本(如果發生新請求)。 這是由一個AJAX請求開始PHP代碼:

$checker = $_SESSION['checker'] = time(); 

while (true) { 
    if ($checker != $_SESSION['checker']) { 
      $out = 'new one started'; 
      break; 
    } 

    if (some other condition) { 
      $out = 'smth done or happend'; 
      break; 
    } 

    sleep(3); 
} 

echo $out; 

我一直在做一些記錄,它看起來像沒有更新$_SESSION['checker'],所以如果我運行相同的腳本(這應該改變$_SESSION['checker']變量) ,先前啓動的腳本中的while循環仍然會看到舊的$_SESSION['checker']。爲什麼不更新?

+1

'希望所有做sense'我對此表示懷疑。 –

+0

你好,請你能澄清你的問題嗎? – brclz

+0

我相信你應該用ajax部分來銷燬它,而不是通過PHP。在當前的httprequest上嘗試.abort()來停止它並啓動另一個。 –

回答

3

默認情況下,PHP會話不支持併發讀/寫操作。也就是說,當您從一個請求更新$ _SESSION數組時,它不會傳播到已經運行 PHP請求的

解決方案是創建一個文件,並監視該文件的filemtime(文件修改時間)。每當我們看到文件被更新時,我們知道另一個進程touch編輯它。

實現的例子:

$filename = ".test_file"; 

// Update the file modification time to the current time 
touch($filename); 
$modificationTime = filemtime($filename); 

while ($modificationTime === filemtime($filename) { 
    // Do stuff, file modification time is not yet updated. 
} 

// The file modification time has been updated! 

請注意,您應該測試變更頻繁,這取決於第一過程中應如何迅速結束,這意味着while循環中的代碼不應該花費太長的時間。

+0

對於文件filemtime的檢查是否遲到是沒有問題的,因爲那麼另一個進程已經在運行,並且它運行起來很神奇,並且可能會相互干擾? –

+0

好吧,一旦另一個進程開始,進程就需要立即停止。這個腳本是這樣做的,但只有每一個'while'。如果這段時間內的進程需要幾秒鐘,則在第一次ajax調用開始之前需要幾秒鐘,然後第一個ajax將停止。這可能意味着兩個呼叫在第一個呼叫停止之前運行一段時間。這可能是一個問題,取決於開發者的意願 –

+0

那麼我們如何更改文件呢?將會有一個操作正在運行(我們要停止的操作)。捕獲22的種類:) – user3195616

1

你可能想要從ajax而不是PHP端解決這個問題。 您可以通過中止停止當前的HTTP請求,是這樣的:

var xhr = $.ajax({ 
    type: "POST", 
    url: "file.php", 
    data: "parameter=input&type=test", 
    success: function(msg){ 
     alert("Data Saved: " + msg); 
    } 
}); 

//kill the request 
xhr.abort() 
+0

這是否真的會終止PHP進程? – Pete

+0

好問題,我不這麼認爲*'需要注意的一點是abort()會從瀏覽器的角度取消請求,但是如果請求已經成功發送到服務器,服務器仍然會處理所有事情。瀏覽器只會響應服務器發回的任何數據/響應。'* –

+0

它不會終止PHP進程,php腳本仍然在服務器上運行,它的瀏覽器會停止監聽 – user3195616