2015-07-01 53 views
0

我一直在使用Laravel 5的Web應用程序。它在本地主機(xampp)上運行在Windows 8.1 PC上。 4GB RAM,2,67GHz處理器,非常簡單。優化數據庫查詢 - 縮放大數據 - Laravel 5

我查詢大部分的時間表包含很多行(10.000給予或採取) - 這麼多,寫,做了路線:

return User::all(); 

運行此只返回一個白色的屏幕。 Chrome控制檯有時會列出500(內部服務器錯誤)。

顯示查詢前發出的回聲或打印,但之後沒有執行任何回聲或打印。查詢另一個模型(其表只有2行)會正確返回數據。

這導致我得出結論,我的服務器不能很好地擴展這個數據量。我試圖通過這樣做來解決這個問題。

User::all()->chunk(200, function($chunkOfTickets){ /*some code*/}); 

我希望將數據拆分成塊,以便在服務器上更容易。然而,這不起作用,因爲Eloquent首先獲取所有數據(因爲它無法處理而破壞),然後纔將其分成塊。

感謝您的閱讀。

編輯:只是測試了一遍又一遍,請求越來越大的數據量。該限制大約爲26000行(返回27000和內存不足錯誤)。

正如評論中所述,php日誌聲明瞭這一點。顯然,我要求這麼多的內存就Laravel墜毀前可能會顯示錯誤消息

[01-Jul-2015 17:27:51 UTC] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8376445 bytes) in C:\xampp\htdocs\gamescaffold\vendor\laravel\framework\src\Illuminate\Support\Collection.php on line 791 

額外的編輯

有沒有一種方法,我可以按塊劃分從DB的回答嗎?像:

User::chunk(200)->all(); /*which obviously does not work*/ 

如果我寫的數據庫直接通過phpmyadmin它返回在0.0045秒37035行看似複雜的查詢。 (我懷疑這裏有一些通過xampp或者其他的東西進行優化)

+0

當您收到500內部服務器錯誤時,php錯誤日誌會顯示什麼內容?還有10K行不是「那個」,也不是那個「大」的數據 –

+0

感謝我指出了php錯誤日誌,我忘記了那些(我只是檢查了Laravel自己的日誌是空的)。這些條目說''[01-Jul-2015 14:49:54 UTC] PHP致命錯誤:允許的內存大小134217728字節用盡(試圖分配39個字節)在C:\ xampp \ htdocs \ gamescaffold \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connection.php在第296行' – Thaenor

+0

那裏你有它,10K記錄佔用了128MB的php進程允許的內存,這取決於你的業務邏輯增加這個或者優化你獲取數據,你真的需要抓住所有的10K並顯示它們嗎? –

回答

0

注意:我發佈這個作爲答案,因爲它涉及到一些代碼。我想我在原始問題中完全錯過了你的觀點,因爲我試圖將整個結果集返回給客戶端。如果我還遺漏了一些東西,請留下評論,我會刪除這個答案。

So I want to take a set of objects, do stuff with them and save them back to the DB

這很容易!

$chunkSize = 100; // or whatever your memory allows 
$totalUsers = User::count(); 

$chunks = floor($totalUsers/$chunkSize); 

for ($chunk = 0; $chunk <= $chunks; $chunk++) { 

    $offset = $chunk * $chunkSize; 

    $users = User::skip($offset)->take($chunkSize)->get(); 

    foreach($users as $user) 
    { 
     // do something 

     $user->save(); 
    } 
} 

如果時間過長,你可能會得到一個超時,如果你觸發來自HTTP這個循環,所以你應該從控制檯運行它。

+0

我一直在檢查錯誤日誌,我發現這個奇怪的'PHP致命錯誤:允許的內存大小134217728字節用盡(試圖分配43字節)' - 這很奇怪,因爲php在php.ini內存限制爲1GB時分配這麼少量的數據(43字節)。增加內存後,什麼也沒有發生,現在我甚至沒有內存錯誤在PHP日誌 – Thaenor

+0

@Thaenor你的意思是錯誤發生在運行上述代碼?因爲這隻需要大量記錄需要的大小(+一些開銷),我認爲這對於100條記錄來說不是128MB。看起來你在其他地方有內存泄漏。 – Quasdunk

+0

另一個問題,我忘了問之前。我如何從控制檯觸發此操作?我目前有它配置爲一個路線....一個祕密路線(但我還沒有編碼的安全部分哈哈) ** PS:**對不起,我沒有說清楚,內存不足錯誤提到第一個答案報告給未優化的代碼。你張貼的那個創造奇蹟。非常感謝! – Thaenor

1
 DB::table("table") 
      ->select('column1', 'column2') 
      ->orderBy('column2', 'asc') 
      ->chunk(70000, function($users) { 
      foreach ($users as $row) { 
       // To do with data 
      } 
     } 
+1

我已經很久沒有忘記我是如何解決這個問題的。我認爲這與我所做的略有相似 – Thaenor