【问题标题】:Trying to redirect a user before executing the beef of a script is not working在执行脚本之前尝试重定向用户不起作用
【发布时间】:2019-06-12 22:09:31
【问题描述】:

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

我试图在这里实现接受的答案How to cause a redirect to occur before php script finishes?

但我认为解决方案已经过时,因为它什么也没做

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

set_time_limit(0);
header ( 'Connection: close' );
ob_start ();
header ( 'Content-Length: 0' );
header("Location: www.google.com");
ob_end_flush ();
flush ();
ignore_user_abort(true);

预期结果:我的预期结果是用户单击提交按钮,他们被重定向到 google.com,同时脚本将继续在我的服务器上执行

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

【问题讨论】:

  • 您拥有什么网络服务器软件以及 PHP 如何与网络服务器软件(CGI、其他接口)交互也很重要
  • 我认为与仅在后台运行脚本并重定向 exec('php script.php >/dev/null &'); header("Location: www.google.com"); 相比,这是一种糟糕的方法
  • 您可以在发送请求后使用 Ajax 提交并在 JavaScript 中重定向。 Ajax 是异步的,因此在等待回复时不必停止
  • @Tim Morton 我愿意,但脚本大约有 1600 行我没有编写的未注释代码,而且我没有 2-3 天的时间来重写它以便可以通过 ajax 完成(相信我,我更愿意)
  • 这个概念相当简单——添加一个 onsubmit 监听器来拦截表单提交、发布和重定向。你不需要重写任何东西,只需添加一个观察者:$(function() { $('#my-form').on("submit",function(e) { e.preventDefault(); // do your ajax and resubmit

标签: php


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    您可以从here获得有关队列以及如何创建队列的更多详细信息

    【讨论】:

      【解决方案3】:
      1. 您在第二行关闭连接,关闭连接后,您的网络服务器将如何与客户端通信?删除第二行。或像这样更改订单。

        set_time_limit(0);
        ignore_user_abort(true);
        ob_start ();
        //header ( 'Connection: close' );  //You don't need this line as you are redirecting
        header ( 'Content-Length: 0' );
        header("Location: www.google.com");
        ob_end_flush ();
        flush ();
        \*Browser will redirect at this point *\    
        ignore_user_abort(true);
        set_time_limit(0);
        \*Your Long Running Script After this line*\
        
      2. 如果你是重定向到其他页面,你不需要关闭连接。

      【讨论】:

      • 这仍然不起作用它产生相同的结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      相关资源
      最近更新 更多