PHP / Python中的Dead Man's Switch

时间:2012-08-02 21:01:46

标签: php python process kill

因此,这是一个与语言相关的理论问题,但请考虑一下:

我需要PHP来执行一个相当系统密集的进程(使用PHP exec();),该进程将在后台运行,但是当用户离开该特定页面时,该进程将被终止。

我很快意识到死人的切换将是一种简单的方法来实现这一点,因为我没有使用任何会话变量或其他服务器端变量,这可能最终看起来像:

if($_SERVER['REQUEST_URI'] !== 'page_with_session.php'){
    //Instead of 'session_destroy();' this would be used to kill said process
}

在任何情况下,在PHP中使用while循环,在Python脚本中重置计时器或每15秒重新调用一次该脚本,以便它不会到达终点并终止进程。但是,当用户离开页面时,脚本将被调用,但在终止进程之前无法重置。

这个想法是否有任何漏洞?如果没有,PHP / JS中的实现如何?我看到它的工作顺序是:

  1. 页面被用户点击
  2. <?php exec('killer.py') ?>
  3. killer.py:
    1. 听20秒 - 如果没有回应......
    2. os.system('pkill process')
  4. <?php while(true){sleep(15); exec('killer.py no_wait_dont');} ?>
  5. 非常感谢你们的任何想法!

    梅森

2 个答案:

答案 0 :(得分:3)

Javascript更容易,而且安全(即不多)。

只需编写一个javascript ping函数,每隔10秒就会发一次ping.php(通过ajax)。这个ping.php将在用户会话中收到最后一次ping时记录(比如$_SESSION['last_ping']

您可以通过将$_SESSION['last_ping']与当前时间进行比较来检查其他网页的用户活动。你必须用这个来运行你的运行时密集型页面,但它肯定会起作用。

答案 1 :(得分:2)

在JS中实现心跳。如果它停止超过一定时间,则终止子进程:

  • js发送请求
  • php / python在后台启动子进程并将pid返回给js
  • js pings php / python with given pid
  • php / python通过IPC发信号通知对应于pid的子进程,例如通过发送SIGUSR1
  • 如果子进程没有及时收到信号;它死了,即子流程中有一个持续的自毁倒计时

如果无法将自毁机制添加到子进程,则需要一个能够接收信号并终止子进程的观察程序进程。它不太可靠,因为您需要确保观察程序进程正在运行。