如何使长时间运行的PHP脚本立即显示成功消息?

目标

我正在尝试创建一个PHP脚本,它将一个相当大的(6MB)PDF文件通过电子邮件发送给请求它的网站上的用户.用户将他们的电子邮件地址输入表单,提交表单,然后通过PHP Mailer实例将文件发送给他们.用户在提交表单时显示成功页面.

问题

通过POST方法提交数据后,有一个很长的暂停,服务器最终返回404.但是,几分钟后,PDF附件完全收到电子邮件.

排除/尝试解决方案

我将问题归结为PHP Mailer因为附件较大而花费太长时间发送电子邮件.服务器超时并转而返回404.同时,脚本最终完成处理,此后收到电子邮件.

如果我删除附件并只发送一封空白电子邮件,脚本会非常快速地加载并显示成功/确认页面.

我考虑过创建一个重定向,但是到处都找到了关于如何在PHP中实现重定向的解释,据说你应该杀死原始脚本(我不想这样做).

这个问题

如何让电子邮件脚本花时间运行,同时立即向用户显示成功消息,以免他们感到困惑?

最佳答案 这是消息队列的任务.存储将邮件发送到队列中所需的所有信息,并使用后台任务获取此信息并发送邮件.如果插入到消息队列成功,则向用户显示成功消息.

如果您无权访问后台脚本(例如共享主机),您仍然可以直接回复.只需使用ignore_user_abort(true)并发送正确的Content-Length标头.浏览器将信任该标头并显示响应,而您的脚本可以继续运行并发送邮件.

点赞