2012-04-04 13 views
1

は、私は3つのミッション行うAJAXリクエストがあります。のYiiフレームワークの非同期要求

  • 保存モデル(DB)
  • を成功または失敗したメッセージを与えるメール
  • を送信します。

このミッションは時間がかかりすぎるためです。ユーザーは応答(成功または失敗したメッセージ)のために最大20秒間待つことができます。ユーザーがブラウザを閉じると、そのユーザーの現在の処理のいずれかで停止します。

これは悪いユーザーエクスペリエンスです。

ユーザーが自分のデータを自分のコントローラーに送信し、その後に「成功または失敗したメッセージ」を取得します。プロセスは完全にサーバー側になり、マルチセッションをサポートする必要があります。

どうすればいいですか?

+1

http://www.php.net/manual/en/function.ignore -user-abort.php – hakre

+0

私はここで少し混乱しています。どのようにプロセスの1つで停止できますか?一度、ユーザーの要求が送信されるので、最初の2つの手順はサーバー上で行われます。3番目のステップはクライアント側にあり、それは通知です。基本的に3つのステップがすべて実行されます。違いは、ユーザーがブラウザを閉じると、通知が表示されないことがあります。それとも間違っているのですか? – itachi

+0

基本的には、何が起きてもユーザーがメッセージを受け取れるように、順序を変更する必要があります。任務の残りの部分が処理され、他の任務から応答するためには、ユーザーのニーズが長くかかります。メールの送信が成功したかどうか、またはdbに保存するかどうかはユーザーが気にしません。 – Dar

答えて

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

+0

これはデータベースにデータを保存した後に動作しません。どんな解決策ですか? – Developer

1

runactions拡張機能の問題点は、認証されていないユーザーのみが動作することです.Yii backjob extensionを使用することができますが、これにはCHttpDbSessionなどの非ブロッキングセッションストレージが必要です。私はまだ、私は最良の選択肢の一つは、サーバbackgroudのジョブを実行することです見つけ、これを行うための正しい方法... を探しています :

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

はしかし、私はまだ、コントローラを渡す方法を知っておく必要がありますし、 CMDラインでの行動とのYiiは実際にそれを使用することができ、

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

アップデートのようなもの:私は最善の方法を見つけたがYiiのコンソールアプリケーションを使用して、バックグラウンドジョブとして実行することです。下記のリンクはたくさん助け:

Yii cron jobs

私は今、このコードを使用し、それが完璧に働いている:

exec("nohup /protected/yiic mycommand /dev/null 2>&1 &") 
関連する問題