2013-11-25 86 views
0

我從來沒有這樣做過,所以我需要一些輸入。cakephp/php在後臺運行函數

代碼(一般):

$cofig = Configure::read('config'); 
    if ($config['stuff'] == 1){ 
     $this->Session->setFlash('it is already done this month'); 
     $this->redirect('/to/some/where'); 
    } 
    elseif ($config['stuff'] == 2){ 
     $this->Session->setFlash('it is already running'); 
     $this->redirect('/to/some/where'); 
    } 
    else { 
     SomeComponent::SomeFunction(); //this I need to launch in background while user continues further 
     $this->Session->setFlash('you have launched it'); 
     $this->redirect('/to/some/where'); 
    } 

「SomeComponent」 包含多種功能。我需要在用戶繼續下去的同時啓動特定功能「SomeFunction()」。
函數「SomeComponent :: SomeFunction()」生成一堆pdf,與數據庫交互並使用CakePHP特定的方法來處理所有這些操作。用戶通過數據庫接收輸出,所以我不需要從函數本身檢索它。
所以我不清楚哪種方法可以做到這一點,最好使用哪些方法,哪些方法可能是每個方法的缺點(特別是安全問題)。

我希望我以一種可以理解的方式解釋所有事情。如果你已經閱讀了這一點 - 謝謝。

回答

0

那個過程「SomeComponent :: SomeFunction()」花費的時間太長了嗎?如果答案是肯定的,那麼我會在a shell中包裝這個函數,如果你想把它提升到下一個級別,我會使用Observer來分派這個後臺進程。

Here is CakePHP中事件處理的介紹。

+0

我回到了這個項目,並用CakeEvent創建了Observer模式。一切都可以正常工作 - 用戶仍然需要等到它完成(不作爲單獨進程調度)。我不會說這需要很長時間,但用戶可以通過刷新,備份或終端用戶正在使用的任何魔法來打斷它。 – uldo