2014-09-23 71 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