Ads

Imagine que você precisa migrar ou transferir dados de um servidor para outro. O cenário ideial seria fazer a migração usando um prompt SSH, mas sabemos que a maioria das hospedagens compartilhadas não oferecem este recurso e são poucos os que sabem lidar com comandos Linux em um túnel SSH.

A segunda opção mais lógica, é fazer o download dos arquivos que estão no servidor de origem para o seu computador e depois, usando um cliente FTP, e depois enviar para o servidor de origem. Mas isso pode tomar muito tempo dependendo do tamanho do arquivo e principalmente se a sua conexão não for tão rápida ou se tiver limitações no uso.

O curl() é uma função na linguagem de programação PHP que permite transferir dados entre servidores usando diversos protocolos de rede, como HTTP, HTTPS, FTP, FTPS, IMAP, POP3, SMTP e outros. Essa função oferece uma maneira versátil e poderosa de interagir com outros sistemas e APIs, além de baixar arquivos da internet.

Transferindo arquivos entre servidores com Curl() e HTTP

Uma forma muito simples de resolver isso é utilizar a função curl() do php para fazer a transferência. Você pode usar o curl() para realizar transferências de arquivos tanto por requisições HTTP ou conectá-lo diretamente no servidor FTP do servidor de origem, ou do servidor de destino.

O script a seguir cria um formulário muito simples aonde você apenas informa a url aonde o arquivo a ser transferido foi disponibilizado e ele fará o downlad diretamente no servidor de destino utilizando um requisição HTTP.

<?php
   set_time_limit(0);
   $fp = fopen ('wordpress.zip', 'w+');
   $url = $_GET['url']; // endereço da web que está o WP Compactado a ser migrado
   $ch = curl_init(str_replace(" ","%20",$url));
   curl_setopt($ch, CURLOPT_TIMEOUT, 999);
   curl_setopt($ch, CURLOPT_FILE, $fp);
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
   $data = curl_exec($ch);
   curl_close($ch);
?>

<form method="post">
 <label>Informe a URL do arquivo a ser migrado (pasta compactada do WordPress)</label>
 <input type="Text" name="url">
</form>

Como utilizar o script de transterência de arquivos entre servidores?

Seu uso é muito simples;

  1. No servidor de origem, compacte em uma pasta todos os arquivos que deseja transferir. A maioria dos serviços de hospedagem permite você compactar pastas no gerenciador de arquivos do painel da hospedagem.
  2. No servidor de destino (para onde os arquivos serão migrados), certifique-se se ele oferece um domínio acessível na web, muitas hospedagens oferecem endereços e domínios temporários para usar em testes e aplicações.
  3. Acesse, por FTP ou painel da hospedagem, o gerenciador de arquivos e suba o script para uma pasta acessível, normalmente a pasta será public_html, www ou httdocs.
  4. Acesse o script e insira a url de download da pasta que foi compactada no servidor de origem.

Problemas conhecidos com transferências HTTP;

  1. Arquivos muito grandes, na casa dos Gb, podem não ser trasnferidos pois o PHP poderá encerrar o tempo de execução do script.
  2. O servidor poderá ficar com overload e ficar lento. Não tente refazer a transferência enquanto o servidor ainda estiver processando a requisição, apenas aguarde o servidor finalizar a transferência. Tente refazer a transferência somente se o servidor retornar erro 503 (Serviço indisponível).
  3. Se você não tiver sucesso, você poderá adaptar o script para fazer a transferência a partir de uma conexão FTP ao invés de HTTP utilizando como base as opções de código a seguir;

Transferindo arquivos entre servidores com Curl() e FTP

Upload: Opção de Transferência executando o script no servidor de origem:

<?php

   $ch = curl_init();
   $localfile = '/path/to/file.zip';
   $remotefile = 'filename.zip';
   $fp = fopen($localfile, 'r');
   curl_setopt($ch, CURLOPT_URL, 'ftp://ftp_login:[email protected]/'.$remotefile);
   curl_setopt($ch, CURLOPT_UPLOAD, 1);
   curl_setopt($ch, CURLOPT_INFILE, $fp);
   curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
   curl_exec ($ch);
   $error_no = curl_errno($ch);
   curl_close ($ch);
   if ($error_no == 0) {
       $error = 'File uploaded succesfully.';
   } else {
       $error = 'File upload error.';
   }
?>

Download: Opção de Transferência executando o script no servidor de destino

<?php

   $ch = curl_init();
   $remotefile = 'filename.zip';
   $localfile = '/path/to/localfile.zip';
   $fp = fopen($localfile, 'w+');

   curl_setopt($ch, CURLOPT_URL, 'ftp://ftp_login:[email protected]/'.$remotefile);
   curl_setopt($ch, CURLOPT_UPLOAD, 0);
   curl_setopt($ch, CURLOPT_INFILE, $fp);
   curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));

   $result = curl_exec($ch);

   if ($result === false) {
     $error = curl_error($ch);
     echo "Erro ao baixar o arquivo: " . $error;
   } else {
     echo "Arquivo baixado com sucesso!";
   }

   curl_close($ch);
   fclose($fp);
?>
Ads

Anderson Oliveira

Anderson Oliveira é desenvolvedor, escritor e docente no CEETPS - Centro Estadual de Educação Tecnologia de São Paulo. Atualmente trabalha na Administração Central do CPS e leciona aulas de programação na Etec Prof. Carmine Biagio Tundisi de Atibaia.