Last active
August 18, 2022 02:36
-
-
Save kazumich/7898de48f6c895f53d6d96dadea7aca1 to your computer and use it in GitHub Desktop.
a-blog cms のデータ(DB / archives / archives_rev / storage / media)を同じサーバー内の別の a-blog cms にコピーする仕組み
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// ---------------------- | |
// a-blog cms | |
// update 2022/03/15 | |
// ---------------------- | |
// ------------------- | |
// 2) パスワードチェック | |
// ------------------- | |
# on : ブラウザ上からパスワードを入力し実行します。(推奨) | |
# off : cron など画面表示させたくない時に設定ください。 | |
$password_check = "on"; # on / off | |
// -------------------- | |
// バックアップの設定 | |
// -------------------- | |
# 指定すると backup_YYYYMMDDHHMMSS.zip で移行後の | |
# sql / archives , archives_rev , storage , media | |
# を圧縮してバックアップします。 | |
#$backup = "backup"; | |
# ダウンロード on でサーバー上にはファイルを残しません | |
$zip_download = "off"; # on / off | |
// -------------------- | |
// コマンド パスの設定 | |
// -------------------- | |
$mysqldump = "mysqldump"; | |
$mysql = "/usr/bin/mysql"; | |
# MAMP の場合 | |
# $mysqldump = "/Applications/MAMP/Library/bin/mysqldump"; | |
# $mysql ="/Applications/MAMP/Library/bin/mysql"; | |
// -------------------- | |
// 移行前環境設定 | |
// -------------------- | |
require_once('config.server.php'); | |
$database_name_before = DB_NAME; | |
$acount_name_before = DB_USER; | |
$acount_password_before = DB_PASS; | |
$database_host_before = DB_HOST; | |
// -------------------- | |
// 移行後環境設定 | |
// -------------------- | |
// データベース設定 | |
$database_host_after = "localhost"; | |
$database_name_after = "appleple_test"; | |
$acount_name_after = "appleple"; | |
$acount_password_after = "password"; | |
$database_prefix_after = "acms_"; | |
// 移行後のドメイン設定 | |
$blog_domain_after = "test.sample.com"; | |
// 移行後パス設定 | |
$system_dir_after = realpath('.')."/test.sample.com"; | |
// 移行後 a-blog cms URL | |
$system_url_after = "https://test.sample.com/"; | |
// ------------------------ | |
// バックアップファイル名の設定 | |
// ------------------------ | |
if (isset($backup)) { | |
$YmdHis = date('YmdHis'); | |
$fileName = $backup . "_" . $YmdHis .".zip"; | |
$backup_zipFile = $system_dir_after ."/". $fileName; | |
} | |
// ------------------------ | |
// チェック | |
// ------------------------ | |
if (!is_file($system_dir_after."/license.php")) { | |
exit('移行後のパス設定が間違っています。: '.$system_dir_after); | |
} | |
// ------------------------ | |
// パスワード入力画面表示 | |
// ------------------------ | |
if ($password_check == "on") { | |
$input_pass = filter_input(INPUT_POST, "dbpass"); | |
if ($zip_download == "on" && $input_pass == $acount_password_after) { | |
} else { | |
?> | |
<!DOCTYPE html> | |
<html lang="ja"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>a-copy</title> | |
<link rel="stylesheet" href="/themes/system/css/acms-admin.min.css"> | |
<style> | |
body { | |
padding : 10px 30px; | |
background-color : #ddd; | |
font-family: Courier; | |
} | |
</style> | |
</head> | |
<body> | |
<h1>a-copy</h1> | |
<p>同じサーバーに設置された</p> | |
<?php | |
echo sprintf("<a href='//%s'>%s</a> から <a href='%s'>%s</a> へ",DOMAIN,DOMAIN,$system_url_after,$blog_domain_after); | |
?> | |
<ul> | |
<li>archives</li> | |
<li>archives_rev</li> | |
<li>media</li> | |
<li>storage</li> | |
</ul> | |
<p>のファイルをコピーし、データベースも上書きを行います。</p> | |
<?php if (isset($backup)) { ?> | |
<p>移行先のサーバーのデータは削除され、バックアップファイルとして保存されます。</p> | |
<p>戻したい場合には、バックアップファイルを元に手動で復旧作業を行ってください。</p> | |
<?php } else { ?> | |
<p>移行先のサーバーのデータは削除されます。</p> | |
<?php } ?> | |
<form action="" method="POST" class="acms-admin-form"> | |
<input type="password" name="dbpass" id="dbpass" class="acms-admin-form-width-mini"> | |
<input type="submit" class="acms-admin-btn" value="実行" onclick="javascript:return confirm('データが上書きされ <?php echo $blog_domain_after; ?> のデータが削除されます。\n本当に、よろしかったでしょうか?')"> | |
</form> | |
<?php | |
if (!isset($input_pass)) { | |
echo "<p>データベースのパスワードを入力してください。</p></body></html>"; | |
exit; | |
} elseif ($input_pass != DB_PASS) { | |
echo "<p class='acms-admin-text-error'>パスワードが間違っています。</p></body></html>"; | |
exit; | |
} elseif (isset($fileName)) { | |
echo sprintf("<p>削除されたデータは一時的に <a href='%s%s'>%s</a> に保存されています。(手動で削除ください)</p>",$system_url_after,$fileName,$fileName); | |
echo "</body></html>"; | |
} else { | |
echo "<p>完了しました。</p>"; | |
echo "</body></html>"; | |
} | |
} | |
} | |
// ------------------------ | |
// バックアップ作成 | |
// ------------------------ | |
if (isset($backup)) { | |
if (is_dir($system_dir_after."/".$backup)) { | |
echo "バックアップディレクトリが存在します。:" .$system_dir_after."/".$backup; | |
exit; | |
} | |
mkdir ($system_dir_after."/".$backup); | |
rename ($system_dir_after."/archives", $system_dir_after."/".$backup."/archives"); | |
rename ($system_dir_after."/archives_rev", $system_dir_after."/".$backup."/archives_rev"); | |
rename ($system_dir_after."/storage", $system_dir_after."/".$backup."/storage"); | |
rename ($system_dir_after."/media", $system_dir_after."/".$backup."/media"); | |
$sql_fileName = date('Ymd') . '_databasedump.sql'; | |
$sql_filePath = $system_dir_after ."/". $backup ."/". $sql_fileName; | |
$command_dump = $mysqldump. ' --single-transaction --default-character-set=binary ' . $database_name_after . ' --host=' . $database_host_after . ' --user=' . $acount_name_after . ' --password=' . $acount_password_after . ' > ' . $sql_filePath; | |
system($command_dump); | |
$compressDir = $system_dir_after . "/". $backup; | |
$command_zip = "cd ". $compressDir .";". | |
"zip -r -q ". $backup_zipFile ." ."; | |
system($command_zip); | |
if ($zip_download == "on") { | |
header('Pragma: public'); | |
header("Content-Type: application/octet-stream"); | |
header("Content-Disposition: attachment; filename=".$fileName); | |
readfile($backup_zipFile); | |
} | |
} | |
// ------------------------ | |
// ファイルコピー | |
// ------------------------ | |
dir_shori ("copy", "archives", $system_dir_after."/archives"); | |
dir_shori ("copy", "archives_rev", $system_dir_after."/archives_rev"); | |
dir_shori ("copy", "storage", $system_dir_after."/storage"); | |
dir_shori ("copy", "media", $system_dir_after."/media"); | |
// ------------------------ | |
// データベース エクスポート | |
// ------------------------ | |
$sql_fileName = date('Ymd') . '_databasedump.sql'; | |
$sql_filePath = MEDIA_STORAGE_DIR . $sql_fileName; | |
$command_dump = $mysqldump. ' --single-transaction --default-character-set=binary ' . $database_name_before . ' --host=' . $database_host_before . ' --user=' . $acount_name_before . ' --password=' . $acount_password_before . ' > ' . $sql_filePath; | |
system($command_dump); | |
// ------------------------ | |
// データベース インポート | |
// ------------------------ | |
$command_restore = "$mysql -u $acount_name_after -p$acount_password_after -h $database_host_after $database_name_after < $sql_filePath"; | |
system($command_restore); | |
// SQL 削除 | |
unlink($sql_filePath); | |
// --------------------------- | |
// データベース ドメイン名書き換え | |
// --------------------------- | |
try { | |
$dbh = new PDO('mysql:host='.$database_host_after.';dbname='.$database_name_after.'', $acount_name_after, $acount_password_after); | |
$dbh->query("UPDATE ".$database_prefix_after."blog SET blog_domain = '$blog_domain_after'"); | |
$sth = null; | |
$dbh = null; | |
} catch (PDOException $e) { | |
print "エラー!: " . $e->getMessage(); | |
die(); | |
} | |
// ------------------------ | |
// バックアップディレクトリ削除 | |
// ------------------------ | |
if (isset($backup)) { | |
if (is_dir($system_dir_after."/".$backup)) { | |
dir_shori("delete", $system_dir_after."/".$backup); | |
} | |
if ($zip_download == "on") { | |
unlink($backup_zipFile); | |
} | |
} | |
exit; | |
// -------------------------- | |
// ディレクトリを操作 function ( move / copy / delete ) | |
// -------------------------- | |
function dir_shori ($shori, $nowDir , $newDir="") { | |
if ($shori != "delete") { | |
if (!is_dir($newDir)) { | |
mkdir($newDir); | |
} | |
} | |
if (is_dir($nowDir)) { | |
if ($handle = opendir($nowDir)) { | |
while (($file = readdir($handle)) !== false) { | |
if ($file != "." && $file != "..") { | |
if ($shori == "copy") { | |
if (is_dir($nowDir."/".$file)) { | |
dir_shori("copy", $nowDir."/".$file, $newDir."/".$file); | |
} else { | |
copy($nowDir."/".$file, $newDir."/".$file); | |
} | |
} elseif ($shori == "move") { | |
rename($nowDir."/".$file, $newDir."/".$file); | |
} elseif ($shori == "delete") { | |
if (filetype($nowDir."/".$file) == "dir") { | |
dir_shori("delete", $nowDir."/".$file, ""); | |
} else { | |
unlink($nowDir."/".$file); | |
} | |
} | |
} | |
} | |
closedir($handle); | |
} | |
} | |
if ($shori == "move" || $shori == "delete") { | |
rmdir($nowDir); | |
} | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment