Saba note

醜悪コード Ugly hacks ITものづくり

RsyncのPHPリブラリー albertofem/rsync-libの使い方

Rsyncの使い方では生のコマンドラインの説明なんですが、PHPでRsync使おうとするといろいろ面倒ですが、albertofem/rsync-lib使うとすごい楽ちんです。単にRsyncのラッパーで中でコマンドラインを生成してshell_exec()しているだけというものですが、とてもシンプルでよくできています。

インストールと入手

コンポーザーで落としてくるのが楽。すでにコンポーザーの設定している人はコンポーザー自体を落としてくる必要ないです。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install
php composer.phar require albertofem/rsync-lib 1.0.0

これでOK

基本的な設定

rsync-lib/README.mdに基本的な設定方法は書かれています。

require "./config.php";
require __DIR__."/vendor/autoload.php";
use AFM\Rsync\Rsync;

$origin = "/var/www/migration";
$target = "/var/www/migration2";

/* rsync options: albertofem/rsync-lib/src/AFM/Rsync/Rsync.php:132 */
/* ssh opsions: albertofem/rsync-lib/src/AFM/Rsync/SSH.php:53 */
$config = array(
    'delete_from_target' => true,
    'excludeFrom' => './exclude_list',
    'ssh' => array(
        'host' => $host,
        'private_key' => $private_key,
        'username' => $username,
        'port' => 22,
    )
);

$rsync = new Rsync($config);
$rsync->setFollowSymlinks(false);
$rsync->sync($origin, $target);

まずは、autoload.phpでパッケージのクラスを使えるようにしておいて、後はconfigで設定したものをRsyncでnewするだけ。Rsync()に$configを渡してあげるとリモートホスト同士の接続をやってくれて、なければローカルホスト内で同期をします。
Rsyncの同期から除外するファイルの設定は、excludeFromオプションでパスを設定したりできます。これらのオプションの設定は、

AFM/Rsync/Rsync.php

にプロパティーとして書いてあるのでそこを見ればよいです。例えばですが、excludeとexcludeFromがありますが、これは前者は除外ファイルをカンマ切りで指定するやつで、後者がファイルを読み込んでそのリストを取得するやり方です。excludeの場合は、

protected $exclude = array();

になっているので、配列でリスト指定できます。excludeFromの方はnullになってます。

protected $excludeFrom = null;

こっちはたぶん文字列で指定(つまりファイルパス)ってことだと思います。
そういう感じでだいたい分かる感じになってました。

オプション

オプションはこれだけありました。

executable
archive
update
follow_symlinks
dry_run
option_parameters
verbose
delete_from_target
delete_excluded
exclude
excludeFrom
recursive
times
show_output
ssh
compression
remote_origin
remove_source
info
compare_dest
prune_empty_dirs

全部が全部じゃないけど十分ですね。

パス

どのディレクトリをどこのディレクトリに同期する(上書きする)かというのは、使ってみたらrsyncコマンドを扱いが同じでした。

$origin = "/var/www/html";
$target = "/var/www/html2";

/var/www/htmlディレクトリが/var/www/html2ディレクトリにコピーされるので、結果

/var/www/html2/html

なります。
これが意図しているのと違っているのだったら、こんな感じ。

$origin = "/var/www/html/";
$target = "/var/www/html2/";

/var/www/html/が/var/www/html2/の内容で置き換えられます。
ここらはなんか考え出すとわけわからなくなるので、/で終わっていればいいんではないかと。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です