我有ajax请求执行3个任务:
因为这项任务需要时间。用户可以等待最多20秒的响应(成功或失败的消息)。并且如果用户关闭浏览器,则其停止在用户当前进程的一个操作中。
这是糟糕的用户体验。
我希望用户将他的数据提交给我的控制器,之后他会得到“成功或失败的消息”。这个过程将完全在服务器端,它应该支持多个会话。
我该怎么做?
答案 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控制台应用程序并将其作为后台作业运行。以下链接帮助很多:
我现在使用此代码并且它运行良好:
exec("nohup /protected/yiic mycommand /dev/null 2>&1 &")