在PHP中关闭连接但继续执行脚本

Kri*_*ves 4 php buffering

任何人都知道如何关闭连接(除了flush()?),但之后继续执行一些代码.

我不希望客户端看到页面完成后可能发生的漫长过程.

Jho*_*ong 9

您可能希望查看pcntl_fork()- 它允许您分叉当前脚本并在单独的线程中运行它.

我在用户上传文件然后脚本对其执行各种操作的项目中使用它,包括与第三方服务器通信,这可能需要很长时间.在初始上载之后,脚本分叉并向用户显示下一页,并且父节点将自行终止.然后孩子继续执行,并使用AJAX通过返回的页面查询其状态.它使应用程序响应更快,并且用户在执行时获得有关状态的反馈.

此链接有更多关于如何使用它的信息:

如果您无法使用pcntl_fork,您可以随时回退到快速返回页面,从而触发AJAX请求以从队列中执行更多项目.


mvds提醒以下内容(可以应用于特定的服务器配置):不要fork使用整个apache webserver,而是启动一个单独的进程.让这个过程分叉一个生活的孩子.寻找proc_open你的php脚本和进程之间的完整fd交互.


nat*_*han 5

我不希望客户端看到页面完成后可能发生的漫长过程.

遗憾的是,在漫长的过程完成之后页面才会完成 - 因此你要求的是不可能的(以你推断的方式实现)我害怕.

这里的关键是,Jhong的回答和animusen的评论反过来指出,我们用HTTP做网络开发人员的重点是尽快回复请求/结束 - 就是这样,所以如果你'做其他任何事情,然后它指出一些设计决定可能会好一点:)

通常,您在返回"页面"之后执行您正在执行的其他任务并将其移交给其他某个进程,这通常意味着将任务放在作业队列中并让cli守护程序或cron作业将其拾取并执行操作需要.

确切的解决方案特定于您正在做的事情,以及对不同(一组)问题的答案; 但对于这个,它归结为:不,你不能关闭连接,并建议你看看重构该脚本/页面的长时间运行过程.