2012-01-20 23 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的東西。它不會使上傳速度更快,但它會向用戶顯示明確的上傳進度,並獲得不錯的體驗。