【问题标题】:How to communicate with a python daemon from PHP scripts如何从 PHP 脚本与 python 守护进程通信
【发布时间】:2011-12-16 17:25:14
【问题描述】:

我正在为我的公司制作一个扫描服务器,它将用于从 nessus、nmap、nikto 等工具启动扫描。我已经用 PHP 编写了页面,但我需要控制后续的进程(使用 nohup 生成并使用 & 作为背景),因为一旦扫描完成,我需要执行各种操作(例如通过电子邮件发送它们,从 nessus 服务器下载报告等)。

我被建议在这里创建一个与 PHP 页面通信的 python 守护程序。我无休止地用谷歌搜索,但我找不到任何东西可以从初学者的角度解释通信背后的逻辑(编写守护程序将是我迄今为止*的项目)。例如,我知道 IPC 和 unix 域套接字,但不确定如何在我的情况下使用它们。因此,我正在寻求一些关于我应该做什么的建议或指示。

我在想我可以创建一个带有 while 循环的 python 脚本,该脚本不断检查进程是否已终止,当它终止时,执行适当的后进程终止操作。该脚本将被守护,因此它在后台运行,我会从 PHP 页面调用它,并将 PID 作为参数,例如,我可以使用 argparse 模块访问它。

我在逻辑上是否正确 - 还是有更好的解决方案?

任何帮助,或者只是谷歌的东西,非常感谢!谢谢

【问题讨论】:

    标签: php python ipc daemon


    【解决方案1】:

    我认为像gearman 这样的东西肯定会让实现这一点更容易。

    Gearman 是一个作业服务器,可让您启动作业、查询作业是否仍在运行并获取作业的输出(作为文本)。

    它支持 PHP 和 Python(以及其他)。

    (这个回答让我觉得自己像个推销员)。

    【讨论】:

      【解决方案2】:

      所以你的计划是:PHP 产生 nmap 和一个看门狗。 Watchdog 不断轮询 nmap 以完成运行,然后在完成后进行一些后期处理。

      稍微干净一点的是: PHP 产生了一个“进程管理器”(您也可以编写它)。这个进程管理器基本上是一个在子进程中执行 nmap 的程序,等待这个子进程完成(使用“等待”系统调用,例如在 C 中看起来像:http://linux.die.net/man/2/wait),然后进行后期处理。

      这也会更有效,因为“等待”可能比重复检查 PID 是否已终止更便宜。

      如果你比 C 更喜欢 python,python 也有子进程管理: http://docs.python.org/library/subprocess.html

      【讨论】:

      • 这听起来确实很有趣-但是,设计规范的一部分是有代码可以监视从 php 页面产生的进程数量-因此在 x 数量之后不允许再创建,直到有些完成后,帮助减轻服务器负载。从您所说的看来,每次都会产生一个新的流程管理器,那么上述可能吗?或者我需要一个流程管理器 ^^ - 谢谢!
      • “进程管理器”基本上大部分时间都在睡觉。因此,如果设计规范的目的纯粹是为了确保服务器不超载,则不应计算“流程管理器”实例。但是,工作处理器应该是。