之前我已經發布過一篇類似的文章《PHP 獲取遠程的.sql.zip文件,然後清空數據,再將.sql.zip導入mysql數據庫》,但是這裏再補充一個函數,也是親測可用的!
🔒 隱藏內容:會員可查看
/**
* 從遠程URL下載包含SQL文件的ZIP壓縮文件,解壓縮SQL文件到指定目錄,然後將數據導入到MySQL數據庫中。
*
* @param string $remoteUrl 遠程ZIP文件的URL地址
* @param string $dbName 目標MySQL數據庫的名稱
* @param string $dbUser 目標MySQL數據庫的用戶名
* @param string $dbPass 目標MySQL數據庫的密碼
* @param string $dbHost 目標MySQL數據庫的主機地址,默認爲localhost
* @param string $sqlDir 解壓縮SQL文件的目錄路徑,默認爲當前文件所在目錄下的path/目錄
* @throws Exception 如果下載、解壓縮、數據庫操作失敗,則會拋出異常
*/
function importSqlZip($remoteUrl, $dbName, $dbUser, $dbPass, $dbHost = 'localhost', $sqlDir = __DIR__.'/path/') {
// 創建一個臨時文件用於保存下載的 Zip 文件
$tempZip = tempnam(sys_get_temp_dir(), 'sql_zip_');
// 下載遠程 Zip 文件並保存到本地
$fp = fopen($tempZip, 'w');
$ch = curl_init($remoteUrl);
curl_setopt($ch, CURLOPT_FILE, $fp);
$success = curl_exec($ch);
curl_close($ch);
fclose($fp);
if (!$success) {
throw new Exception('Failed to download the remote SQL ZIP file.');
}
// 創建指定目錄
if (!mkdir($sqlDir, 0777, true)) {
throw new Exception('Failed to create directory.');
}
// 解壓縮文件到指定目錄
$zip = new ZipArchive();
if ($zip->open($tempZip) === TRUE) {
$zip->extractTo($sqlDir);
$zip->close();
} else {
throw new Exception('Failed to extract the SQL ZIP file.');
}
// 清空數據庫
$dsn = "mysql:host=$dbHost;dbname=$dbName";
$pdo = new PDO($dsn, $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
foreach ($tables as $table) {
$pdo->query("DROP TABLE IF EXISTS $table");
}
// 導入 SQL 文件
$files = glob($sqlDir . '*.sql');
foreach ($files as $file) {
$pdo->exec(file_get_contents($file));
}
// 刪除臨時文件和 SQL 文件
unlink($tempZip);
$files = glob($sqlDir . '*.sql');
foreach ($files as $file) {
unlink($file);
}
rmdir($sqlDir);
}
當你想要調用這個函數時,你需要按以下格式調用:
importSqlZip($remoteUrl, $dbName, $dbUser, $dbPass, $dbHost, $sqlDir)
其中,$remoteUrl 是遠程 SQL ZIP 文件的 URL,$dbName 是要導入數據的 MySQL 數據庫名,$dbUser 是 MySQL 數據庫的用戶名,$dbPass 是 MySQL 數據庫的密碼,$dbHost 是 MySQL 數據庫的主機地址,默認爲 localhost,$sqlDir 是解壓縮後 SQL 文件的存儲路徑,默認爲當前 PHP 文件的目錄下的 "path/" 文件夾。
例如,如果你想從 "https://example.com/backup.zip" 導入數據到 "my_database" 數據庫,使用用戶名 "my_user" 和密碼 "my_password",默認的數據庫主機地址和 SQL 文件存儲路徑,則你應該這樣調用函數:
importSqlZip('https://example.com/backup.zip', 'my_database', 'my_user', 'my_password');
如果你想自定義數據庫主機地址和 SQL 文件存儲路徑,則可以這樣調用函數:
importSqlZip('https://example.com/backup.zip', 'my_database', 'my_user', 'my_password', 'my_db_host', '/custom/sql/dir/');