Php 在执行脚本前尝试重定向用户无效

Php 在执行脚本前尝试重定向用户无效,php,Php,在用户提交表单之后,我有一个长时间运行的脚本,我试图在实际脚本开始执行之前重定向它们 我试图在这里实现公认的答案 但我认为这个解决方案已经过时了,因为它什么都不起作用 以下是提交表单后脚本顶部的代码 设置时间限制(0); 标题(‘连接:关闭’); ob_start(); 标题('内容长度:0'); 标题(“位置:www.google.com”); ob_end_flush(); 同花顺(); 忽略用户中止(true); 预期结果:我的预期结果是用户单击提交按钮,他们被重定向到google.co

在用户提交表单之后,我有一个长时间运行的脚本,我试图在实际脚本开始执行之前重定向它们

我试图在这里实现公认的答案

但我认为这个解决方案已经过时了,因为它什么都不起作用

以下是提交表单后脚本顶部的代码

设置时间限制(0);
标题(‘连接:关闭’);
ob_start();
标题('内容长度:0');
标题(“位置:www.google.com”);
ob_end_flush();
同花顺();
忽略用户中止(true);
预期结果:我的预期结果是用户单击提交按钮,他们被重定向到google.com,同时脚本将继续在我的服务器上执行

实际结果:实际发生的是用户只是坐在页面上,直到脚本完成执行

  • 您正在第二线关闭连接,关闭连接后,您的Web服务器将如何与客户端通信???拆下第二行。或者像这样更改订单

    设置时间限制(0);
    忽略用户中止(true);
    ob_start();
    //标题(‘连接:关闭’)//你不需要这条线,因为你正在重定向
    标题('内容长度:0');
    标题(“位置:www.google.com”);
    ob_end_flush();
    同花顺();
    \*浏览器将在此点重定向*\
    忽略用户中止(true);
    设置时间限制(0);
    \*这一行之后的长时间运行脚本*\
    
  • 如果您正在重定向到其他页面,则无需关闭连接


  • 最安全的方法是从脚本中使用php启动外部应用程序(可能是借助php可执行文件的另一个php脚本)。您可以使用
    exec($cmd.>/dev/null&')用于后台执行


    发送重定向后,连接可能会关闭。web服务器可能会终止正在执行的PHP脚本,例如nginx不支持“后台”命令

    最简单的方法是ajax调用,但正如您所提到的,这不起作用。我建议你排队。 您可以在数据库中创建一个表,并在用户提交表单时向该表添加条目。并根据需要重定向用户。这不会花很长时间

    现在创建一个cron作业,按照您喜欢的频率读取该表,并使用该表中的数据执行所需的脚本。脚本完成后,从表中删除条目


    您可以了解更多关于队列的详细信息,以及如何从中创建队列。您拥有什么web服务器软件以及PHP如何与web服务器软件(CGI,一些其他接口)交互也很重要。我认为与仅在后台运行脚本并重定向
    exec相比,这是一种糟糕的方法('php script.php>/dev/null&');标题(“位置:www.google.com”);
    您可以在发送请求后使用Ajax提交并在JavaScript中重定向。Ajax是异步的,因此它不必在等待请求时停止reply@TimMorton我会的,但脚本大约有1600行未注释的代码,我没有写,我没有2-3天的时间重写它,这样就可以通过ajax完成(相信我,我更愿意)这个概念相当简单——添加一个onsubmit侦听器来拦截表单提交、执行post和重定向。您不必重写任何内容,只需添加一个观察者:
    $(function(){$('#my form')。on(“submit”,function(e){e.preventDefault();//执行ajax并重新提交
    这仍然不起作用,因为它会产生相同的结果