首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP/Python中的死人开关

问PHP/Python中的死人开关
EN

Stack Overflow用户
提问于 2012-08-02 21:01:45
回答 2查看 1.4K关注 0票数 5

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

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

我很快意识到,一个死人的开关是实现这一点的一个简单方法,因为我没有使用任何会话变量或其他服务器端变量,这些变量最终可能看起来如下所示:

代码语言:javascript
复制
if($_SERVER['REQUEST_URI'] !== 'page_with_session.php'){
    //Instead of 'session_destroy();' this would be used to kill said process
}

在任何情况下,PHP中的while循环,重置Python脚本中的计时器,或者每15秒重新调用said脚本,这样它就不会结束并终止进程。但是,当用户离开页面时,脚本将被调用,但无法在终止进程之前重置。

这个想法有什么漏洞吗?如果不是,PHP/JS中的实现会是什么样子?我认为它起作用的顺序是:

  1. 页面被用户击中。
  2. <?php exec('killer.py') ?>
  3. killer.py:
    1. 听20秒-如果没有回应..。
    2. os.system('pkill process')

​

  1. <?php while(true){sleep(15); exec('killer.py no_wait_dont');} ?>

如果你们有任何想法,我们会非常感激的!

梅森

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-02 22:05:51

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

只需编写一个javascript函数,它每10秒发布一次东西给ping.php (通过ajax)。当在用户会话中接收到最后一个ping时,这个ping.php将进行日志记录(例如在$_SESSION['last_ping']中)

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

票数 3
EN

Stack Overflow用户

发布于 2012-08-02 22:18:55

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

  • js发送请求
  • php/python在后台启动子进程并将pid返回给js
  • 给定pid的js pings php/python
  • php/python通过IPC向与pid对应的子进程发送信号,例如发送SIGUSR1
  • 如果子进程没有及时接收到信号,它就会死亡,即在子进程中有一个持续的自毁倒计时。

如果不能将自毁机制添加到子进程中,则需要一个监视进程,该进程将接收信号并杀死子进程。它不太可靠,因为您需要确保观察者进程正在运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11785720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档