2

私は3つのミッションを行うajaxリクエストを持っています:

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

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

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

ユーザーがデータをコントローラーに送信すると、「成功または失敗のメッセージ」が表示されます。また、プロセスは完全にサーバー側にあり、マルチセッションをサポートする必要があります。

どうやってやるの?

4

2 に答える 2

1

@hakre あなたが与えたものは、ユーザーが応答を待つ時間を短縮しませんでした。

これに対する最良の解決策を見つけました: yii の runactions 拡張機能

これは、コントローラーのバックグラウンド アクションから実行できる拡張機能です。使い方はいくつかあります。私の場合に最適なものはこれです

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'=>'mail@domain.com', 'subject'=>'This is the subject'));

そして、その仕事は素晴らしいですが、これは理想的な解決策ではありません.

于 2012-04-05T12:43:12.357 に答える
1

runactions 拡張に関する問題は、それが認証されていないユーザーに対してのみ機能することです。yii backjob 拡張を使用することもできますが、これには CHttpDbSession などの非ブロッキング セッション ストレージを使用する必要があります。私はまだこれを行う正しい方法を探しています...最良のオプションの1つは、サーバーバックグラウンドジョブを実行することです:

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

しかし、コマンドラインでコントローラーとアクションを渡し、yii が実際にそれを使用できるようにする方法を知る必要があります。

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

更新:最善の方法は、yii コンソール アプリケーションを使用してバックグラウンド ジョブとして実行することであることがわかりました。以下のリンクは大いに役立ちました:

Yii cron ジョブ

私は今このコードを使用していますが、完全に機能しています:

exec("nohup /protected/yiic mycommand /dev/null 2>&1 &")
于 2014-07-29T17:48:01.360 に答える