前一段时间,我正在寻找一种方法,以便在用户中止时保持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进程还没有完成。我知道这些过程都被卡住了。
答案 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;
}