PHP和Python之间的通信

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

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

随后编辑: 使用另一个PHP脚本通过ajax提供主页信息似乎行不通,因为服务器会杀死它(它达到了最大执行时间,除非必要,否则我不想增加它)

我考虑基于套接字的通信,但我不知道这在我的情况下如何有用(有什么提示吗?

谢谢

4个回答

8
你需要进行进程间通信。套接字是首选方案;你需要在PHP中设置一个套接字以监听连接(在同一台机器上),并在Python中设置一个套接字以连接到监听套接字,并将其状态发送给它。
请参考 Python 文档中的 这个套接字编程概览Python socket 模块文档(特别是最后的示例)。我相信 PHP 也有类似的资源。
一旦你有了更具体的构建想法并需要帮助,请随时在 StackOverflow 上提出一个新问题(如果还没有被回答)。

我将它与ajax / javascript轮询结合使用,以避免达到最大执行时间,现在它运行得非常好!谢谢 - H. Stefan

2
我认为你需要使用元标记刷新,也许让Python将状态写入文件,然后让PHP从文件中读取。你还可以使用AJAX使其更加动态。
此外,不应该使用exec(),因为这会打开漏洞的世界。

用户无法控制执行的脚本,因此我不认为exec会成为问题(替代方案将是proc_open)。 - H. Stefan
请在主帖中查看我的“后期编辑”有关Ajax的内容。我正在考虑基于套接字的通信,但我不知道如何在我的情况下使用它(可以给一些提示吗?)。 - H. Stefan
2
@stefan 安全性就是要尽可能地多疑。看看索尼的PSN发生了什么事情;他们假设用户永远无法篡改他们的PS3。 - Humphrey Bogart
@Beau Martinez 没错,但是这个页面只有内部可见性(无法在我们的网络之外访问)。即便如此,你说得很对。 - H. Stefan
看起来,我喜欢将数据写入文件的概念——这似乎比依赖套接字更容易。 - SoreThumb

1

0

很遗憾,我的朋友,我认为你需要使用套接字,就像你要求的那样。:( 我对它们的使用经验很少,但是这个Python套接字/网络编程教程可能会帮助你获得所需的Python套接字交互。(Beau Martinez的链接也很有前途。)

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

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

祝你好运!

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


关于文件,你必须亲自检查文件是否有更改(如果您所在的平台支持,则可以轮询以进行更改)。这对于(默认,非阻塞)套接字已为您处理:代码会等待直到有更改。 - Humphrey Bogart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接