2012-01-20 25 views
2

我有这个在我的控制器:如何在redirect()之后让函数作为后台进程运行?

function foo() { 
    // my code 
    redirect(site_url('competitor/main'), 'refresh'); 
    $this->foo2(); 
} 

function foo2() { 
    // upload a file 
} 

如何保持foo2()使用redirect()方法之后运行?

我想调用foo2()之后redirect()的原因是因为我想节省上传时间。当用户在site_url('competitor/main')上传文件时,它会转到foo()函数,然后立即重定向回到competitor/main页面,foo2()将在后台运行。

回答

1

Codeigniter的redirect()函数exit在发送位置标题之后。所以,在重定向之前调用该函数。

$this->foo2(); 
redirect('competitor/main', 'refresh'); 

注:无需site_url()这里,如果你使用相对URL重定向功能将添加它。

我不知道什么foo2()做,但是这看起来有点前途未卜......

如果由于某种原因,你不能做到这一点,然后发送与本地PHP头。

header("Refresh:0;url=".site_url('competitor/main')); 
$this->foo2(); 
exit; 

site_url('competitor/main')用户上传文件时,它会去foo()功能然后重定向立刻回竞争者/主页,foo2()将在后台进程中运行。

这可能不是处理上传的方式,因为您将无法处理错误。有一对夫妇的其他方面,我可以建议:

  • 上传到另一个网址,工艺文件,然后重定向到您所选择的页面(包含状态消息,如果你愿意的话)
  • 让你的上传表单发布到,这将使页面保持当前状态。
  • 高级:使用JavaScript上传带有XMLHttpRequest/AJAX的文件。对于this,有numberscriptsavailable
+0

我不认为这是真的。我试过这个地方foo(){sleep(30); }它绝对阻止页面加载。 – Ben

+0

@Ben这是预期的,但如果你先调用'redirect()',那么'foo()'根本就不会运行。 –

+0

这是真的,但如果你把它放在它不在后台运行 - 因此不解决问题。看到我的建议如下。 – Ben

0

无法保持上载正在运行并将同一个窗口重定向到另一个位置。 @Wesley Murch的示例将立即开始刷新,但是只有在上传完成后才会完全加载页面,而不会在用户端保存任何时间。

您可以使用shell_exec在后台运行php,但不能上传。如果你想让它在后台继续,建议使用Javascript为上传创建一个弹出窗口。

否则试试类似Uploadify的东西。它不会使上传速度更快,但它会向用户显示明确的上传进度,并获得不错的体验。