使用PHP/Joomla,我試圖導出數據庫備份到CSV/SQL文件下載。一些表格有大量的記錄。當我開始導出它提供了以下錯誤: 致命錯誤:最長30秒的執行時間超過使用PHP/Joomla編程導出MySql數據庫爲CSV
注:我不想用「的max_execution_time」或「set_time_limit()函數」或任何PHP。 ini設置。因爲我將在不同的客戶端服務器上使用此腳本&我不會告訴每個客戶端更改設置。 我需要PHP/Joomla腳本,而不是任何擴展。
請幫幫我。
使用PHP/Joomla,我試圖導出數據庫備份到CSV/SQL文件下載。一些表格有大量的記錄。當我開始導出它提供了以下錯誤: 致命錯誤:最長30秒的執行時間超過使用PHP/Joomla編程導出MySql數據庫爲CSV
注:我不想用「的max_execution_time」或「set_time_limit()函數」或任何PHP。 ini設置。因爲我將在不同的客戶端服務器上使用此腳本&我不會告訴每個客戶端更改設置。 我需要PHP/Joomla腳本,而不是任何擴展。
請幫幫我。
由於一些表格有大量的數據,這將需要相當長的一段時間。結果連接會超時,導出失敗。
更好的方法是使用命令行將數據轉儲爲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
我會建議,而不是重新發明您使用Akeeba Backup輪,因爲它可以讓你創建你的整個網站的自動備份,或者只是文件或特定目錄,或只是數據庫或特定的表格或任何你能想到的組合。
它也是免費的。
It's won awards year after year, highly對Joomla Extension Directory進行評分,我們將其用於我們所有的網站和我們的客戶網站。
如果你得到the Pro version,你甚至可以備份到亞馬遜的S3或其他有用的系統。
我有Akeeba其他比我更愛使用他們的產品沒有隸屬關係 - 他們讓我徹夜難眠。
鑑於您對我以前的答案的意見,我建議你看看創建一個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
語句。
一旦計劃完成運行,我們將壓縮所有文件並將其發送到存檔。
您是否嘗試將每個表導出到它自己的單獨文件? – iTom
是的。我試過了。有些正在導出,但在某些表格中會導致執行錯誤。 – Joomladev
你是SOL。如果任何這些表格需要超過30秒的時間來處理,則會發生超時;甚至可以通過表格來破壞數據庫。我非常懷疑你會逐行導出它們,然後在服務器層面上反覆使用讀/寫;那會是這樣一種資源。 – Ohgodwhy