Synchroniser des fichiers locaux avec un serveur sftp en php

Comment mettre à jour uniquement les fichiers modifiés d'un répertoire local sur un serveur sftp (ssh ftp)?

15 juin 2015

Introduction

Nous avons développé une librairie php nommée php-sync-sftp permettant de mettre à jour les fichiers modifiés localement avec ceux hébergés sur un serveur sftp (ftp crypté).

Cette librairie compare les dates des fichiers entre le poste client et le serveur sftp, , et va automatiquement supprimer, créer, ou mettre à jour les plus récents.

La librairie ne compare pas le contenu en utilisant par exemple un code CRC, mais uniquement la date, elle peut donc mettre à jour un fichier dont la date de modification a changé alors que son contenu est identique.

Nous l'avons utilisé pour synchroniser les modifications de ce blog et de notre projet lyon.glicer.com avec le serveur web distant.

Pré-requis

PHP ou Hypertext Preprocessor doit être installé, php est un langage de programmation libre principalement utilisé dans le développement internet.

Composer est un gestionnaire libre de dépendances pour php, il permet de déclarer et d'installer automatiquement des librairies tierces.

Installation de composer

Exécuter dans un invité, la ligne de commande ci-dessous :

php -r "readfile('https://getcomposer.org/installer');" | php

Cela affiche :

#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: C:\tmp\composer.phar
Use it: php composer.phar

Un fichier composer.phar est maintenant présent dans le répertoire courant.

Configurer le fichier composer.json

Créer un fichier composer.json dans le répertoire courant contenant :

{
    "require": {
        "glicer/sync-sftp": "dev-master"
    },
    "prefer-stable": true,
    "minimum-stability": "dev"
}

Installation des librairies

À partir du même répertoire que composer.json, exécuter dans un invité, la ligne de commande ci-dessous :

php composer.phar install

Cela affiche :

Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing phpseclib/phpseclib (dev-master 7077313)
    Cloning 707731305b7fde53716df5a841850e9a9746e52f

  - Installing symfony/finder (v2.3.30)
    Loading from cache

  - Installing glicer/sync-sftp (dev-master 6a3d638)
    Cloning 6a3d638642f2c54b7d6fdfaaf9b1f55ecf2d9f51

Writing lock file
Generating autoload files

Structure du répertoire

Le répertoire courant contient les fichiers ci-dessous :

composer.json
composer.phar
composer.lock
vendor
 ├───composer
 ├───glicer
 │   └───sync-sftp
 ├───phpseclib
 └───symfony

Exemple d'utilisation de la librairie php-sync-sftp

 <?php
 require 'vendor/autoload.php';

 use GlSyncFtp\GlSyncFtp;

 // initialiser les informations de connexions au serveur sftp
 // adresse du serveur, nom d'utilisateur et mot de passe
 $ftp = new GlSyncFtp("192.168.0.1", "username", "password");

 // lancer la synchronisation
 $ftp->syncDirectory(
    "/home/user/localDirectory",     //répertoire local
    "/host/web/remoteDirectory",    //répertoire distant
            function ($op, $nbr, $path) {  //fonction appelée à chaque opération effectuée côté sftp serveur
                    //$op : définit l'opération effectuée (création répertoire, suppression, etc...)
                    //$nbr : numéro incrémenté pour chaque opération
                    //$path : contient le chemin du fichier côté serveur
                    switch ($op) {
                            case GlSyncFtp::CREATE_DIR:
                                echo "Create Directory : ";
                                break;
                            case GlSyncFtp::DELETE_DIR:
                                echo "Delete Directory : ";
                                break;
                            case GlSyncFtp::DELETE_FILE:
                                echo "Delete File : ";
                                break;
                            case GlSyncFtp::UPDATE_FILE:
                                echo "Update File : ";
                                break;
                            case GlSyncFtp::NEW_FILE:
                                echo "New File : ";
                                break;
                            default:
                        }
                        echo $nbr . " - " . $path . "\n";
            }
    );

Versions des logiciels et langages utilisés