Yii框架异步请求

时间:2012-04-04 06:20:16

标签: php ajax asynchronous yii

我有ajax请求执行3个任务:

  • 保存模型(DB)
  • 发送电子邮件
  • 提供成功或失败的消息。

因为这项任务需要时间。用户可以等待最多20秒的响应(成功或失败的消息)。并且如果用户关闭浏览器,则其停止在用户当前进程的一个操作中。

这是糟糕的用户体验。

我希望用户将他的数据提交给我的控制器,之后他会得到“成功或失败的消息”。这个过程将完全在服务器端,它应该支持多个会话。

我该怎么做?

2 个答案:

答案 0 :(得分: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'=>'mail@domain.com', 'subject'=>'This is the subject'));

它的工作很棒,但它不是理想的解决方案。

答案 1 :(得分:1)

关于runactions扩展的问题是它只适用于未经身份验证的用户,您可以使用yii backjob extension,但这需要使用某种非阻塞会话存储,例如CHttpDbSession。 我仍在寻找正确的方法来做到这一点...... 我发现最好的选择之一是运行服务器后台工作:

/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 &")