2013-05-08 13 views
6

Chcę, aby folder na jednym komputerze był zsynchronizowany z folderem na innym. Dotyczy to wtyczki do wdrażania WordPress, więc nie mogę polegać na rsync lub innych poleceniach obecnych na obu komputerach. PHP i serwer WWW będą dostępne na obu komputerach i idealnie działałby przez HTTP.Folder kopii dystrybucyjnych ze zdalnego serwera w czystym PHP

Moje bieżące myślenie polega na tym, że żądająca maszyna wysyła lokalną listę plików z datami ostatniej modyfikacji do skryptu na drugim komputerze. Druga maszyna porównuje się z jej plikami i odpowiada zmodyfikowanymi plikami - albo lista plików, które należy pobrać indywidualnie, albo ze zmienionymi plikami zaznaczonymi w odpowiedzi.

Wolałbym jednak użyć istniejącego rozwiązania, jeśli takie istnieje. Jakieś pomysły?

+0

Jaki jest protokół, który chcesz użyć, aby przesłać pliki? ftp? ssh? inni? Mówisz o HTTP, ale dostaniesz kłopoty, jeśli chcesz na przykład utworzyć kopię pliku '.php' ze zdalnego serwera. –

+0

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

+0

I kolejne +1 tutaj. – transilvlad

Odpowiedz

8

stworzyłem prosty zestaw klas do realizacji tego: https://github.com/outlandishideas/sync

na serwerze, na przykład 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 

Na kliencie:

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

Podoba mi się. Wygląda bardzo schludnie. Miałeś więcej czasu i motywacji, kiedy budowałeś swój. Czy pomogłem? – transilvlad

+0

Dziękuję za nagrodę. Oto +1 ode mnie :) – transilvlad

0

W PHP nie polecam go z kilku powodów.

Mam dokładnie to, czego potrzebujesz jako aplikacja python.

Ta aplikacja jest zbudowany, aby uruchomić jako usługę, wystarczy go uruchomić i zapomnieć o nim :)

aplikacji: https://gist.github.com/8f62786582c6933395eb

Shell: https://gist.github.com/e08a99937c6f5deac4ab

Uwaga: plik shell powinien być nazywany fsyncd nie fsyncd.sh :)

wersja PHP związku z powyższym:

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

Uwaga: Należy uruchomić go na obu stronach i skonfigurować, aby połączyć się z innymi i ustawić je do wykonania przez crony. Najlepiej nie przez WP crons.

mam ścieżkę do katalogu, który będzie zsynchronizowany zdefiniowanej tutaj:

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

w moim przypadku folder Dane znajdują się w folderze skryptu. Powinieneś po prostu ustawić absolutną ścieżkę lub użyć rdzenia WP, aby uzyskać katalog ładunków WP.

Głównym jest:

  1. znaleźć sposób, aby uzyskać dwa serwery w stanie ze sobą rozmawiać. Użyłem podejścia do serwera gniazd/klienta. Można wykonać procesor HTTP _POST (serwer) i ekspres HTTP _POST (klient).

  2. Zapisywanie ostatniego czasu synchronizacji.

  3. W określonych odstępach czasu można czytać i zapisywać pliki zmodyfikowane od ostatniego czasu synchronizacji.

  4. Wysyła listę plików, które mają zostać zaktualizowane z ich zmodyfikowanym znacznikiem czasu na inny serwer.

  5. Powinien on porównać twoją listę z zapisami i powiedzieć, których z plików nie ma.

  6. Wyślij te pliki.

  7. Odbiornik zapisze pliki i ustawi zmodyfikowaną datę na tę na drugim serwerze. (jest to ważne, aby uniknąć nieskończonych pętli)

Powodzenia.

+0

Dzięki. Dotyczy to wtyczki WordPress, więc nie mogę mieć żadnych zależności od PHP. Czy mógłbyś wyjaśnić, dlaczego uważasz, że PHP nie nadaje się do takiego zadania? – Tamlyn

+0

Zobacz wersję PHP powyżej. Powinieneś być w stanie owinąć go w moduł Wordpress. Przepraszam za bałagan, początkowo zbudowałem go w wielu plikach. Później mógłbym to wszystko spakować na miłej lekcji. – transilvlad

+0

Wow, dobra robota. Wygląda na to, że pracowaliśmy nad [całkiem podobne rzeczy] (https://github.com/outlandishideas/sync) w tym samym czasie. – Tamlyn

0

Najlepszym rozwiązaniem jest sprawdzenie, kiedy skrypt był ostatnio uruchamiany, a następnie przesłanie folderu z funkcjami 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 
    } 

Powinno być non-blocking (no - wysyłanie do serwera zdalnego), więc jeśli nie masz wiele plików zip, że będzie dobrze, aby to na index page na przykład. Nie ma żadnej obsługi błędów, więc możesz to dodać. Nie usuwa też lokalnej kopii zapasowej, możesz ją obsłużyć.

+0

Chce się odbić. Oznacza to, że wszystkie pliki istniejące na obu serwerach (relacja master-master) nie są archiwizowane. – transilvlad

Powiązane problemy