PHP 立即重定向并继续执行不发送数据


php redirect immediately and also continue execution which dont send data

我需要执行一堆耗时近 50 秒才能完成的函数。但是我想在执行几个函数本身后重定向到页面,并继续进一步执行。

以下函数在表单提交时执行,如process.php // it wont echo anything

// all function in serprate process page.
func1
func2
func3
// After above 3 function i need to php redirect to redirect now immediately example.com
func4
func5
func6

我尝试使用 php 标头,但它不会立即重定向。

header("Location:http://www.example.com");

如果我使用 exit();它将重定向但不处理功能 4、5 和 6。

我需要的是任何在前 3 个函数之后立即重定向并继续执行的方法。

在纸面上,你可以通过组合flush()和ignore_user_abort()来实现这一点:

ignore_user_abort(true);
do_stuff();
send_redirect();
flush();
do_more_stuff();

手册页:

  • http://php.net/manual/en/function.flush.php
  • http://php.net/manual/en/function.ignore-user-abort.php

请注意已知的警告:某些浏览器(特别是旧IE,可能还有新浏览器)希望在处理您发送的内容之前接收最少的字节数,因此您最终可能需要在html注释中加入一些长字符串才能使其按预期工作。

在实践中,更传统的方法是在某个表中注册一个 cron 作业任务,并让 cron.php 文件在一个完全独立(和独立)的请求中处理待处理的任务。

评论中还强调了一种不太传统的方法:按该顺序发出 shell 命令或其他内容 - 如果您这样做,请非常小心清理输入。


添加此内容以供参考(请参阅下面的评论):

<!-- IE bug fix: pad the page with enough characters such that it is greater than 512 bytes, even after gzip compression abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono
—>

引用:

  • http://www.clintharris.net/2009/ie-512-byte-error-pages-and-wordpress/
  • http://core.trac.wordpress.org/ticket/8942
  • http://core.trac.wordpress.org/ticket/11289

(实际上仅适用于重新遍历 http 错误后。

尝试将

process.php拆分为两个文件:process.phpprocess_more.php(即)。假设您在 unix 操作系统服务器下:

process.php代码:

// code to execute before redirect
func1();
func2();
func3();
// code to execute after redirect in background
// you can pass some parameters
$command = "php -f /path/to/process_more.php param1 param2"
exec($command . " > /dev/null &"); 
header('Location: http://dn.tld/');
exit();

查看更多内容以将参数与变量一起使用$argv并注意防止用户在参数中注入另一个命令

process_more.php代码:

func2();
func3();
func4();

并不是说您将无法访问$_GET$_POST变量。您需要在调用命令中传递所需的任何变量。