2012-08-23 23 views
1

也許我錯過了一些簡單的東西......或者我剛剛在這上面編碼了這麼久,我看不到過去我的問題,但是使用CakePHP(1.3)並做一個選擇(MySQL)應該能夠返回結果,即使有,例如,2000條記錄......對不對?在CakePHP和MySQL中返回很多行

$options = array(
    'conditions' => array(
     'Lead.campaign_id' => $campaign['Campaign']['id'] 
    ), 
    'recursive' => -1, 
    'order' => 'Lead.goal DESC', 
    'contain' => false, 
); 

$leads = $this->Lead->find('all',$options); 

然而,這個查詢給我一個死亡白屏(與define('LOG_ERROR', 2);設置)。

如果我在$options數組中添加一個'limit' => 300,(或類似的數字,但不必精確地爲300),那麼它將取得結果,因此我知道查詢本身不是問題。

此外,我試圖通過使用$options數組中的'fields'參數來限制返回的列......甚至告訴它只返回1個字段,但這也不起作用。

我也通過

$log = $this->Lead->getDataSource()->getLog(false, false); 
debug($log); 

當然呼應的是,它使用的SQL語句,我不得不把'limit'在爲實現這一目標顯示(否則我剛剛得到死亡的白色屏幕) 。然後,我將這個查詢(沒有限制)複製/粘貼到phpMyAdmin中,並且它返回記錄就好了(即使'show me 1,000 rows'也是如此)。這樣做導致我相信系統可以處理查詢&輸出,但也許我做了一個假設,我不應該。

我試圖獲取所有行而不分頁記錄的原因是因爲我需要將它們輸出到一個csv文件供用戶下載(這部分已經在工作... 查詢工作正常)。

有人向我建議說,這可能是一個超時問題,我應該提出這個問題,但這對我來說似乎是一個破解,必須有更好的解決方案。

由於我正在下載一個csv文件,也許有一種方法可以將查詢流式傳輸到一個文件,然後下載?或者甚至有更好的解決方案?

+0

打開調試開關,它會讓您知道內存和超時錯誤。這很可能是您的查詢需要優化(在您的查詢中使用'EXPLAIN'),但通過2K行進行排序可能會很昂貴。 – jeremyharris

+0

我沒有在cakephp查詢的上下文中使用'explain',但是當我向'$ options'添加'limit'時,我看到了確切的'select'輸出。你說得對,2k行的處理很多,但我認爲它確實不會那麼糟糕。正如我剛纔在下面的評論中指出的,也許我需要弄清楚如何運行後臺進程來將記錄寫入文件呢?我以前沒有這樣做過。 –

回答

2

您可能內存不足(檢查您的Web服務器錯誤日誌) - Cake會將所有2000行加載到數組中,這可能會超出您的腳本內存限制。

你可以提高你的腳本的內存限制,但還有其他選擇:

你真的需要接回所有2000行?向用戶顯示那麼多的數據對用戶來說是不可理解的。分頁在這裏會更好嗎?

如果您打算根據所有數據進行計算,也許您可​​以重新編寫查詢以在查詢中執行計算?

如果您必須使用PHP來處理數據,請以塊(例如,一次記錄100條記錄)的方式取回數據。如果過程可能需要很長時間,您可能需要將腳本設置爲較高值...

+0

我確實需要獲取所有行,因爲這是下載所有記錄的csv文件。因此,在這種情況下分頁不起作用。也許我需要通過後臺進程將記錄寫入文件。我以前沒有這樣做過。 –

+0

在這種情況下,我會以100個左右的組爲單位取回記錄,並以塊的形式將它們噴射到csv中 – RichardAtHome