2013-05-08 39 views
6

Tôi muốn giữ một thư mục trên một máy đồng bộ hóa với một thư mục trên một máy khác. Đây là cho một plugin triển khai WordPress vì vậy tôi không thể dựa vào rsync hoặc các lệnh khác đang có mặt trên một trong hai máy. PHP và một máy chủ web sẽ có sẵn trên cả hai máy và lý tưởng nó sẽ hoạt động trên HTTP.Thư mục gương từ máy chủ từ xa bằng PHP tinh khiết

Suy nghĩ hiện tại của tôi là máy yêu cầu đăng danh sách tệp cục bộ có ngày sửa đổi lần cuối vào tập lệnh trên máy khác. Các máy khác so sánh với các tập tin của nó và đáp ứng với các tập tin sửa đổi - hoặc một danh sách các tập tin được lấy riêng lẻ hoặc với các tập tin thay đổi được nêu trong phản ứng.

Tôi muốn sử dụng giải pháp hiện tại nếu một giải pháp tồn tại. Bất kỳ ý tưởng?

+0

giao thức bạn muốn sử dụng để chuyển các tập tin là gì? ftp? ssh? khác? Bạn đang nói về HTTP, nhưng bạn sẽ gặp rắc rối nếu bạn muốn sao lưu một tập tin '.php' từ một máy chủ từ xa chẳng hạn. –

+0

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

+0

Và +1 khác tại đây. – transilvlad

Trả lời

8

tôi đã tạo ra một tập hợp đơn giản của lớp học để thực hiện điều này: https://github.com/outlandishideas/sync

Trên máy chủ, ví dụ 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 

Trên client:

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

Tôi thích nó. Trông rất gọn gàng. Bạn có nhiều thời gian và động lực hơn khi bạn xây dựng hệ thống của mình. Tôi có giúp gì không? – transilvlad

+0

Cảm ơn bạn vì tiền thưởng. Đây là một +1 từ tôi :) – transilvlad

0

Trong PHP, tôi không khuyến nghị sử dụng vì nhiều lý do.

Tôi có chính xác những gì bạn cần làm ứng dụng python.

Ứng dụng này được thiết kế để chạy như một dịch vụ, bạn chỉ cần khởi động nó và quên nó đi :)

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

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

Lưu ý: file shell nên được gọi là fsyncd không fsyncd.sh :)

phiên bản PHP ở trên:

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

Lưu ý: Bạn cần làm cho nó chạy trên cả hai trang web và định cấu hình từng kết nối với nhau và đặt chúng được thực hiện bởi crons. Tốt hơn không phải bởi WP crons.

tôi có đường dẫn đến thư mục đó sẽ được đồng bộ hóa định nghĩa ở đây:

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

Trong trường hợp của tôi thư mục dữ liệu trong thư mục script. Bạn chỉ cần thiết lập một đường dẫn tuyệt đối hoặc sử dụng lõi WP để có được thư mục tải lên WP.

Hiệu trưởng là:

  1. tìm một cách để có được hai máy chủ có khả năng nói chuyện với nhau. Tôi đã sử dụng phương pháp tiếp cận máy chủ/máy khách. Bạn có thể thực hiện bộ xử lý HTTP _POST (máy chủ) và trình tạo HTTP _POST (máy khách).

  2. Lưu bản ghi thời gian đồng bộ hóa lần cuối.

  3. Tại các khoảng nhất định, hãy đọc thư mục và ghi lại bất kỳ tệp nào được sửa đổi từ lần đồng bộ hóa cuối cùng.

  4. Gửi danh sách các tệp được cập nhật với dấu thời gian đã sửa đổi của họ sang máy chủ khác.

  5. Nên so sánh danh sách của bạn với hồ sơ của anh ấy và cho bạn biết tệp nào anh ấy không có.

  6. Gửi những tệp đó.

  7. Người nhận sẽ ghi tệp và đặt ngày sửa đổi thành ngày trên máy chủ khác. (điều này quan trọng, để tránh các vòng vô hạn)

Chúc may mắn.

+0

Cảm ơn. Đây là cho một plugin WordPress vì vậy tôi không thể có bất kỳ phụ thuộc không PHP. Bạn có thể giải thích tại sao bạn nghĩ PHP không phù hợp với một nhiệm vụ như vậy? – Tamlyn

+0

Xem phiên bản PHP ở trên. Bạn sẽ có thể bọc nó trong một mô-đun Wordpress. Xin lỗi, ban đầu tôi đã xây dựng nó trong nhiều tập tin. Sau đó tôi có thể quấn tất cả trong một lớp học tốt đẹp. – transilvlad

+0

Chà, làm tốt lắm. Có vẻ như chúng tôi đang làm việc trên [những thứ tương tự] (https://github.com/outlandishideas/sync) cùng lúc. – Tamlyn

0

Đặt cược tốt nhất của bạn là kiểm tra thời điểm tập lệnh được chạy lần cuối và sau đó tải lên thư mục có chức năng 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 
    } 

Nó phải là non-blocking (tốt - việc tải lên máy chủ từ xa), vì vậy nếu bạn không có nhiều tác phẩm để zip nó sẽ ổn thôi để bao gồm trên index page ví dụ. Không có bất kỳ xử lý lỗi nào để bạn có thể muốn thêm nó vào. Nó cũng không xóa bản sao lưu cục bộ, hoặc là bạn có thể muốn xử lý nó.

+0

Anh ấy muốn phản chiếu. Có nghĩa là tất cả các tập tin tồn tại trên cả hai máy chủ (master-master relationship) không được lưu trữ. – transilvlad

Các vấn đề liên quan