2013-05-08 21 views
6

あるマシンのフォルダを別のマシンのフォルダと同期させておきたい。これはWordPressデプロイメントプラグイン用ですので、どちらのマシンにrsyncや他のコマンドが存在するかは頼りにできません。 PHPとWebサーバーは両方のマシンで利用でき、理想的にはHTTP経由で動作します。純粋なPHPのリモートサーバーからのミラーフォルダ

私の現在の考えは、リクエストしているマシンが、最後に変更された日付を持つローカルファイルリストを他のマシンのスクリプトに投稿することです。他のマシンはそのファイルと比較し、変更されたファイル(個別にフェッチされるファイルのリストか、応答にインライン化された変更されたファイルのリスト)で応答します。

既存のソリューションがあればそれを使用したいと思います。何か案は?

+0

あなたがファイルを転送するために使用するプロトコルは何ですか? ftp? ssh?その他?あなたはHTTPについて話していますが、例えば、リモートサーバから '.php'ファイルをバックアップしたい場合には、問題が発生します。 –

+0

http://stackoverflow.com/questions/1691530/sending-a-file-via-http-put-in-php – Cypher

+0

もう1つはここにあります。 – transilvlad

答えて

8

私はこれを実装するクラスの簡単なセットを作成しました:例えば、サーバー上でhttps://github.com/outlandishideas/sync

をexample.com/remote.php:クライアントで

const SECRET = '5ecR3t'; //make this long and complicated 
const PATH = '/path/to/source'; //sync all files and folders below this path 

$server = new \Outlandish\Sync\Server(SECRET, PATH); 
$server->run(); //process the request 

const SECRET = '5ecR3t'; //this must match the secret key on the server 
const PATH = '/path/to/destination'; //target for files synced from server 

$client = new \Outlandish\Sync\Client(SECRET, PATH); 
$client->run('http://example.com/remote.php'); //connect to server and start sync 
+0

私はそれが好きです。非常にきれいに見えます。あなたはあなたのものを建てたときに、より多くの時間とモチベーションを持っていました。私は助けましたか? – transilvlad

+0

奨励賞をいただきありがとうございます。私からの+1があります:) – transilvlad

0

PHPでは、私はたくさんの理由でそれをお勧めしません。

私はあなたがpythonアプリケーションとして必要なものを持っています。

このアプリは、サービスとして実行するように構築されて、あなたは、単にそれを起動して、それを忘れは:)

アプリケーション:https://gist.github.com/8f62786582c6933395eb

シェル:https://gist.github.com/e08a99937c6f5deac4ab

注:シェルファイルを呼び出さなければなりませんfsyncd.shないfsyncd :)

上記のPHPのバージョン:

https://gist.github.com/3963cbc58793ff7e9773

注:両方のサイトで動作させ、それぞれを別のサイトに接続し、それらをcronで実行するように設定する必要があります。 WPクロンではないことが好ましい。データフォルダは、スクリプトフォルダにある私の場合は

define("PATH_DATA", PATH_ROOT . "data" . DIRECTORY_SEPARATOR); 

私は同期ここで定義されるディレクトリへのパスを持っています。あなたは絶対パスを設定するか、WPのアップロードディレクトリを取得するためにWPコアを使用するだけです。

校長は次のとおりです。

  1. お互いに話をすることができる2台のサーバーを取得する方法を見つけます。 私はソケットサーバー/クライアントアプローチを使用しました。 HTTP _POSTプロセッサ(サーバー)とHTTP _POSTメーラー(クライアント)を実行できます。

  2. 最後の同期時間を記録します。

  3. 特定の間隔で、最後の同期時間から変更されたファイルを読み込んで記録します。

  4. 更新されるファイルのリストを、変更されたタイムスタンプで他のサーバーに送信します。

  5. あなたのリストを彼の記録と比較し、彼が持っていないファイルを教えてください。

  6. これらのファイルを送信します。

  7. 受信者は、ファイルを書き込み、変更された日付を他のサーバーのものに設定します。 (これは無限ループを避けるために重要です)

幸運です。

+0

ありがとうございます。これはWordPressプラグイン用ですので、私はPHP以外の依存関係を持つことはできません。 PHPがそのようなタスクに適していないと思われる理由について詳しく説明できますか? – Tamlyn

+0

上記のPHPバージョンを参照してください。あなたはWordpressモジュールでそれをラップすることができるはずです。私は最初に複数のファイルで構築した混乱を許してください。後で私は素敵なクラスでそれを包むかもしれません。 – transilvlad

+0

うわー、良い仕事。私たちは、[かなり類似したもの](https://github.com/outlandishideas/sync)を同じようにして作業していたようです。 – Tamlyn

0

スクリプトが最後に実行されたことを確認してから、ftp_*機能を使用してフォルダをアップロードすることをおすすめします。

<?php 
    $username = 'root'; // and this 
    $password = 'password'; // this also 
    $host  = 'my-remote-server.com'; // and this 

    $remote_backup = 'backups/'; // folder on remote server to upload to 
    $backup_folder = 'to_backup/'; // folder to backup 
    $temp_folder = 'temp_files/'; // a folder on the local server i can write to 

    $last_run = file_get_contents("{$temp_folder}last_run.txt"); // You'll probably want to get this from a database instead 

    if($last_run <= strtotime('-1 day')) 
    { 
     file_put_contents("{$temp_folder}last_run.txt", time()); // Update the last time this was ran 

     $file = time() . '_backup.zip'; // what the file will be called both remotely and locally 
     $ftp = ftp_connect($host); // connect to the ftp server 
     ftp_login($ftp, $username, $password); // login to the ftp server 

     $zip = new ZipArchive; // create a new instance of ZipArchive 
     $zip->open($temp_folder . $file, ZIPARCHIVE::CREATE); // Create a new archive 

     foreach(glob($backup_folder . '*') as $file) // Loop through all files in the local backup directory 
     { 
      $zip->addFile($file); // add that file 
     } 

     ftp_chdir($ftp, $remote_backup); // cd into the remote backup folder 
     $upload = ftp_nb_put($ftp, $remote_backup . $file, $temp_folder . $file); // non-blocking put, uploads the local backup onto the remote server 

     while($upload === FTP_MOREDATA) 
     { 
      // do something else while we're waiting for the non-blocking upload to finish 
     } 

     ftp_close($ftp); // closes the connection 
    } 

それは(も - リモートサーバへのアップロード)の非ブロッキングでなければなりません、あなたが圧縮する多くのファイルを持っていないので、もし例えばindex pageに含めて大丈夫です。エラー処理がないので、それを追加することもできます。また、ローカルバックアップも削除しません。どちらかを処理したい場合もあります。

+0

彼は鏡をしたい。両方のサーバーに存在するすべてのファイル(マスターとマスターの関係)がアーカイブされていないことを意味します。 – transilvlad

関連する問題