2013-05-08 6 views
6

में रिमोट सर्वर से मिरर फ़ोल्डर मैं एक मशीन पर एक फ़ोल्डर को दूसरे फ़ोल्डर में सिंक में रखना चाहता हूं। यह एक वर्डप्रेस परिनियोजन प्लगइन के लिए है, इसलिए मैं मशीन पर मौजूद rsync या अन्य आदेशों पर भरोसा नहीं कर सकता। PHP और एक वेब सर्वर दोनों मशीनों पर उपलब्ध होगा और आदर्श रूप से यह HTTP पर काम करेगा।शुद्ध PHP

मेरी वर्तमान सोच यह है कि अनुरोध मशीन अन्य संशोधित तिथियों के साथ दूसरी फ़ाइल पर एक स्क्रिप्ट के लिए स्थानीय फ़ाइल सूची पोस्ट करती है। दूसरी मशीन इसकी फाइलों के साथ तुलना करती है और संशोधित फ़ाइलों के साथ प्रतिक्रिया देती है - या तो फ़ाइलों की एक सूची व्यक्तिगत रूप से या प्रतिक्रिया में उल्लिखित बदली गई फ़ाइलों के साथ।

यदि कोई मौजूद है, तो मैं मौजूदा समाधान का उपयोग करूंगा। कोई विचार?

+0

प्रोटोकॉल आप फ़ाइलों को हस्तांतरण करने का उपयोग करना चाहते क्या है? एफ़टीपी? ssh? दूसरों? आप HTTP के बारे में बात कर रहे हैं, लेकिन अगर आप रिमोट सर्वर से '.php' फ़ाइल बैकअप करना चाहते हैं तो उदाहरण के लिए आपको परेशानी होगी। –

+0

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

+0

और यहां एक और +1। – transilvlad

उत्तर

8

मैं इस लागू करने के लिए कक्षाओं का एक सरल सेट बना लिया है 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 में मैं इसे कारणों के समूह के लिए अनुशंसा नहीं करता।

मेरे पास बिल्कुल एक पाइथन ऐप के रूप में आपको क्या चाहिए।

इस एप्लिकेशन को एक सेवा के रूप में चलाने के लिए बनाया गया है, तो आप बस इसे शुरू करने और इसे :) के बारे में भूल

ऐप: https://gist.github.com/8f62786582c6933395eb

शेल: https://gist.github.com/e08a99937c6f5deac4ab

नोट: खोल फ़ाइल बुलाया जाना चाहिए fsyncd fsyncd.sh नहीं :)

ऊपर की PHP संस्करण:

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

नोट: आपको इसे दोनों साइटों पर चलाना होगा और प्रत्येक को कनेक्ट करने के लिए प्रत्येक को कॉन्फ़िगर करना होगा और उन्हें क्रॉन द्वारा निष्पादित करने के लिए सेट करना होगा। पसंदीदा रूप से WP crons द्वारा नहीं।

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

मेरे मामले में डेटा फ़ोल्डर स्क्रिप्ट फ़ोल्डर में है:

मैं निर्देशिका के लिए पथ समन्वयित यहाँ परिभाषित किया जाएगा है। WP अपलोड डीआईआर प्राप्त करने के लिए आपको बस एक पूर्ण पथ सेट करना चाहिए या WP कोर का उपयोग करना चाहिए।

प्रमुख है:

  1. दो सर्वर एक दूसरे से बात करने में सक्षम होने के लिए एक रास्ता खोजने। मैंने सॉकेट सर्वर/क्लाइंट दृष्टिकोण का उपयोग किया। आप एक HTTP _POST प्रोसेसर (सर्वर) और एक HTTP _POST निर्माता (क्लाइंट) कर सकते हैं।

  2. अंतिम सिंक समय का रिकॉर्ड रखें।

  3. कुछ अंतराल पर अंतिम सिंक समय से संशोधित किसी भी फाइल को रिकॉर्ड और रिकॉर्ड करने के लिए फ़ोल्डर पढ़ें।

  4. अन्य संशोधित टाइमस्टैम्प के साथ अन्य सर्वर पर अपडेट की जाने वाली फ़ाइलों की सूची भेजें।

  5. इसे अपनी सूची की तुलना अपने रिकॉर्ड में करनी चाहिए और आपको बताएं कि उसके पास कौन सी फाइलें नहीं हैं।

  6. उन फ़ाइलों को भेजें।

  7. रिसीवर फाइलें लिखेंगे और संशोधित दिनांक को दूसरे सर्वर पर सेट करेगा। (यह महत्वपूर्ण है, अनंत लूप से बचने के लिए)

शुभकामनाएं।

+0

धन्यवाद। यह एक वर्डप्रेस प्लगइन के लिए है, इसलिए मेरे पास कोई गैर-PHP निर्भरता नहीं हो सकती है। क्या आप इस बात का विस्तार कर सकते हैं कि ऐसा क्यों लगता है कि PHP इस तरह के कार्य के लिए उपयुक्त नहीं है? – Tamlyn

+0

ऊपर PHP संस्करण देखें। आप इसे वर्डप्रेस मॉड्यूल में लपेटने में सक्षम होना चाहिए। गड़बड़ क्षमा करें, मैंने शुरुआत में इसे कई फाइलों में बनाया था। बाद में मैं इसे सब एक अच्छी कक्षा में लपेट सकता हूं। – transilvlad

+0

वाह, अच्छा काम। ऐसा लगता है कि हम एक ही समय में [सुंदर समान चीजें] (https://github.com/outlandishideas/sync) पर काम कर रहे थे। – Tamlyn

0

आपकी सर्वश्रेष्ठ शर्त यह जांच रही है कि स्क्रिप्ट अंतिम बार कब चल रही थी और फिर ftp_* फ़ंक्शंस के साथ फ़ोल्डर अपलोड कर रहा था। , इसलिए यदि आप ज़िप करने यह उदाहरण के लिए index page पर शामिल करने के लिए ठीक हो जाओगे कई फाइलों की जरूरत नहीं है -

<?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 
    } 

यह (दूरस्थ सर्वर से अपलोड अच्छी तरह से) गैर अवरुद्ध होना चाहिए। कोई त्रुटि प्रबंधन नहीं है, इसलिए आप इसे जोड़ना चाहेंगे। यह स्थानीय बैकअप को भी हटा नहीं देता है, या तो आप इसे संभालना चाहते हैं। https://github.com/outlandishideas/sync

सर्वर, उदा पर:

+0

वह दर्पण करना चाहता है। सभी सर्वरों (मास्टर-मास्टर रिलेशनशिप) पर मौजूद सभी फाइलों का अर्थ संग्रहित नहीं है। – transilvlad