重定向到PHP中的另一个页面后如何继续运行ajax调用?
我的AJAX调用执行非常复杂的任务,它需要一个长期所以,是否有可能运行一个AJAX调用后页面重定向?
我在单击提交按钮时进行ajax调用,然后在该页面上重定向到另一个页面,然后我的ajax调用是“在后端继续运行”。
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<title></title>
</head>
<body>
<input type="text" name="altname" id="altname">
<button id="btnSubmit">Submit</button>
</body>
</html>
<script type="text/javascript">
$(document).ready(function(){
$(document).on('click','#btnSubmit',function(){
var altname = $("#altname").val();
$.ajax({
url:"http://localhost/z/backend-queue-job-php/queue_job.php",
type:"POST",
data:{altname:altname},
success:function(result)
{
alert(result.msg);
}
});
window.location.href = "http://localhost/z/backend-queue-job-php/thankyoupage.php";
});
});
</script>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在PHP中,重定向到另一个页面后直接继续运行原来的AJAX调用是不可能的,因为浏览器会跟随重定向到新的URL,从而终止与原页面的连接。但是,你可以通过以下几种策略来实现类似的需求:
异步任务队列:将长时间运行的任务放入后台任务队列中执行。当AJAX调用触发时,你的PHP脚本可以简单地将任务添加到队列(如使用RabbitMQ、Redis队列或阿里云的MQ服务),然后立即返回成功响应进行重定向。之后,你可以在服务器端单独处理这个队列中的任务,完成后可以通过邮件、数据库记录或者另一个AJAX轮询/长轮询的方式来通知前端任务已完成。
Web Workers(仅限于前端操作):如果任务是纯JavaScript且支持Web Workers,你可以在重定向前启动一个Web Worker来执行复杂的任务。但请注意,这不适用于需要服务器端处理的情况。
长轮询或Server-Sent Events (SSE):在新页面上设置一个长轮询或SSE连接,用来检查后台任务的状态。一旦任务完成,服务器可以通过这个连接向客户端推送消息。
Callback URL或Polling:在发起AJAX请求时,可以提供一个callback URL。当长时间运行的任务在服务器端完成时,服务器向该URL发送一个请求,告知任务已完成。前端页面可以在加载时检查特定状态或通过定期轮询来得知这一结果。
使用阿里云函数计算(FC)或Elastic Compute Service (ECS)实例:如果你的任务适合无服务器架构,可以考虑使用阿里云函数计算来处理这些长时间运行的任务。函数计算会在任务完成后根据配置触发后续动作,比如调用API来更新数据库或发送通知。
结合阿里云产品,推荐采用异步任务队列的方式,利用阿里云的消息队列服务来解耦前后端,确保即使用户已经导航到其他页面,后台任务也能持续执行并最终通知用户结果。