用XHR取消PHP脚本?

时间:2011-12-12 11:35:24

标签: php javascript jquery ajax xmlhttprequest

我有你的帮助:

function send(){
  $.get("/site/send.php", function(data){
    alert(data);
  }
}

在site / send.php中我有:

for($=0;$i++;$i<1000)
    sleep(1);
}
    echo "OK";

接下来我在我的js文件中:

send();
$("#click").click(function(){
  window.stop(); // this cancel XHR
  $.get("/site/reset.php", function(data){
    alert(data);
  }
})

并在reset.php中:

echo "RESET";

window.stop();取消我的XHR,但这仍然无法正常工作。我取消了XHR,但仍然必须等待函数send()中的 sleep(1000)。这不会返回任何内容,但仍会继续执行。只有当睡眠> 1000然后 /site/reset.php 开始执行。

我在这个例子中如何取消PHP函数?

是否可以检查PHP文件检查是否仍然存在XHR?

3 个答案:

答案 0 :(得分:2)

以下任何一种情况都可行:

ignore_user_abort(false);

for ($=0;$i++;$i<1000) {
   if (connection_aborted()) break;

for ($=0;$i++;$i<1000) {
   if (connection_status() != CONNECTION_NORMAL) break;

答案 1 :(得分:1)

如果你在php服务器上有root权限,如果你在linux上,你可以使用`:

执行一些bash命令
echo `ps -A`;

获取机器上所有正在运行的进程的列表,然后如果您知道用户apache用于执行脚本,那么您可以     echo ps -u user;

确定正确的PID后,您可以使用以下命令将其终止:

echo `kill PID`;

echo `kill 1023`;

//我不知道这是否正常    eval('echo kill '.$_GET['PID'].';');

所有这些都是在不同的php脚本中执行的,完全是为了在命令中杀死其他脚本。

您可以使用AJAX从上述脚本中请求此类作业。

另外你可以让php文件写入客户端它自己的PID(google用于写入功能,它看起来非常像c),然后javascript可以直接将该PID发送到该杀手脚本以命令执行停止对于某些剧本。

编辑1:

您可以使用此功能获取正在运行的脚本PID:

getmypid();

您可以将其保存在文件中,或者更好地保存在会话变量中

$_SESSION[__FILE__] = getmypid();

要阻止文件运行,你可以像这样调用一个页面(killer.php):

<?php
// security verifications, etc
/*

*/ 
session_start();
$f = $_SESSION[$_GET['file']];
echo `kill $f`;

?>

虽然很危险。

我不知道要执行的确切命令,或者您是否拥有这种控件,或者即使您使用的是Linux系统。如果你愿意,我可以稍微研究一下。

致以最诚挚的问候,

答案 2 :(得分:0)

$("#click").click(function(){
  //window.stop(); 
  return false;