【问题标题】:Communication between PHP and PythonPHP和Python之间的通信
【发布时间】:2011-08-23 08:47:28
【问题描述】:

我正在尝试为一些 python 脚本构建一个 Web 界面。问题是我必须使用 PHP(而不是 CGI)并且我执行的一些脚本需要相当长的时间才能完成:5-10 分钟。 PHP 是否可以与脚本通信并显示某种进度状态?这应该允许用户在任务运行时使用网页,并在此期间显示一些状态,或者在完成时显示一条消息。

当前使用 exec() 并在完成后处理输出。服务器在 Windows 机器上运行,因此 pcntl_fork 将不起作用。

稍后编辑: 使用另一个 php 脚本使用 ajax 来提供主页信息似乎不起作用,因为服务器会杀死它(它达到了最大执行时间,除非必要,我真的不想增加它)

我正在考虑基于套接字的通信,但我不明白这对我的情况有何用处(也许有一些提示?

谢谢

【问题讨论】:

    标签: php python ajax ipc


    【解决方案1】:

    你想要进程间通信。套接字是首先想到的;您需要在 PHP 中为连接(在同一台机器上)设置一个套接字以 listen 并设置一个套接字以 connect 到 Python 中的侦听套接字和发送它的状态。

    查看 Python 文档中的 this socket programming overviewthe Python socket module's documentation (especially the examples at the end)。我确定 PHP 也有类似的资源。

    一旦您对要构建的内容有了更具体的了解并需要帮助,请随时在 StackOverflow 上提出问题(如果尚未回答)。

    【讨论】:

    • 我将它与 ajax/javascript 轮询结合起来以避免达到最大执行时间,而且效果很好!谢谢
    【解决方案2】:

    我认为你必须使用元刷新,也许让 python 将状态写入文件,然后让 php 从中读取。

    您也可以使用 AJAX 来使其更具动态性。

    另外,可能不应该使用 exec()...打开一个漏洞的世界。

    【讨论】:

    • 用户无法控制执行的脚本,所以我看不出 exec 会有什么问题(替代方案是 proc_open)。
    • 请在主帖中查看我的“稍后编辑”以了解 ajax。我正在考虑基于套接字的通信,但我不知道这对我的情况有何用处(可能有一些提示?)
    • @stefan Security 是关于尽可能多疑的。看看索尼在 PSN 上发生了什么;他们认为用户永远无法篡改他们的 PS3。
    • @Beau Martinez 是的,但此页面只有内部可见性(在我们的网络之外无法访问)。即便如此,你有一个有效的观点
    • 看这个,我喜欢写入文件的概念——这似乎比依赖套接字更容易。
    【解决方案3】:

    您可以使用像Gearman 这样的队列服务,客户端使用PHP,工作人员使用Python,反之亦然。

    有人在这里创建了一个示例设置。

    https://github.com/dbaltas/gearman-python-worker

    【讨论】:

      【解决方案4】:

      不幸的是,我的朋友,我相信您需要按照您的要求使用套接字。 :( 我与他们合作的经验很少,但This Python Tutorial on Sockets/Network Programming 可能会帮助您获得所需的 Python 套接字交互。(Beau Martinez 的链接似乎也很有希望。)

      您还需要获取一些 PHP 套接字连接,以便它可以请求状态。

      继续说下去,我的想法是您的 Python 脚本可能会循环运行。因此,我将“检查状态请求”检查放在该循环的一部分的开头。它会回复一个状态,而该脚本中稍后的循环会回复一个增加的状态..等等。

      祝你好运!

      编辑: 我认为 Thomas Schultz 的文件写入建议可能是最容易实现的。唯一的缺点是等待文件被打开——你需要确保你的 PHP 和 Python 脚本不会挂起或返回失败而不重试。

      【讨论】:

      • 关于文件,您必须您自己检查文件是否有更改(如果您在支持它的平台上,您可以poll 进行更改)。这是使用(默认,非阻塞)套接字为您处理的:代码等待直到发生更改。
      猜你喜欢
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2020-12-10
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多