PHP在重试时杀死旧脚本执行

时间:2014-07-23 16:08:28

标签: javascript php jquery session cookies

好吧,我一直在努力解决这个问题,但没有找到解决办法。我已经询问了4-5个与我的问题有关的不同问题,但没有找到解决方案。

file.php上的

example1.com

我在这个页面上有一个JavaScript函数,它向example2.com(一个不同的域)上的PHP文件发送一个POST请求。

function buttonFunction() {
    $.post("http://example2.com/core/runner.php",{username:username, password:pword, coins:coins}, function(data) {
        // Stuff
    });
}

此函数将runner.php的结果动态加载到页面上的div中。

现在,如果用户在执行过程中离开页面(结果尚未生成)然后他/她刷新页面,然后决定再次运行该函数,那么两个PHP proccesses将同时从同一个用户运行(也就是说,如果旧用户仍在运行)。

现在我需要一个修复,无论是在example2.com上的PHP文件中还是在example1.com上的JavaScript中,它可以在启动之前中止/停止先前的PHP请求一个新的。

我尝试过的事情:

#1

我试过这个,但不幸的是,跨域cookie实际上是不可能的:

PHP session files saved, but no cookies and session not read

目标是将PHP pid存储在SESSION变量中,并在每次运行时检查具有该pid的旧进程是否仍在运行(通过从SESSION变量中获取pid),如果是,那么我会杀死该进程并将SESSION变量的值更改为新的pid。

#2

我还尝试运行循环来检查主脚本运行时连接是否已中止。但是,这也行不通:

PHP run loop and script at same time

#3

我还想过做这样的事情:

window.onbeforeunload = function(event) {
    http.abort();
};

因此,在用户离开/刷新页面/浏览器之前,它会中止请求。但是,我不确定这个(Safe Way to Send POST Request via Javascript)的可靠性。

2 个答案:

答案 0 :(得分:0)

第一次执行脚本runner.php时您可以创建一个文件并锁定它直到脚本结束,所以当有另一个请求到该脚本时您可以检查文件是否被锁定 - 然后您有信息您可以再次运行脚本,例如:

$fo = fopen('lock.txt', 'r+'); 
if (flock($fo, LOCK_EX)) 
{
    // File was not locked, You have locked it successfully right now, do your logic 
    flock($fo, LOCK_UN); // unlock file afer script logic
} 
else
{ 
    // File is locked right now, don't run script
}

之后您可以向用户发送他可以稍后尝试的消息(导致第一个脚本正在运行),而不是杀死第一个脚本。

我认为这是设计问题,当涉及到杀死脚本时,它看起来并不好。当你在执行过程中杀死脚本时,数据怎么样?这可能会导致一些严重的问题。

答案 1 :(得分:0)

正如其他用户所指出的,使用文件是执行此操作的最佳方式。我的逻辑是这样的:

当runner.php运行时:

  • 首先检查名为username + number的文件是否存在
  • 如果存在,则删除该文件,并创建名为username +(number + 1)
  • 的新文件
  • 如果不存在,则创建名为username + 1
  • 的文件
  • 将此数字(即1或数字+ 1)存储在变量
  • 进行任何必要的处理
  • 在发回响应之前,请检查名为(用户名+您的var中的号码)的文件是否存在
  • 如果是,请发送回复
  • 如果不是,则表示正在运行另一个(稍后的)进程(仅针对该用户,因为我们使用用户名命名该文件)并且该进程已删除当前进程的文件,因此只需终止而不执行任何操作。

当然,这可能不是最佳解决方案,但应该适用于您的用例。

检查PHP中的文件函数,没有复杂的魔术代码。