如何处理从Web表单运行的长时间运行的shell脚本

时间:2015-06-07 20:28:47

标签: php html

我正在使用Web界面进行基本数据输入以运行模拟。这些输入修改数据文件,该数据文件在一些需要很长时间(> 10分钟)的物理模拟中使用。它将生成模拟的图形和mp4视频。我对HTML / PHP缺乏经验,所以我不确定解决这个问题的最佳方法是什么。

我正想着以某种方式创建一个页面,该页面随着模拟中的每个步骤进行更新(尾部输出文件并以某种方式将其输出到页面作为进度的指示)。但我不知道如何处理用户关闭页面或会话是否关闭(工作仍在后台运行,只是没有访问权限。)

有任何想法/建议吗?

3 个答案:

答案 0 :(得分:0)

这听起来不像PHP的经典用例。 无论如何,你应该考虑一些选择:

  • 运行一个PHP脚本(网页),它启动一个线程并强制它保持活着(这是一个非常糟糕的主意)
  • 编写一个可以与shell一起运行的PHP后端(某些脚本)
    • 您需要在前端和后端之间分开
    • Memcached可能适合您的缓存
  • 在Python / C / Bash中编写可与前端通信的服务

答案 1 :(得分:0)

创建一个PHP页面,修改模拟参数并启动模拟(除非它已在运行)。每次调用此PHP页面时,都会显示模拟的最新状态(在请求时)。页面已经呈现后,使用AJAX定期轮询服务器以获取模拟的更新。

基本上,PHP页面永远不会挂起。它应该始终提供模拟的立即状态并完成。定期的AJAX轮询将为用户提供更新。这也意味着用户可以刷新页面而不会破坏任何内容。

答案 2 :(得分:0)

什么不该做:在典型的PHP文件中创建所有内容(可能包含所包含的文件)。您的用户将打开该页面,他们的Web浏览器将被冻结10分钟。更糟糕的是,许多浏览器有超时60秒;更糟糕的是,PHP有一个默认的30秒超时。

相反,使用某种异步处理。这是我推荐的策略:用PHP / JavaScript创建一个前端,用你选择的语言创建一个后端。

  • 前端将启动PHP exec()命令,该命令在shell中运行命令。格式如下:

    exec("command path/to/script &")
    

    &符号在后台运行命令。命令可以是PHP,Python,Java ......语言取决于你!

  • 您的后端程序会定期将其进度写入某种临时进度文件。

  • 您的前端网页会定期与AJAX沟通以取得进展。完成后,它将转到一个加载输出的新PHP页面。