Note: I'm migrating from gonzalo123.com to here. When I finish I'll swap the DNS to here. The "official" blog will be always gonzalo123.com

      Building a FTP client library with PHP

      In my daily work I need to connect very often to FTP servers. Put files, read, list and things like that. I normally use the standard PHP functions for Ftp it’s pretty straight forward to use them. Just enable it within our installation (--enable-ftp) and it’s ready to use them. But last Sunday it was raining again and I start with this simple library.

      Lets connect to a FTP server, switch to passive mode, put a file from one real file stored in our local filesystem and delete it.

      use FtpLib\Ftp,
          FtpLib\File;
       
      list($host, $user, $pass) = include __DIR__ . "/credentials.php";
       
      $ftp = new Ftp($host, $user, $pass);
      $ftp->connect();
      $ftp->setPasv();
       
      $file = $ftp->putFileFromPath(__DIR__ . '/fixtures/foo');
      echo $file->getName();
      echo $file->getContent();
      $file->delete();
      

      Now the same, but without a real file. We are going to create the file on-the-fly from one string:

      use FtpLib\Ftp,
          FtpLib\File;
       
      list($host, $user, $pass) = include __DIR__ . "/credentials.php";
       
      $ftp = new Ftp($host, $user, $pass);
      $ftp->connect();
      $ftp->setPasv();
       
      $file = $ftp->putFileFromString('bar', 'bla, bla, bla');
      echo $file->getName();
      echo $file->getContent();
      $file->delete();
      

      We also can create directories, change the working directory and delete folders in the FTP server with a fluent interface (I love fluent interfaces, indeed):

      $ftp->mkdir('directory')
        ->chdir('directory')
        ->putFileFromString('newFile', 'bla, bla')
        ->delete();
       
      $ftp->rmdir('directory');
      

      And finally we can iterate files in the FTP (I must admit that this feature was the main purpose of the library)

      $ftp->getFiles(function (File $file) use ($ftp) {
          switch($file->getName()) {
              case 'file1':
                  $file->delete();
                  break;
              case 'file2':
                  $ftp->mkdir('backup')->chdir('backup')->putFileFromString($file->getName(), $file->getContent());
                  break;
          }
      });
      

      And that’s all. You can find the library in github and you also can use it with composer.

      "gonzalo123/ftplib": "dev-master"
      

      You can also see usage examples within the unit tests

      comments powered by Disqus