我正在尝试创建一个PHP脚本,该脚本将相当大的(6MB)PDF文件通过电子邮件发送给请求它的网站上的用户。用户将他们的电子邮件地址输入表单,提交表单,然后通过PHP Mailer实例将文件发送给他们。用户将在提交表单时显示成功页面。
通过POST方法提交数据后,会暂停一段时间,服务器最终会返回404.但是,几分钟后,PDF附件就会收到完全正常的电子邮件。
我将问题归因于PHP Mailer因为附件较大而花费太长时间发送电子邮件。服务器超时并转而返回404.同时,脚本最终完成处理,此后收到电子邮件。
如果我删除附件并发送空白电子邮件,则脚本会非常快速地加载并显示成功/确认页面。
我考虑过创建一个重定向,但是到处都找到了关于如何在PHP中实现重定向的解释,据说你应该删除原始脚本(我不想这样做)。
如何让电子邮件脚本花时间运行,同时立即向用户显示成功消息,以免他们感到困惑?
答案 0 :(得分:1)
这是消息队列的任务。存储将邮件发送到队列中所需的所有信息,并使用后台任务获取此信息并发送邮件。如果插入到消息队列成功,则向用户显示成功消息。
如果您无权访问后台脚本(例如共享托管),您仍然可以直接回复。只需使用ignore_user_abort(true)
并发送正确的Content-Length
标头即可。
答案 1 :(得分:1)
另一种解决方案:快速操作,而不是立即在电子邮件中附加大文件。给他们PDF文件的下载链接。因此内容变得太短。但没有依恋。
您可以努力创建唯一的网址,以便不同用户下载相同的PDF文件。
否则,正如所讨论的那样,电子邮件排队很好。
答案 2 :(得分:0)
不是立即通过电子邮件发送文件,而是将请求存储在数据库中,其中包含您发送所需的所有详细信息。然后你可以定期使用cronjob /预定任务(如果你愿意,可以每分钟)检查数据库是否有任何未完成的请求,并在后台发送电子邮件。
答案 3 :(得分:0)
由于未提供任何代码,您可以使用AJAX调用脚本并在任何地方显示成功消息。将调用该脚本,用户将收到消息,脚本完成后,用户将立即收到该电子邮件。
当然,成功消息不应该在AJAX处理程序中实现,否则消息也会被延迟。
答案 4 :(得分:0)