2013-06-26 40 views
1

使用PHP/Joomla,我試圖導出數據庫備份到CSV/SQL文件下載。一些表格有大量的記錄。當我開始導出它提供了以下錯誤: 致命錯誤:最長30秒的執行時間超過使用PHP/Joomla編程導出MySql數據庫爲CSV

注:我不想用「的max_execution_time」或「set_time_limit()函數」或任何PHP。 ini設置。因爲我將在不同的客戶端服務器上使用此腳本&我不會告訴每個客戶端更改設置。 我需要PHP/Joomla腳本,而不是任何擴展。

請幫幫我。

+0

您是否嘗試將每個表導出到它自己的單獨文件? – iTom

+0

是的。我試過了。有些正在導出,但在某些表格中會導致執行錯誤。 – Joomladev

+0

你是SOL。如果任何這些表格需要超過30秒的時間來處理,則會發生超時;甚至可以通過表格來破壞數據庫。我非常懷疑你會逐行導出它們,然後在服務器層面上反覆使用讀/寫;那會是這樣一種資源。 – Ohgodwhy

回答

0

也許你甚至不得不將每張表的記錄拆分成不同的文件。

+0

我認爲,這是行不通的。因爲我在很多表中都有大量數據,我會每天運行這個腳本。 – Joomladev

1

由於一些表格有大量的數據,這將需要相當長的一段時間。結果連接會超時,導出失敗。

更好的方法是使用命令行將數據轉儲爲SQL。你可能想看看mysqldump命令。

您也可以從這樣的PHP腳本調用mysqldump命令 -

<?php 
# Database Settings 
$tmpDir = "/home/<username>/tmp/"; // Temp location the user has access to 
$user = "<username>_******"; // MySQL Username for the database 
$password = "*******"; // MySQL Password 
$dbName = "<username>_******"; // Database name, usually in the pattern: <username>_<dbname> 
$dbHost = "localhost"; // Mysql server hostname, usually localhost 

$sqlFile = $tmpDir . $dbName . date('Y_m_d') . ".sql"; // The dumped SQL File 
$attachment = $tmpDir . $dbName . "_" . date('Y_m_d') . ".tgz"; // TGZed file 

$creatBackup = "mysqldump -h '" . $dbHost . "' -u '" . $user . "' --password='" . $password . "' '" . $dbName . "' > '" . $sqlFile . "'"; // Full command 
$createZip = "tar cvzf $attachment $sqlFile"; // Full Command 

// Execute 'em 
system($creatBackup); 
system($createZip); 

這應該創建一個SQL轉儲和創建歸檔出來。

上述代碼是我構建的一個工具的一部分,用於向我發送數據庫的每日備份。你可以檢查出來Github上,並對其進行修改以滿足你的目的 - https://github.com/masnun/mysql-backup-to-email

+0

我試過了。但現在工作。是否需要包含任何庫?我只更改了數據庫連接設置。 – Joomladev

+0

請確保mysqldump命令可用。在Linux服務器上,這通常是mysql-client包的一部分。如果你在共享服務器上,你很有可能已經擁有了它。 沒有外部庫是必要的。 – masnun

+0

我正在創建一個擴展,這將在不同的服務器上使用。所以如果沒有安裝mysqldump命令,這將不起作用。是否有其他方式或邏輯? – Joomladev

0

我會建議,而不是重新發明您使用Akeeba Backup輪,因爲它可以讓你創建你的整個網站的自動備份,或者只是文件或特定目錄,或只是數據庫或特定的表格或任何你能想到的組合。

它也是免費的。

It's won awards year after year, highlyJoomla Extension Directory進行評分,我們將其用於我們所有的網站和我們的客戶網站。

如果你得到the Pro version,你甚至可以備份到亞馬遜的S3或其他有用的系統。

我有Akeeba其他比我更愛使用他們的產品沒有隸屬關係 - 他們讓我徹夜難眠。

+0

這花費了大量時間,試圖讓它自己工作起來更容易。特別是因爲你打算在不同的客戶端服務器上使用它。 Akeeba使得將網站從一臺服務器移到另一臺服務器變得微不足道。爲什麼重新發明輪子? –

+0

是的,我知道akeeba非常好,但我正在創建一個擴展/產品。所以我不能告訴每個使用Akeeba備份數據的客戶端。如果我創建我的腳本,那麼我將使用它作爲一個cronjob以及。 – Joomladev

+0

好的,從您的問題中不清楚您是否嘗試將其作爲組件的一部分 - 請查看我們所做的類似事情的新答案。乾杯:D – Craig

2

鑑於您對我以前的答案的意見,我建議你看看創建一個Joomla! CLI(查看您的Joomla 2.5+安裝的/cli目錄)。

我們已經做了類似的事情給你什麼,我們內部使用的開發,管理與特定內容審批流程的客戶網站提供Easystaging擴展的Pro版本。內部版本必須處理我們的大客戶需求。

我們實際上創建的類,從JApplicationCli繼承並可以由cron或者從我們的組件的用戶界面啓動。 例如

class EasyStaging_PlanRunner extends JApplicationCli 
{ 
    /** 
    * Entry point for the plan funner (yes it's more fun) 
    * 
    * @return void 
    * 
    * @since 2.5 
    */ 
    public function doExecute() 
    { 
    } 
} 

如果它是由用戶中的Joomla推出從我們使用了一個實用的方法來確保系統叉它關閉正確:

/** 
* Runs the script in the background by scheduling it with the `at` daemon and returns the result 
* 
* @param string $pathToScript A path to the script to run e.g. "/path/to/my/cli/app.php" 
* 
* @return int 
*/ 
private function _runScriptInBackground($pathToScript) 
{ 
    $cmdPath = "/usr/bin/php -q $pathToScript"; 

    // We need '2>&1' so we have something to pass back 
    $cmd  = 'echo "' . $cmdPath . '" | at now 2>&1'; 
    $result = shell_exec($cmd); 

    return $result; 
} 

由於這是一個命令行腳本了很多有效運行的限制比較鬆散,但他們仍然不會讓你在一個非常大的桌子周圍。 (我們的一些客戶有成千上萬的文章或更差的K2內容項目)。

爲了解決這個問題,我們編寫了一個從我們的doExecute()的主調度循環調用的導出方法,以合理的批次檢索和導出表格行。對我們而言合理由遠程數據庫max_allowed_packet的值確定,我們創建了一個SQL語句,該語句符合此限制,並且有各種開銷的小額餘額。您可能沒有這些問題,但即使如此,您也應該將SQL分解爲合理大小的insert語句。

一旦計劃完成運行,我們將壓縮所有文件並將其發送到存檔。