Skip to content

Instantly share code, notes, and snippets.

@kazumich
Last active August 18, 2022 02:36
Show Gist options
  • Save kazumich/7898de48f6c895f53d6d96dadea7aca1 to your computer and use it in GitHub Desktop.
Save kazumich/7898de48f6c895f53d6d96dadea7aca1 to your computer and use it in GitHub Desktop.
a-blog cms のデータ(DB / archives / archives_rev / storage / media)を同じサーバー内の別の a-blog cms にコピーする仕組み
<?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