2013-01-19 73 views
1

我想實時和自動地將我的本地主機(Windows)與我的遠程服務器同步。所以當我修改,創建或刪除一個文件時,這個工具應該自動更新遠程服務器。這個應用必須保持兩個服務器實時同步。請我真的需要你的幫助。我試過FTPbox,但它並不總是更新,我需要更好的。我正在研究Windows,但是如果存在一些在Linux上更好。通過ftp將我的本地主機與我的服務器同步

感謝

+0

如果你會做自動同步,你也會自動部署錯誤......不確定關於Windows - 但你可以使用[* cron *](http://www.adminschoice.com/crontab-quick -reference)在linux中安排一些東西運行,比如每分鐘。您可以將它與使用[* rsync *](http://rsync.samba.org/documentation.html)的shell腳本一起使用 – alfasin

回答

0

我假設你想同步數據庫和文件。這是我的出路,我希望這會對某人有所幫助。

第一個代碼是本地代碼,另一個代碼是遠程代碼。

//make sure you are connected to your local database 

<?php 

//function to check internet connection. 

function is_connected() { 
    if($connected = fsockopen("www.example.com", 80)){ 
    // website, port (try 80 or 443) 
    if ($connected){ 
    $is_conn = true; //action when connected 
    fclose($connected); 
    } 

return $is_conn; 

} else { 
    $is_conn = false; //action in connection failure 
    } 
} 

//if connected to internet, do the following... 
if(is_connected()== true){ 

    echo "connected"; 

    ini_set('max_execution_time', 3000);//increase this incase of slow internet 

$table_name = TableName::find_all(); 
//whatever way you find an array 
//of all your entries on this particular 
//table that you want to sync with the remote table. 

$file = 'to_upload_local.php'; //a local file to put table contents into 
$current = serialize($table_name);//serialize the table contents (google). 
file_put_contents($file, $current);//put the serialized contents to the file. 

$remote_file = 'public_html/to_upload_remote.php';//this is the file that is on the remote server that you want to overwrite with the local file to upload. 

$ftp_server = "ftp.yourwebsite.org";// your ftp address 

// set up basic connection 
$conn_id = ftp_connect($ftp_server); 

// login with username and password 
$login_result = ftp_login($conn_id, "yourFTPUsername", "yourFTPPassword"); 

// turn passive mode on 
ftp_pasv($conn_id, true); 

// upload a file 
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)){ 
    echo "Upload Successful"; 
} else { 

} 

// close the connection 
ftp_close($conn_id); 

//this script called below is to update your remote database. Its in the next example 

$call_script = file_get_contents('http://path_to_your_script'); 
} else { 
//if not connected to internet,.... 
echo "offline"; 
} 
?> 

在線腳本應該做的工作,應該是這個樣子(你在前面的代碼的最後一行稱爲一個):

//make sure you're connected to remote database 
<?php 

//this function should compare num_rows of your two 
//databases values (local remote) and return the 
//difference. It's used with array_udiff function. 
function compare_objects($obj_a, $obj_b) { 
    return $obj_a->id - $obj_b->id; 
} 
//this function should compare contents of your two 
//databases values (local remote) and return the 
//difference. It's used with array_udiff function. 
function comparison($obj_a, $obj_b){ 
    if ($obj_a==$obj_b){ 
    return 0; 
    }else{ 
    return -1; 
    } 
} 


$file = '../to_upload_remote.php';//the uploaded file 
$current = file_get_contents($file);//load the file 
$array = unserialize($current);//unserialize to get the object array 
$remote_table_name = remote_table_name::find_all();//get what you have in 
//remote database 

//if a new value is added, create a new entry to database with new vals 
if($try_new = array_udiff($array, $remote_table_name, 'compare_objects')){ 
    foreach($try_new as $entry){ 
    $remote_table_name = new remote_table_name(); 
    $remote_table_name->value = $entry->value; 
    //depending on the number of your columns, 
    //add values to remote table that were not there before. 
    //you can use any other suitable method to do this. 
     if($remote_table_name->save()){ 
      echo "the remote_table_name was saved successfully"; 
     } 
    } 
} else { 
    echo "same number of rows"; 
} 

//if some values are changed, update them with new vals 
if($try_change = array_udiff($array, $remote_table_name, 'comparison')){ 
    foreach($try_change as $entry){ 
    $remote_table_name = remote_table_name::find_by_id($entry->id); 
    $remote_table_name->value = $entry->value; 
    //depending on the number of your columns, 
    //update values to remote table. 
    //you can use any other suitable method to do this. 
    if($remote_table_name->save()){ 
     echo "the remote_table_name was saved successfully"; 
    } 
    } 
} else { 
    echo "All values match"; 
} 

?> 

所以,任何時候,第一個代碼它讀取本地表,獲取所有值並將它們放入本地文件,上傳本地文件並替換遠程文件夾中的一個,調用遠程腳本來檢查未序列化的本地表並將其與在線表進行比較,然後做必要的。

相關問題