Pessoal,
Boa tarde.

Esse recurso do PHP já é conhecido por muita gente, mas se não for o caso, vou tentar ajudar quem ainda não conhece esse poderoso recurso do PHP, que é a integração com servidores utilizando o protocolo FTP, que nos permite transferir arquivos entre servidores.

Conectando no servidor

public function conectarFTP()
{

    $servidor = 'ftp.servidor.com.br'; // Endereço
    $usuario = 'usuario_ftp'; // Usuário
    $senha = 'senha_ftp'; // Senha
    $porta = 21; // Porta padrão
    $timeout = 9000; // Tempo em segundos para encerrar a conexão caso não haja resposta


    $ftp = ftp_connect( $servidor, $porta, $timeout ); // Retorno: true ou false
    if ( !$ftp )
    {
        return false;
    }


    $login = ftp_login( $ftp, $usuario, $senha ); // Retorno: true ou false
    if ( !$login )
    {
        return false;
    }


    return $ftp;

}

Enviando arquivos

public function enviarArquivosPorFTP( $strArquivoLocal, $strArquivoRemoto )
{

    $ftp = $this->conectarFTP();
    if ( !is_resource( $ftp ) )
    {
        return false;
    }


    if ( !is_file( $strArquivoLocal ) )
    {
        echo "<br/>Arquivo de origem '{$strArquivoLocal}' não existe!";
        return false;
    }


    // Alterna o modo de conexão para PASSIVO. No modo passivo, as conexões de dados são iniciadas pelo cliente, ao invés do servidor. Pode ser necessário se o cliente estiver atrás de um firewall.
    ftp_pasv( $ftp, true );

    
    // Faz o upload do arquivo no modo BINÁRIO (Deve ser FTP_ASCII ou FTP_BINARY.)
    $envio = ftp_put( $ftp, $strArquivoRemoto, $strArquivoLocal, FTP_BINARY ); // Retorno: true / false


    if ( $envio )
    {
        echo "<br/>Arquivo '{$strArquivoLocal}' enviado para o FTP como '{$strArquivoRemoto}'!";
    }
    else
    {
        echo "<br/>Falha ao enviar o arquivo {$strArquivoLocal} para o FTP!";
        
        ftp_close( $ftp ); // Fecha a conexão com o FTP
        return false;
    }


    ftp_close( $ftp ); // Fecha a conexão com o FTP


    return true;


}

Baixando arquivos

public function baixarArquivosPorFTP( $strArquivoRemoto, $strArquivoLocal )
{

    $ftp = $this->conectarFTP();
    if ( !is_resource( $ftp ) )
    {
        return false;
    }


    // Alterna o modo de conexão para PASSIVO. No modo passivo, as conexões de dados são iniciadas pelo cliente, ao invés do servidor. Pode ser necessário se o cliente estiver atrás de um firewall.
    ftp_pasv( $ftp, true );

    
    // Faz o download do arquivo no modo BINÁRIO (Deve ser FTP_ASCII ou FTP_BINARY.)
    $download = ftp_get( $ftp, $strArquivoLocal, $strArquivoRemoto, FTP_BINARY ); // Retorno: true / false


    if ( $download )
    {
        echo "<br/>Arquivo '{$strArquivoRemoto}' baixado com sucesso do FTP para '{$strArquivoLocal}'";
    }
    else
    {
        echo "<br/>Falha ao baixar o arquivo {$strArquivoRemoto} do FTP!";
        
        ftp_close( $ftp ); // Fecha a conexão com o FTP
        return false;
    }


    ftp_close( $ftp ); // Fecha a conexão com o FTP


    return true;


}

Listando arquivos

public function listarArquivosPorFTP( $strDiretorio, $strBusca )
{

    $ftp = $this->conectarFTP();
    if ( !is_resource( $ftp ) )
    {
        return false;
    }


    // Alterna o modo de conexão para PASSIVO. No modo passivo, as conexões de dados são iniciadas pelo cliente, ao invés do servidor. Pode ser necessário se o cliente estiver atrás de um firewall.
    ftp_pasv( $ftp, true );


    // Altera o diretório atual para "/arquivos/fotos/"
    ftp_chdir($ftp, "/arquivos/fotos/");
    

    // Lista os arquivos na forma de array()
    $arquivos = ftp_nlist($ftp, ".");
    
    
    ftp_close( $ftp ); // Fecha a conexão com o FTP


    return $arquivos;


}

Ainda temos a função ftp_rawlist para listar os arquivos no FTP de forma detalhada, exibindo permissões, datas, etc..

Exemplo:

$saida = ftp_rawlist($ftp, '/');
var_dump($saida);

O exemplo acima irá exibir algo como isso:

array(3) {
  [0]=>
  string(65) "drwxr-x---   3 vincent  vincent      4096 Jul 12 12:16 public_ftp"
  [1]=>
  string(66) "drwxr-x---  15 vincent  vincent      4096 Nov  3 21:31 public_html"
  [2]=>
  string(73) "lrwxrwxrwx   1 vincent  vincent        11 Jul 12 12:16 www -> public_html"
}

E é isso! Até a próxima, pessoal!