Classe FTP no PHP 5

Recentemente precisei criar um script para que copiasse o conteudo de um diretorio de um site(portal de noticias) para meu site hospedado em outro local,sendo que logo em seguida, esse conteudo teria que ser deletado do diretorio do portal. Pesquisando as novas funções de FTP do PHP 5, criei a seguinte classe que me foi muito util, rodando em linha de comando(para evitar timeout), chegou a ficar 15 minutos copiando quase 900 arquivos e em seguida deletando-os. Basta configurar com o ftp de onde você ira copiar os arquivos, o diretorio de origem e destino e rodar o script.

  1. < ?
  2. //class para ultilizar ftp
  3. class ftp {
  4.     private $ftp_server = 'ip';
  5.     public $login_ftp = 'user';
  6.     public $pass_ftp = 'senha';
  7.     public $id_ftp;
  8.     private $ftp_port = 21;
  9.     public $ftp_time = 90;
  10.     public $ftp_contents;
  11.     public $login_result;
  12.     public $ftp_dir;
  13.     public $copy;
  14.     //public $local_file = "arquivo do meu site";
  15.     //public $server_file = "arquivo do portal";
  16.     public $delete_file;
  17.  
  18.     public function __construct() {
  19.         $this->id_ftp = ftp_connect($this->ftp_server,$this->ftp_port,$this->ftp_time) or die("Nao conectou ao ftp");
  20.         if ($this->id_ftp) {
  21.             //echo("sucesso<hr />");
  22.             $this->setLogin();
  23.         }
  24.     }
  25.     public function setLogin(){
  26.         $this->login_result = ftp_login($this->id_ftp, $this->login_ftp, $this->pass_ftp);
  27.         if($this->login_result){
  28.             $this->getlistFiles();
  29.         }
  30.     }
  31.     public function getlistFiles(){
  32.         $this->ftp_dir = ftp_chdir($this->id_ftp, "diretorio do portal");//coloque o diretorio de origem dos arquivos
  33.         $this->ftp_contents = ftp_nlist($this->id_ftp,".");
  34.         if ($this->ftp_contents) {
  35.             echo("<pre>");
  36.             //print_r($this->ftp_contents);
  37.             echo("</pre><pre>");
  38.             $this->copyFiles();
  39.         }
  40.     }
  41.     public function copyFiles(){
  42.         for($i=0;$i<count ($this->ftp_contents);$i++){
  43.             $this->copy = ftp_nb_get($this->id_ftp, "diretorio de destino dos arquivos".$this->ftp_contents[$i], $this->ftp_contents[$i], FTP_BINARY);
  44.             while ($this->copy == FTP_MOREDATA) {
  45.                 echo ".";
  46.                 $this->copy = ftp_nb_continue($this->id_ftp);
  47.             }
  48.             if ($this->copy != FTP_FINISHED) {
  49.                 echo "There was an error downloading the file...";
  50.             }else{
  51.                 $this->delete_file = ftp_delete($this->id_ftp, $this->ftp_contents[$i]);
  52.                 if($this->delete_file){
  53.                     echo("File deleting");
  54.                 }
  55.             }
  56.         }
  57.     }
  58.     public function __destruct(){
  59.         ftp_close($this->id_ftp);
  60.     }
  61. }
  62. $teste = new ftp();
  63. ?>

Funções FTP do PHP
http://www.php.net/manual/pt_BR/ref.ftp.php

PHP, Principal

8 comments


  1. A classe ficou muito boa mesmo, matou nossos problemas, e rodando em linha de comando acabamos com problemas de timeout no servidor.

    Com um poquinho de abstração da pra tornar ela totalmente flexivel e usar em inúmeras situações. Parabens!

  2. Fernando

    Olá…

    Gostaria de inserir um Bco de dados no meu site mas naum sei como… poderia me dar uma mão?

    Thanks

  3. Tiago Floriano

    Oi Leonardo! Tenho uma dúvida aqui:

    //public $local_file = “arquivo do meu site”;
    //public $server_file = “arquivo do portal”;
    public $delete_file;

    Nas duas primeiras linhas, posso dizer qual diretório quero copiar ou somente arquivos? Como digo o que é? Assim: /public_html/pasta/ ??

    E por ultimo, se eu não quiser deletar os arquivos que vou copiar, é só comentar a 3ª linha?

    Abração!

  4. Ola,
    pode dizer somente o diretorio sim e para não deletar basta retirar ou comentar o seguinte trecho:
    else{
    $this->delete_file = ftp_delete($this->id_ftp, $this->ftp_contents[$i]);
    if($this->delete_file){
    echo(“File deleting”);
    }
    }

  5. vc

    Ola,
    Tenho uma duvida, nao se puderá tar relacionado com este seu código FTP.

    Mas imagine, quero fazer um upload por web interface de uma directoria em que essa directoria tem 10 imagens (no disco do meu computador).

    E para nao sobrecarregar o servidor http enviar por FTP, tem alguma ideia disso?

    Obg 🙂

  6. vc pode configurar o pc como um servidor de FTP e usar o código sem problemas 😉

  7. eu não entendi uma coisa o ip login e senha coloco do site atual ou do site que vai receber os arquivos?

  8. é do site que vai receber os arquivos

Leave a Reply