PHPでWordPressディレクトリのバックアップを取る方法

先日、AWSから Netowlの「スタードメイン無料サーバ」に WordPressを移行させましたが、AWSと比べると自由度が低く、いくつか出来なくなったことがあります。

その1つとしてSSHができなくなった点があります。

AWSではSSHでサーバにログインし、wp-content ディレクトリ配下を zipコマンドでまとめて圧縮して自分のPCにダウンロードしていました。

しかし、この無料レンタルサーバでは以下のWebFTPからファイルを1つずつダウンロードするしかなさそうです。

StarServer WebFTP

そこで、特定のディレクトリ配下のファイルやディレクトリをZIPファイルにまとめるPHPを準備しました。

1.PHPプログラムの作成

PHPでは、UNIXのzipコマンドのように特定のディレクトリ配下をまとめて圧縮してくれるような便利な関数は無いようです。

なお、PHPのexec()関数などで外部のUNIXコマンドを呼び出す方法もありますが、私が利用している無料のレンタルサーバでは、それらの関数の利用が制限されているようです。(セキュリティ的には正しいと思います。)

そこで、以下のサンプルのように、特定のディレクトリ配下のファイルやディレクトリの情報を再帰的に取得し、取得した情報がファイルの場合はZIPファイルに追加、ディレクトリの場合は空ディレクトリの作成をしてあげる必要があるようです。

<?php
// 圧縮するディレクトリを指定
$dir = dirname(__FILE__). '/wp-content/';

// ZIPファイルの場所とファイル名を指定
$file = dirname(__FILE__).'/backup.zip';

// 圧縮する為のオブジェクトを生成
$zip = new ZipArchive();

// ZIPファイルを生成する為の準備(成功したら$resにtrueが返ってくる)
$res = $zip->open($file, ZipArchive::CREATE);

// $resの値がtrueなら、最初の{}内を実行
if($res){
    // $dirの長さを取得
    $baseLen = mb_strlen($dir);

    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator(
            $dir,
            FilesystemIterator::SKIP_DOTS
            |FilesystemIterator::KEY_AS_PATHNAME
            |FilesystemIterator::CURRENT_AS_FILEINFO
        ), RecursiveIteratorIterator::SELF_FIRST
    );

    foreach($iterator as $pathname => $info){

        // mb_substr()で$pathnameの先頭から$baseLen文字目より右を切り出し
        $localpath = mb_substr($pathname, $baseLen);

        // $infoがファイルならZIPファイルに追加
        if( $info->isFile() ){
            $zip->addFile($pathname, $localpath);

        // $infoがディレクトリなら空ディレクトリをZIPファイルに作成
        } else {
            $res = $zip->addEmptyDir($localpath);
        }
    }
 
    $zip->close();
} else {
    return false;
}

?>

このサンプルプログラムを例えば、zip-sample.php という名前で wp-content の親ディレクトリ(lsコマンドを実行した時に、wp-content ディレクトリが表示される位置)に配置します。

2.PHPプログラムの実行

SSHで接続できないのにどうやってこのPHPプログラムを実行するの?と疑問に思う方もいるかもしれません(実は私も最初、疑問に思いました。)

しかし、実は簡単なことで、単純にブラウザからこのPHPプログラムにアクセスするだけです。

自分のWordPressのルートディレクトリの場所にもよりますが、大抵は、以下のURLにアクセスすれば実行できると思います。

https://(WordPressのドメイン名)/zip-sample.php

プログラムが実行している間は、ブラウザがくるくるしていると思いますが、実行が完了すると、それが止まり、PHPと同じディレクトリにbackup.zipというファイルができていると思います。

3.ZIPファイルのダウンロード

あとは作成されたZIPファイルを自分のPCにダウンロードするだけですが、記事を100記事以上書いている場合には、おそらくZIPのサイズが100M以上になっていると思います。

自分の使っている無料レンタルサーバでは、WebFTPでダウンロード可能なファイルサイズの上限が50MBまでとなっていましたのでどうしようかと思いましたが、PCのコマンドプロンプト(ターミナル)からftpコマンドを実行した場合にはその制限はかからないようで、無事にダウンロードすることができました。

ダウンロードした後、ちゃんとすべてのファイルがZIPファイルに格納されていることを確認することをお勧めします。