【发布时间】:2014-10-09 03:34:27
【问题描述】:
您好,我正在尝试在后台执行 LONG RUNNING 请求(操作)。
function actionRequest($id){
//execute very long process here in background but continue redirect
Yii::app()->user->setFlash('success', "Currently processing your request you may check it from time to time.");
$this->redirect(array('index', 'id'=>$id));
}
我想要实现的是不让用户等待处理请求,因为它通常需要 5-10 分钟,并且请求通常会进入 超时,即使我将超时设置得更长,也要等待 5-10 分钟。不是很好的用户体验。
所以我想立即返回页面通知用户他/她的请求正在处理中,而他仍然可以浏览,并在应用程序中做其他事情,然后他/她可以返回页面查看他/她的请求是否已处理。
我查看了 Yii 扩展 backjob,它可以工作,重定向会立即执行(不知何故是后台请求),但是在做其他事情时,比如在网站中导航,它不会加载,而且看起来请求仍然存在,并且在请求完成之前我无法继续使用该应用程序。
一个类似的扩展 runactions 承诺同样的事情,但我什至无法让它工作,它说它“触及一个 url”,就像火灾和忘记工作但不起作用。
我也尝试过像Gearman、RabbitMQ 这样的消息队列服务,但它的技术含量非常高,我什至无法在我的 Windows 机器上安装 Gearman,所以“农场”服务无法正常工作我。后台处理的一些答案包括 CRON 和 AJAX,但这听起来不太好,还有很多问题。
是否有任何其他解决方法来进行异步后台处理?我真的为此努力过,而且我真的不是在寻找高级/复杂的解决方案,例如“将工作外包给几台机器”之类的。非常感谢!
【问题讨论】:
标签: php asynchronous yii request background-process