我有ajax请求,执行3项任务:
因为这次任务太费时了。用户可以等待最多20秒的响应(成功或失败的消息)。如果用户关闭浏览器,则在用户当前进程的一个操作中停止。
这是糟糕的用户体验。
我希望用户提交他的数据给我的控制器,然后他将得到“成功或失败的消息”。整个过程将完全在服务器端进行,并且它应该支持多个会话。
我怎么能这么做?
发布于 2012-04-05 12:43:12
@hakre您给出的内容不会减少用户等待响应的时间。
我找到了最好的解决方案:易的运行扩展
这是扩展,允许您从控制器后台操作运行。有几种方法可以使用它。对我的案子来说最好的是这个
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'));它的作用很大,但它并不是解决这一问题的理想方法。
发布于 2014-07-29 17:48:01
运行操作扩展的问题是,它只适用于未经身份验证的用户,您可以使用yii 回程扩展,但这需要使用某种非阻塞会话存储,例如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就业
我现在使用这段代码,它运行得很好:
exec("nohup /protected/yiic mycommand /dev/null 2>&1 &")https://stackoverflow.com/questions/10005877
复制相似问题