PHP $ _SESSION不在请求之间共享

时间:2016-10-10 14:45:56

标签: php loops session

我正在玩长轮询并尝试在新请求发生时停止由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']。为什么不更新?

2 个答案:

答案 0 :(得分: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循环中的代码不会花费太长时间。

答案 1 :(得分: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()