【问题标题】:Killing a PHP script that's using ignore_user_abort()杀死使用 ignore_user_abort() 的 PHP 脚本
【发布时间】:2015-11-17 07:40:07
【问题描述】:

前段时间,我正在寻找一种方法来在用户中止时保持 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 进程。我会知道这些进程被卡住了。

【问题讨论】:

  • 1.通过杀死执行该脚本的进程,以及 2. 对于需要较长时间处理的东西,您应该改用排队系统。
  • 当你想杀死这个脚本时是什么事件?
  • @arkascha 你能详细说明你的评论吗?
  • @AkshatSinghal 它运行一些查询然后完成。但有时我感觉它只是一直挂起,我的服务器变慢了。所以,我希望能够管理以某种方式继续运行的脚本。知道他们跑了多长时间并杀死他们。
  • 在 DB/ 文件中保留运行脚本的日志(脚本启动时添加进程 ID),脚本结束时删除该条目。这样你就会知道正在运行的脚本,然后可以使用 sudo kill {pid} 杀死

标签: php


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2016-01-24
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多