好吧,我一直在努力解决天这个问题,但没有找到解决办法。我已经询问了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)的可靠性。
答案 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运行时:
当然,这可能不是最佳解决方案,但应该适用于您的用例。
检查PHP中的文件函数,没有复杂的魔术代码。