我正在尝试为一些python脚本构建一个Web界面。问题是我必须使用PHP(而不是CGI),我执行的一些脚本需要相当长的时间才能完成:5-10分钟。 PHP是否可以与脚本通信并显示某种进度状态?这应该允许用户在任务运行时使用网页,并在此期间显示某些状态,或者只是在完成后显示消息。
目前使用exec()并在完成时我处理输出。服务器在Windows机器上运行,因此pcntl_fork将无法工作。
稍后编辑: 使用另一个PHP脚本使用ajax提供主页信息似乎不起作用,因为服务器杀死它(它达到最大执行时间,除非必要,我真的不想增加它)
我在考虑基于套接字的通信,但我不知道在我的情况下这有什么用处(可能会有一些提示?
谢谢
答案 0 :(得分:7)
您希望进程间通信。插座是第一个浮现在脑海中的东西;您需要为PHP中的连接(在同一台机器上)设置 listen 的套接字,并在Python中设置一个套接字以 connect 连接到侦听套接字发送它的状态。
从Python文档和this socket programming overview查看the Python socket
module's documentation (especially the examples at the end)。我确信PHP有类似的资源。
一旦您对要构建的内容有了更具体的了解并需要帮助,请随时在StackOverflow上询问新的问题(如果尚未回答)。
答案 1 :(得分:2)
我认为你必须使用元刷新,并且可能让python将状态写入文件,然后从中读取php。
您也可以使用AJAX使其更具动态性。
此外,可能不应该使用exec()......这会打开一个漏洞世界。
答案 2 :(得分:0)
不幸的是我的朋友,我相信你需要按照你的要求使用套接字。 :(我没有使用它们的经验,但This Python Tutorial on Sockets/Network Programming可以帮助您获得所需的Python套接字交互。(Beau Martinez的链接看起来很有希望。)
您还需要获得一些PHP套接字连接,以便它可以请求状态。
接下来,我的想法是你的Python脚本可能会在循环中运行。因此,我会在该循环的一部分开头放置“检查状态请求”。它会回复一个状态,而该脚本中的后续循环将以更高的状态回复...等等。
祝你好运!编辑:我认为Thomas Schultz的文件撰写建议可能是最容易实现的。唯一的缺点是等待文件打开 - 你需要确保你的PHP和Python脚本不会挂起或返回失败而不再尝试。
答案 3 :(得分:0)
您可以使用像Gearman这样的排队服务,PHP中的客户端和Python中的工作者,反之亦然。
有人在这里创建了一个示例设置。