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;
- 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.
- 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.
- 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.
- Acesse o script e insira a url de download da pasta que foi compactada no servidor de origem.
Problemas conhecidos com transferências HTTP;
- Arquivos muito grandes, na casa dos Gb, podem não ser trasnferidos pois o PHP poderá encerrar o tempo de execução do script.
- 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).
- 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:password@ftp.domain.com/'.$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:password@ftp.domain.com/'.$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);
?>