背景:
现在,在我们公司,我们有一个基于 PHP 的应用程序来自动化我们的报告构建。它是这样工作的:
- 带有表单的网页会生成一个带有一些配置的 ini 文件,这些配置保存在本地
- PHP CLI 脚本接受在步骤 1 中生成的 ini 文件,并基于它创建一个目录,其中包含从 Internet 获取数据的文档。(需要 5 到 10 分钟才能完成)
- 另一个 Web 表单探索文件夹的内容,进行一些验证并将目录的内容显示为预览。
在这些步骤之间,需要用户输入,有时用户需要中断脚本 2 以更正一些 ini 值。
问题:
我们希望在网络浏览器中运行 cli 脚本,以便在用户单击“构建”按钮后,生成 ini 文件(或数组)并自动传递给第二个脚本。但想法是让该脚本独立运行(模拟另一个“线程”),详细说明它在此过程中所做的一切,以便让用户在需要时中断。类似于在命令行中运行脚本,其中每个步骤都是详细的。
我们虽然使用 AJAX,但它会等待服务器完成其响应,然后再在 Web 浏览器中打印任何内容。iFrame 也不起作用,因为我们无法使用 javascript 操作它的 src 属性和内容。
那么,我们如何“模拟”命令 shell 输出呢?任何正确方向的提示将不胜感激。
注意:该脚本将始终在“localhost”中使用,无需远程访问!
解决方案
根据以下建议,我最终做了一些更简单的事情:
- 将表单 ($_POST) 的内容转储到会话变量 $_SESSION['FORM']。
- 创建了一个 $_SESSION[form-complete] 标志,当用户单击“构建”按钮时该标志将设置为 true。
- 如果 $_SESSION[form-complete] 为真,服务器将显示一个指向“CLI SCRIPT”的 iframe,其参数是先前转储的会话变量。
- CLI 脚本也有
ob_implicit_flush(true); ob_end_flush();
这样的输出不会被缓存。 - 在脚本结束时 $_SESSION 变量是干净的并且会话被破坏