2016-10-10 60 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

相关问题