2012-05-09 15 views
5

के साथ बहुत सी छोटी फाइलें मेरे पास एक ही लैन पर 2 लिनक्स सर्वर हैं।
पीएचपी का उपयोग करते हुए मैं सर्वर बीनेटवर्क स्थानांतरण के लिए तेज़ तरीका PHP

को 100000 छोटे (10KB) सर्वर एक से फ़ाइलों की प्रतिलिपि की जरूरत है अब मैं ssh2_scp_send और उसके बहुत धीमी गति से (20 मिनट में 10K फ़ाइलें) का उपयोग कर रहा हूँ।

इसे तेज़ी से कैसे बनाया जाए?

+2

उन्हें संग्रह और फिर कॉपी .. – Vytautas

+0

उन्होंने स्पष्ट रूप से 'का उपयोग PHP' कहा। – Manuel

+0

यह एक संभावित लेकिन अधिक जटिल समाधान है। –

उत्तर

0

आप PHP के माध्यम से बाहरी प्रक्रिया पर अमल कर सकते हैं? आप कर सकते हैं, तो rsync प्रतिलिपि

0

एक अन्य विकल्प करने के लिए पिन होगा तेज़ तरीका है:

<?php 
$zip = new ZipArchive(); 

if ($zip->open('TempFileToTransfer.zip', ZIPARCHIVE::CREATE)!==TRUE) { 
    exit("cannot open <$filename>\n"); 
} 

$zip->addFile('File 1'); 
$zip->addFile('File 2'); 
$zip->addFile('File 3'); 
$zip->close(); 
?> 

स्थानांतरण कि एक फ़ाइल और दूसरे छोर पर विस्तारित, और अन्य पर zip_entry_open और zip_entry_read का उपयोग करें।

मैं यह भी कहना है की मात्रा में सुझाव देंगे एक समय में 1000 फाइलों?

0

यह संभावना छोटे फ़ाइलों के बहुत सारे भेजने की भूमि के ऊपर है मंदी यहाँ है।

आप अपने स्थानीय सर्वर पर संग्रहीत कर सकता है, shell_exec()

, दूरस्थ सर्वर पर भेज ssh2_scp_send()

तो दूसरे छोर पर यह विस्तार। ssh2_exec()

मेरी भावना यह है कि संग्रह/विस्तार का ओवरहेड कम होगा, लेकिन मैंने इसका परीक्षण नहीं किया है।

4

एक SSH सुरंग के माध्यम से Gzipped टीएआर का उपयोग करते हुए तेज़ है। शुद्ध scp से अधिक तेज़ी से मैग्नीट्यूड्स, विशेष रूप से कई छोटी फ़ाइलों के संबंध में। यहाँ linux कमांड लाइन के लिए एक उदाहरण है:

उपयोगकर्ता @ स्थानीय # सीडी/स्रोत /; टैर सीजीएफ - * | ssh उपयोगकर्ता @ दूरस्थ "सीडी/लक्ष्य /; टार xzf -"


अद्यतन: अनुरोध अनुसार, यहाँ आप एक शुद्ध पीएचपी समाधान के साथ जाना - यह मुश्किल सा बाहर नगण्य कुछ मज़ा था।

ध्यान दें: आप इस के लिए काम करने के लिए PHPs libssh extension की जरूरत है। इसके अलावा, एसएसडीआईएन केवल एसएसएच के लिए स्ट्रीम रैपर का उपयोग करते समय उपलब्ध है।

यह है लगभग कोई भूमि के ऊपर है, क्योंकि यह धाराओं पर सीधे काम कर रहा है और अपने CPU सबसे अधिक संभावना हमेशा नेटवर्क लिंक आप हस्तांतरण के लिए उपयोग कर रहे हैं की तुलना में तेजी है।

नेटवर्क बनाम सीपीयू गति के व्यापार के लिए, आप कमांड लाइन से -z विकल्प को हटा सकते हैं। (कम CPU उपयोग, लेकिन तार पर और अधिक डेटा)

कोड उदाहरण:

<?php 
$local_cmd = "cd /tmp/source && tar -czf - *"; 
$remote_cmd = "tar -C /tmp/target -xzf -"; 

$ssh = new SSH_Connection('localhost'); 
$auth = $ssh->auth_password('gast', 'gast'); 
$bytes = $ssh->command_pipe($local_cmd, $remote_cmd); 
echo "finished: $bytes bytes of data transfered\n"; 

class SSH_Connection { 
    private $link; 
    private $auth; 

    function __construct ($host, $port=22) { 
     $this->link = @ssh2_connect('localhost', 22); 
    } 

    function auth_password ($username, $password) { 
     if (!is_resource($this->link)) 
      return false; 
     $this->auth = @ssh2_auth_password($this->link, $username, $password); 
     return $this->auth; 
    } 

    function command_pipe ($localcmd, $remotecmd) { 
     if (!is_resource($this->link) || !$this->auth) 
      return false; 
     // open remote command stream (STDIN) 
     $remote_stream = fopen("ssh2.exec://{$this->link}/$remotecmd", 'rw'); 
     if (!is_resource($remote_stream)) 
      return false; 
     // open local command stream (STDOUT) 
     $local_stream = popen($localcmd, 'r'); 
     if (!is_resource($local_stream)) 
      return false; 
     // connect both, pipe data from local to remote 
     $bytes = 0; 
     while (!feof($local_stream)) 
      $bytes += fwrite($remote_stream,fread($local_stream,8192)); 
     // close streams 
     fclose($local_stream); 
     fclose($remote_stream); 
     return $bytes; 
    } 

    function is_connected() { return is_resource($this->link); } 
    function is_authenticated() { return $this->auth; } 
} 
संबंधित मुद्दे