2014-09-23 48 views
0

我使用PHP(Yii框架)和Postgresql为数据库。基本上是一个wappstack。我刚刚提到他们,如果他们是这个问题的关注。PHP:在后台执行sql查询

不管怎样,我想要做到的,是我有一个提交动作:

public function actionSubmitData($id){ 


    //Execute Sql queries here 

$this->render('view',array(
       //some data 
      )); 
} 

的问题是,我会处理大量数据的;大约50,000个记录将在每个表中大约10列的4个表中处理,这相当大。用例是用户提交,然后sql语句在后台执行,但视图'view'应该已经被渲染,而不需要用户等待记录被处理。他/她可以在处理完记录后再进行检查。

一个正常的请求会先执行sql语句,然后渲染视图。问题在于页面大约需要3-5分钟。该页面从不加载;并且记录的创建没有完成,只有在请求密集时出现白页。

换句话说,我该如何在后台执行sql查询?在处理请求时,让用户仍然可以浏览应用程序?某处在后台,正在处理记录?这个问题的解决方法是什么?谢谢!

+0

保存,运行查询,并安排在后台执行该工作所需的信息。 – GolezTrol 2014-09-23 07:13:08

+1

尝试使用Yii框架的队列,这将是解决您的问题的最佳解决方案。 – justrohu 2014-09-23 07:13:47

+0

@GolezTrol,你能提供一个更具体的解释吗?概念验证/示例代码会很棒! – muffin 2014-09-23 07:19:02

回答

2

我建议将您的查询(作业)推送到某些邮件系统,如RabbitMQGearman。它会让你的工作平行进行。你甚至可以轻松扩展你的工作。

+0

是的,你需要一个任务队列。 – 2014-09-23 11:37:08

+0

@Pawka如果没关系,你可以给我一个首发吗?gearman是特别有趣的,但我不知道从哪里开始..一个伪代码/概念验证真的会有所帮助谢谢 – muffin 2014-09-30 02:50:16

+0

@muffin我发现有几个Gearman擅长Yii。这是其中之一:http://www.yiiframework.com/extension/gearman/您也可以在德国网站上找到多个示例:http://gearman.org/examples/简单的实现将创建控制台应用程序作为工作人员并定期运行它。在用户提交数据后,前端(网站)将您的任务推送到Gearman服务器。 – Pawka 2014-09-30 10:02:15

1

它必须使用Cron作业完成。

  1. 用户提交数据。
  2. 系统将所有数据写入某个临时文件供以后使用。
  3. 用户被重定向到查看页面以继续浏览。
  4. Cron Job进程查找新文件,将其标记为in process并对其进行处理。
  5. Cron作业处理后删除文件。

由于Cron作业在CLI中运行,您不会得到脚本超时。

+0

我不认为这会是很好的解决方案。你肯定会面临更多的问题。例如你的“一些临时文件”上的死锁......还有多久运行一次cron?已经创建了许多工具来处理这种情况。检查排队/消息系统。 – Pawka 2014-09-23 07:31:03