使用ignore_user_abort()杀死PHP脚本

时间:2015-11-17 07:40:07

标签: php

前一段时间,我正在寻找一种方法,以便在用户中止时保持PHP脚本运行。 (当用户关闭它的浏览器时)。即使用户决定离开,我也需要这个长期查询才能完成。

ignore_user_abort(1);
set_time_limit(0);

while (true) {
    // Do queries
}

我如何杀死上述脚本?

更新

我建议使用getmypid()功能。我现在实现了以下内容:

ignore_user_abort(1);
set_time_limit(0);

// Get process id
$pid = getmypid();

$stmt = "INSERT INTO processes (pid, started) VALUES ('".$pid."', NOW())";
while (true) {
    // Do Queries
    if ($query) {
        break;
    }
}
$stmt = "UPDATE processes SET ended=NOW() WHERE pid='".$pid."'";

我现在可以查询数据库,看看hwat进程还没有完成。我知道这些过程都被卡住了。

2 个答案:

答案 0 :(得分:3)

您可以通过识别进程ID来终止php进程。但是你必须以root用户身份直接从终端执行。为www-data(php用户)授予权限以杀死进程是一种糟糕的方法。

最佳方法是,在循环内部,您必须检查存储在数据库中的任何标志才能继续,否则退出。因此,您可以通过代码轻松管理这些数据库标记。

答案 1 :(得分:1)

当客户端(浏览器用户)关闭浏览器时,

ignore_user_abort()与暂停执行当前PHP页面有关。它不会阻止您的PHP代码执行。因此,die;条件或更改set_time_limit()会导致您的PHP脚本失效。

您的代码可能类似于:

set_time_limit(200); ignore_user_abort(1);
include 'connection.php'; $db = db();
// do queries like normal not in a continuous loop
if($q = $db->query(/**/)){
  if($q->num_rows > 0){
    // do stuff
  }
}
else{
  die;
}