2 回答
TA贡献1862条经验 获得超6个赞
您可以使用 ignore_user_abort(true); 设置客户端断开连接是否应导致脚本中止。这将断开与您的当前连接,然后将响应发送到前端,但仍会执行其余代码。
ignore_user_abort(true);
ob_start();
echo "success";
$serverProtocole = filter_input(INPUT_SERVER, 'SERVER_PROTOCOL', FILTER_SANITIZE_STRING);
header($serverProtocole.' 200 OK');
header('Content-Encoding: none');
header('Content-Length: '.ob_get_length());
header('Connection: close');
ob_end_flush();
ob_flush();
flush();
最初对您的 API 使用后端验证,然后使用上面的代码发送响应,然后您可以编写代码给您的用户发送电子邮件,这样前端将获得响应并执行脚本,直到遇到返回或死亡;这种方法的问题是,如果发送电子邮件时出现错误,您无法向前端发送响应。
否则,您可以在代码中使用邮件队列稍后完成这项工作
TA贡献1859条经验 获得超6个赞
这取决于你想走多深。理想的方法是运行 RabbitMQ 或 Gearman 服务器并设置“发送邮件”作业供它们处理。提交作业非常快,并且允许脚本完成并将响应发送回用户,但当然这将涉及设置更多基础设施、编写/维护更多代码来处理作业和处理重试/错误状态。
可能问题最少的方法是运行将中继邮件的本地邮件服务器。传递应该非常快,会给出更好的“有效”响应(至少用户会知道邮件已传递到本地邮件服务器)并允许脚本继续。如果电子邮件失败,则本地邮件服务器会将其作为退回给管理员或“发件人”用户进行处理。
概述一种方式在这里将意味着发送响应第一个,然后处理邮件-这意味着它不可能报告故障给用户。不理想,但这取决于您的情况 - 也许管理员处理失败的消息并可以重新发送?
- 2 回答
- 0 关注
- 235 浏览
添加回答
举报