5

因此,这既是一个特定于语言的问题,也是一个理论问题,但请考虑一下:

我需要 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. 杀手.py:
    1. 听 20 秒 - 如果没有反应...
    2. os.system('pkill process')
  4. <?php while(true){sleep(15); exec('killer.py no_wait_dont');} ?>

你们的任何想法将不胜感激!

石匠

4

2 回答 2

3

Javascript 要容易得多,而且安全(也就是说,不多)。

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

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

于 2012-08-02T22:05:51.767 回答
2

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

  • js发送请求
  • php/python在后台启动子进程并将pid返回给js
  • js 用给定的 pid ping php/python
  • php/python 通过 IPC 向 pid 对应的子进程发送信号,例如,通过发送 SIGUSR1
  • 如果子进程没有及时收到信号;它死了,即子进程中有一个不断的自毁倒计时

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

于 2012-08-02T22:18:55.430 回答