1. Go to this page and download the library: Download verseles/flyclone library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
verseles / flyclone example snippets
use Verseles\Flyclone\Rclone;
$obscuredPassword = Rclone::obscure('your-sftp-password');
// This $obscuredPassword can then be used in the provider configuration.
Rclone::setBIN('/path/to/your/rclone_binary');
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
use Verseles\Flyclone\Providers\S3Provider;
// Operations on a single local disk
$localDisk = new LocalProvider('myLocalDisk');
$rcloneLocal = new Rclone($localDisk);
// Operations between local disk and an S3 bucket
$s3Bucket = new S3Provider('myS3Remote', [
'region' => 'us-east-1',
'access_key_id' => 'YOUR_ACCESS_KEY',
'secret_access_key' => 'YOUR_SECRET_KEY',
// 'endpoint' => 'https://your.minio.server' // For S3-compatible like MinIO
]);
$rcloneS3Transfer = new Rclone($localDisk, $s3Bucket); // $localDisk is source, $s3Bucket is destination
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
use Verseles\Flyclone\Providers\S3Provider;
// Example 1: List local files
$local = new LocalProvider('homeDir');
$rclone = new Rclone($local);
$files = $rclone->ls('/home/user/documents'); // Path on the 'homeDir' remote
/*
$files will be an array of objects, e.g.:
[
(object) [
"Path" => "report.docx",
"Name" => "report.docx",
"Size" => 12345,
"MimeType" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"ModTime" => 1678886400, // Unix timestamp
"IsDir" => false
],
(object) [
"Path" => "archive",
"Name" => "archive",
"Size" => -1, // Typically -1 for directories with rclone lsjson
"MimeType" => "inode/directory",
"ModTime" => 1678886500,
"IsDir" => true
]
]
*/
var_dump($files);
// Example 2: List files from an S3 bucket
$s3 = new S3Provider('myS3', [ /* S3 config */ ]);
$rcloneS3 = new Rclone($s3);
$s3Files = $rcloneS3->ls('my-bucket-name/path/to/folder');
var_dump($s3Files);
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\SFtpProvider;
$sftp = new SFtpProvider('mySFTP', [
'host' => 'sftp.example.com',
'user' => 'user',
'pass' => Rclone::obscure('password')
]);
$rclone = new Rclone($sftp);
$rclone->mkdir('/remote/path/new_directory'); // Creates 'new_directory' on SFTP server
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
use Verseles\Flyclone\Providers\S3Provider;
$local = new LocalProvider('myDisk');
$s3 = new S3Provider('myS3', [ /* S3 config */ ]);
$rclone = new Rclone($local, $s3); // local is source, S3 is destination
// Copy a local directory to S3
// Copies contents of /local/data to s3://my-bucket/backups/data
$rclone->copy('/local/data', 'my-bucket/backups/data');
// Copy a single local file to S3 with a specific name
// Copies /local/file.txt to s3://my-bucket/target/renamed.txt
$rclone->copyto('/local/file.txt', 'my-bucket/target/renamed.txt');
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
$localDisk = new LocalProvider('myDisk');
$rclone = new Rclone($localDisk); // Operations on the same local disk
// Move a file to another location on the same disk (effectively renaming)
$rclone->moveto('/old/path/file.txt', '/new/path/renamed_file.txt');
// To move between different remotes:
$sftp = new SFtpProvider('mySFTP', [ /* config */ ]);
$rcloneTransfer = new Rclone($localDisk, $sftp); // Local to SFTP
$rcloneTransfer->move('/local/source_folder', '/remote_sftp/destination_folder');
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
use Verseles\Flyclone\Providers\SFtpProvider;
$local = new LocalProvider('myDocs');
$sftpBackup = new SFtpProvider('sftpBackup', [ /* config */ ]);
$rclone = new Rclone($local, $sftpBackup); // Sync from local to SFTP
// Make SFTP /backup/documents identical to local /user/documents
// Only transfers changed files, deletes files on SFTP not present locally.
$rclone->sync('/user/documents', '/backup/documents');
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\S3Provider;
$s3 = new S3Provider('myS3', [ /* config */ ]);
$rclone = new Rclone($s3);
// Delete a single file
$rclone->deletefile('my-bucket/path/to/file.txt');
// Delete all *.log files in a directory (respects filters)
$rclone->delete('my-bucket/logs/', ['
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
$local = new LocalProvider('myDisk');
$rclone = new Rclone($local);
$fileExists = $rclone->is_file('/path/to/some/file.txt');
if ($fileExists->exists) {
echo "File exists. Size: " . $fileExists->details->Size;
}
$dirExists = $rclone->is_dir('/path/to/some/directory');
if ($dirExists->exists) {
echo "Directory exists.";
}
/*
$fileExists / $dirExists object structure:
(object) [
'exists' => true, // or false
'details' => (object) [...], // rclone lsjson item details if exists, or empty array []
'error' => '' // or Exception object if ls failed
]
*/
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
$local = new LocalProvider('myDisk');
$rclone = new Rclone($local);
$content = $rclone->cat('/path/to/config.ini');
echo $content;
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\SFtpProvider;
$sftp = new SFtpProvider('mySFTP', [ /* config */ ]);
$rclone = new Rclone($sftp);
$newContent = "Hello from Flyclone!";
$rclone->rcat('/remote/path/newfile.txt', $newContent);
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\S3Provider;
$s3 = new S3Provider('myS3', [ /* config */ ]);
$rclone = new Rclone($s3);
$sizeInfo = $rclone->size('my-bucket/some_folder');
/*
$sizeInfo will be an object, e.g.:
(object) [
"count" => 150,
"bytes" => 1073741824 // 1 GiB
]
*/
echo "Total files: {$sizeInfo->count}, Total bytes: {$sizeInfo->bytes}";
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\S3Provider;
$s3 = new S3Provider('myS3', [ /* S3 config */ ]);
$rclone = new Rclone($s3); // $s3 is the destination for uploads
// Uploads /tmp/local_file.zip to s3://my-bucket/uploads/local_file.zip
// The local file /tmp/local_file.zip is removed after successful upload (uses rclone moveto).
$rclone->upload_file('/tmp/local_file.zip', 'my-bucket/uploads/local_file.zip');
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\SFtpProvider;
$sftp = new SFtpProvider('mySFTP', [ /* config */ ]);
$rclone = new Rclone($sftp); // $sftp is the source for downloads
// Download from SFTP to a specific local path
$localPath = $rclone->download_to_local('/remote/path/on_sftp/document.pdf', '/home/user/downloads/document.pdf');
if ($localPath) {
echo "Downloaded to: " . $localPath;
}
// Download to a temporary directory (filename preserved)
$tempPath = $rclone->download_to_local('/remote/path/on_sftp/image.jpg');
if ($tempPath) {
echo "Downloaded to temporary location: " . $tempPath;
// Remember to unlink($tempPath) and rmdir(dirname($tempPath)) when done if temporary.
}
use Verseles\Flyclone\Rclone;
use Verseles\Flyclone\Providers\LocalProvider;
use Verseles\Flyclone\Providers\DropboxProvider; // Example with Dropbox
$local = new LocalProvider('myLocal');
$dropbox = new DropboxProvider('myDropbox', [
'client_id' => 'YOUR_DROPBOX_CLIENT_ID',
'client_secret' => 'YOUR_DROPBOX_CLIENT_SECRET',
'token' => 'YOUR_DROPBOX_TOKEN', // Get this via rclone config
]);
$rclone = new Rclone($local, $dropbox);
$sourceFile = '/path/to/large_local_file.zip';
$destinationPath = '/dropbox_folder/'; // Directory on Dropbox
$rclone->copy($sourceFile, $destinationPath, [], static function ($type, $buffer) use ($rclone) {
// $type is \Symfony\Component\Process\Process::OUT or \Symfony\Component\Process\Process::ERR
// $buffer contains the raw rclone progress line
if ($type === \Symfony\Component\Process\Process::OUT && !empty(trim($buffer))) {
$progress = $rclone->getProgress(); // Get structured progress object
/*
$progress might look like:
(object) [
'raw' => '1.234 GiB / 2.000 GiB, 61%, 12.345 MiB/s, ETA 1m2s (xfr#1/1)',
'dataSent' => '1.234 GiB',
'dataTotal' => '2.000 GiB',
'sent' => 61, // Percentage
'speed' => '12.345 MiB/s',
'eta' => '1m2s',
'xfr' => '1/1' // Files being transferred / total files in this batch
]
*/
printf(
"\rProgress: %d%% (%s / %s) at %s, ETA: %s, Files: %s",
$progress->sent,
$progress->dataSent,
$progress->dataTotal,
$progress->speed,
$progress->eta,
$progress->xfr
);
}
});
echo "\nCopy complete!\n";