2012-10-19 61 views
3

我正在處理的應用程序有一個小問題。該應用程序用作開發人員工具將表中的數據從MySQL服務器轉儲到開發人員使用Unix curl命令抓取的JSON文件。到目前爲止,我們使用的數據庫是相對較小的表(2GB或更少),但是最近我們已經進入另一個使用完全填充表(40GB +)和簡單的PHP腳本中斷的測試階段。這裏是我的腳本:使用PHP將大型數據庫轉儲到JSON中

[<?php 

$database = $_GET['db']; 

ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 

# Connect 
mysql_connect('localhost', 'root', 'root') or die('Could not connect: ' . mysql_error()); 

# Choose a database 
mysql_select_db('user_recording') or die('Could not select database'); 

# Perform database query 
$query = "SELECT * from `".$database."`"; 
$result = mysql_query($query) or die('Query failed: ' . mysql_error()); 

while ($row = mysql_fetch_object($result)) { 
    echo json_encode($row); 
    echo ","; 
} 

?>] 

我給你的問題是,我能做些什麼,使這個腳本更好的有關處理更大的數據庫轉儲。

+0

腳本是否只是超時?如果是這樣,可以查看您的默認腳本時間限制(php.ini中的max_execution_time),或者僅使用'set_time_limit(0)'進行測試。 – sgroves

+0

如果您通過Webbrowser調用PHP腳本,則會在30秒後超時。這是它破裂的原因嗎?如果是這樣,通過控制檯調用它。但是你爲什麼不調用[mysqldump](http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html)命令? – PKeidel

+0

它不會解決你的問題,但我建議將'$ database'重命名爲'$ table'(它會更合理)。 – Jocelyn

回答

3

這是我覺得現在的問題是:

您使用mysql_query。 mysql_query在內存中緩衝數據,然後mysql_fetch_object只是從內存中獲取數據。對於非常大的表格,你只是沒有足夠的內存(很可能你將所有40G的行都放入該單個調用中)。

改爲使用mysql_unbuffered_query。關於MySQL performance blog的更多信息您可以在這裏找到其他一些可能的原因。

+0

簡單而有效的就是我正在尋找的東西。這加快了速度。謝謝。 –

0

您可能會遇到MySQL緩衝的問題。但是,您可能還有其他問題。如果您的腳本超時,請嘗試使用set_time_limit(0)禁用超時。這是一個簡單的修復,所以如果這不起作用,你也可以嘗試:

  1. 嘗試將數據庫轉儲離線,然後通過腳本或直接http轉移它。您可能會嘗試使第一個PHP腳本調用一個shell腳本,該腳本調用一個將數據庫轉儲爲文本的PHP-CLI腳本。然後,只需通過HTTP將數據庫拉出 即可。
  2. 嘗試讓腳本轉儲數據庫的一部分(從0行到 N,N + 1到2N等)。
  3. 你在你的http連接上使用壓縮嗎?如果您的延遲是傳輸時間(不是腳本 處理時間),那麼通過壓縮加速傳輸可能會有所幫助。 如果是數據傳輸,JSON可能不是傳輸數據的最佳方式。也許是。我不知道。這個問題可以幫助你:Preferred method to store PHP arrays (json_encode vs serialize)

此外,對於選項1和3,你可以嘗試在看這個問題:

What is the best way to handle this: large download via PHP + slow connection from client = script timeout before file is completely downloaded

0

我會說只是讓MySQL的爲你做,不是PHP:

SELECT 
CONCAT("[", 
     GROUP_CONCAT(
      CONCAT("{field_a:'",field_a,"'"), 
      CONCAT(",field_b:'",field_b),"'}") 
    ) 
,"]") 
AS json FROM table; 

它應該產生這樣的:

[ 
    {field_a:'aaa',field_b:'bbb'}, 
    {field_a:'AAA',field_b:'BBB'} 
] 
相關問題