我需要执行一堆耗时近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个函数之后立即重定向的任何方法并继续执行。
答案 0 :(得分:3)
在纸面上,您可以通过组合flush()和ignore_user_abort():
来实现这一目标ignore_user_abort(true);
do_stuff();
send_redirect();
flush();
do_more_stuff();
手册页:
注意已知的警告:某些浏览器(特别是旧的IE,可能还有新的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错误,重新审阅后。)
答案 1 :(得分:2)
尝试将process.php
分成两个文件:process.php
和process_more.php
(即)。假设你在unix os服务器下:
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
个变量。您需要在call命令中传递所需的任何变量。