2012-04-04 130 views
1

我有做3個任務Ajax請求:Yii框架異步請求

  • 保存模型(DB)
  • 發送電郵
  • 給成功或失敗的消息。

因爲這個任務需要太多時間。用戶可以等待最多20秒的響應(成功或失敗的消息)。如果用戶關閉瀏覽器,則停止其中一項操作,即爲用戶提供當前進程。

這是不好的用戶體驗。

我希望用戶將他的數據提交給我的控制器,之後他將獲得「成功或失敗的消息」。這個過程將完全在服務器端,它應該支持多會話。

我該怎麼做?

+1

http://www.php.net/manual/en/function.ignore -user-abort.php – hakre 2012-04-04 06:26:13

+0

我在這裏有點迷惑。如何停止一個過程?因爲一旦發送了用戶請求,前兩個步驟將在服務器上完成。第三步將在客戶端,這只是一個通知。基本上所有3個步驟將運行。唯一不同的是,如果用戶關閉瀏覽器,用戶可能看不到通知。或者我讀錯了? – itachi 2012-04-04 07:22:34

+0

基本上,您需要更改訂單,以便用戶獲得消息。因爲任務的其餘部分將會處理並從其他任務中獲取響應需要更長的時間,因此用戶需要。用戶不關心郵件發送是否成功,甚至保存到數據庫。 – Dar 2012-04-04 07:54:13

回答

1

@hakre你給的不是減少用戶等待響應的時間。

我發現這樣做的最好的解決辦法: runactions extension for yii

這是擴展讓你從控制器後臺操作運行。 有幾種使用方法。最好的一個我的情況是這樣的

public function actionTimeConsumingProcess() 
{ 
    if (ERunActions::runBackground()) 
    { 
     //do all the stuff that should work in background 
     mail->send() 
    } 
    else 
    { 
     //this code will be executed immediately 
     //echo 'Time-consuming process has been started' 
     //user->setFlash ...render ... redirect, 
    } 
    //User information 
    echo "Submit Success!" 
} 

而它的工作,但沒有Ajax請求,當我做Ajax請求它不是出於某種原因的工作。 所以我用:

      ERunActions::httpPOST($this->createAbsoluteUrl('Form/Submit'), array('to'=>'[email protected]', 'subject'=>'This is the subject')); 

及其工作很大,但它不是爲這個理想的解決方案。

+0

我怎麼能在ajax上調用mail-> send()請致電 – Kailas 2014-03-25 12:11:22

+0

將數據保存到我的數據庫後,這不起作用。任何解決方案 – Developer 2017-11-27 11:58:42

1

有關runactions擴展的問題是,它只能與未經身份驗證的用戶一起使用,您可以使用yii backjob extension,但這需要使用某種非阻塞會話存儲,如CHttpDbSession。 我現在還在找工作做的正確方法... 我找到的最好的選擇之一是運行一個服務器研究背景的工作:

/usr/bin/php -q longProcess.php > /dev/null 2>&1 & 

不過,我還需要知道如何通過控制器在CMD線的動作,讓警予實際使用它,像

/usr/bin/php -q yii-index.php controller action > /dev/null 2>&1 & 

更新:我發現了最好的辦法是使用警予控制檯應用程序並運行它作爲後臺作業。下面的鏈接幫助了很多:

Yii cron jobs

我現在使用此代碼,它是可以正常使用:

exec("nohup /protected/yiic mycommand /dev/null 2>&1 &")