如何解决无法在不冻结浏览器的情况下使用 HTTP post/get 请求启动独立的后台长任务
我已经做了任何可能的尝试。
上下文:
- 共享主机,无法访问外壳
- 禁用任何 kill 和 exec PHP 命令
目的
- 通过发布表单请求在后台启动一个漫长的过程
- 更新文件中的后台进程状态
- 可能定期从浏览器读取进度状态(不必要)
- 在同一个浏览器中继续使用用户会话在同一个网站登录页面中做其他事情
- 如果需要,通过发送特定命令终止进程。由于 PHP 终止函数不可用,接收请求的 PHPP 函数会在后台进程定期读取的文件上写入终止命令。如果检测到终止命令,后台进程将安全结束。
解决方案 1:分叉
- 声明工作的请求是通过 ajax 发布请求在私人登录会话中发送的
- 开始的 PHP 函数派生自身。父进程不会等待子进程结束,而是刷新 JSON 答案(“process_began”)并退出
- 孩子们在后台继续这个过程
逻辑有效,但是
- 浏览器会自己冻结,等待子进程结束,因为分叉过程没有改变任何东西。我发现这是因为 Apache 将子代视为来自浏览器的相同请求。
- 如果调用了killing 程序,它会通过管道等待子进程结束
- 打开不同的浏览器,例如第一个Chrome第二个IE,如果IE调用了查杀程序,则正常,后台进程结束。
解决方案 2:使用 PHP CURL 请求和非常短的超时 (1s) 调用执行长时间作业的第二个函数,以便调用函数不等待答案;调用函数和被调用函数都在相同的服务器和控制器
逻辑可行,但我遇到了与解决方案 1 相同的问题。浏览器冻结并等待长时间的工作完成。在此期间,私人登录会话的其他页面均不可用,并且 ajax 终止请求已通过管道传输。
如何获得启动长后台的请求,使浏览器不等待响应并且服务器接受来自同一用户和浏览器的另一个请求?我相信使用 Web 表单发送长文件以进行批量上传或长篇幅是一种常见的需求;对于这些情况,真的不存在解决方案吗?谢谢。
(我没有附上代码,因为在我看来更多的是与环境和 Web 服务器逻辑相关的概念性问题,而不是正确的代码,我没有错误;如果需要,我可以添加一些代码)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。