Skip to Content

Dupliquer automatiquement tous les fichiers d’un serveur distant sur un serveur local.

But de ce document

Ce document contient un programme PHP permettant de sauvegarder et dupliquer sur un serveur local l’ensemble des fichiers d’un site distant.

Le but final étant de dupliquer un site sous Spip ou un Wikini ou tout autre programme en PHP+MySQL d’un serveur distant sur un serveur local sans aucune intervention manuelle. Pour cela, j’utilise un autre programme en complément de celui-ci pour sauvegarder la base de données MySQL.

Description des fonctionnalités du programme

Ce programme permet via FTP de sauvegarder toute l’architecture du site et donc de faire une sauvegarde récursive de tous les répertoires.

L’architecture des répertoires distants est reconstituée en local.

Dans le but d’optimiser le temps de téléchargement, le programme ne télécharge les fichiers que ci ceux-ci sont plus récents que les fichiers en local.

Il est possible également d’indiquer une taille maxi des fichiers à télécharger (Par défaut 1024 Ko).

Il est possible également d’indiquer une liste de dossiers à exclure du téléchargement.

Ce programme tient compte de la date de modifications des fichiers et ne télécharge les fichiers que si ceux-ci sont plus récents que les fichiers présents en local.

Le programme

Pour faire fonctionner ce programme, il faut renseigner le nom du serveur, l’utilisateur, le mot de passe, le dossier local de destination, le dossier distant à sauvegarder et la taille maxi des fichiers à télécharger.

Il est possible d’indiquer dans la variable « $Exclure_Dossier » la liste des dossiers à exclure du téléchargement.

Ce programme se lance sur le poste local directement en ligne de commande.

#!/usr/bin/php

<?php

        $Serveur="ftp.coagul.org";

        $Login="MON_LOGIN";

        $MotDePasse="MON-PASS";

       

        $DossierLocal="/var/www/coagul";

        $DossierDistant="html";

        $TailleMaxi=1024; // Taille maxi en Ko à télécharger

       

        //** Liste des dossiers distant à exclure du téléchargement ***

        $Exclure_Dossier=array(

                "html/CACHE");

        //*************************************************************

        echo "Sauvegarde débuté à ".date("G:i:s")."\n\n";

       

        chdir($DossierLocal); //Change le répertoire de destination des fichiers

       

        $Connexion=ftp_connect($Serveur)

                or die ("Serveur $Serveur non disponible ! \n");

       

        ftp_login($Connexion, $Login, $MotDePasse)

                or die ("Utilisateur $Login ou mot de passe inconnu ! \n");

       

        //ftp_chdir($Connexion, $DossierDistant);

        $ftpclose=ftp_close ($Connexion);       

        $ListFich = scan_ftp($Serveur , $Login , $MotDePasse , $DossierDistant , $depth=-1, $TailleMaxi, $Exclure_Dossier);

        //$ftpclose=ftp_close ($Connexion);       

        echo "Sauvegarde terminée à ".date("G:i:s")."\n\n";

       

       

function scan_ftp($host , $login , $pass , $path="/" , $depth=-1, $TailleMaxi, $Exclure_Dossier) {

        //echo "\n\n\n $path \n\n\n";

        if (in_array($path,$Exclure_Dossier)==TRUE) {

                echo "ATTENTION : Dossier $path exclu ! \n";

        }

        else {

               

                if (is_string($host)){

               

                        $conn_id = ftp_connect($host);

                        $login_result = ftp_login($conn_id, $login, $pass);

                        if ((!$conn_id) || (!$login_result)) {

                                echo "Impossible de se connecter à $host sous $login ! \n";

                                return array();

                        }

                }

                else {

                        $conn_id = $host;

                }

               

                $retour = array();

                $fichiers = ftp_rawlist($conn_id, $path);

                foreach($fichiers as $fichier){

               

                        $details = preg_split("/\s+/", $fichier);

                        // si la premiere lettre est un d, c'est un dossier

                        if (substr($details[0],0,1) == "d"){

                                // le nom du fichier est en neuvieme position

                                if ($depth == 0){

                                        $retour[$details[8]] = array("Dossier non scanne");

                                } else {

                                        $DossierDest=$details[8];

                                        echo "\nTraitement du dossier $DossierDest \n";

                                        if (file_exists($DossierDest)==FALSE) mkdir ($DossierDest, 0700);

                                        chdir($DossierDest); //Change le répertoire de destination des fichiers

                                        $retour[$details[8]] = scan_ftp($conn_id, "", "", $path."/".$details[8], $depth -1, $TailleMaxi, $Exclure_Dossier);

                                }

                        } else {

                                $LeFichier=$details[8];

                                $retour[] = $LeFichier;       

                                $TailleFichier=round(ftp_size($conn_id, "$path/$LeFichier")/1024);

                                $DateDistant = ftp_mdtm($conn_id, "$path/$LeFichier");

                               

                                if (file_exists($LeFichier)) $DateLocal=filemtime($LeFichier); else $DateLocal=0;

                                //$TOTO=filemtime($LeFichier);

                                //echo getcwd()." $TOTO \n ";  //Affiche le répertoire en cours

                                //echo "$TOTO \n";

                               

                                if ($DateDistant>$DateLocal) {

                                        if ($TailleFichier<=$TailleMaxi) {

                                                echo "-> $LeFichier ($TailleFichier $Kp) " . date("F d Y H:i:s.", $DateDistant)." <-> ".date("F d Y H:i:s.", $DateLocal)." \n";

                                                ftp_get ($conn_id, "file.tmp", "$path/$LeFichier", FTP_BINARY);

                                                rename("file.tmp", $LeFichier);

                                                touch($LeFichier, $DateDistant); // Permet de changer la date de modification du fichier

                                        }

                                        else {

                                                echo "-> ATTENTION : $LeFichier de $TailleFichier Ko non téléchargé car supérieur à $TailleMaxi Ko \n";

                                        }

                                }

                               

                        }

                }

        }

        chdir("..");

        return $retour;

}       

?>

Modifier les fichiers de configuration des programmes en local

Pour fonctionner, un programme en PHP, a besoins de plusieurs paramètres pour se connecter à la base de données MySQL.

Chaque programme PHP+MySQL dispose donc d’un fichier de configuration spécial qu’il est nécessaire de modifier manuellement au moins lors de la première duplication pour pouvoir fonctionner en local. Normalement, lors des duplications suivantes, cette étape ne sera pas nécessaire, car le fichier local sera plus récent que le fichier distant et ne sera donc pas remplacé par le script de duplication.

SPIP -> ecrire/inc_connect.php3

Pour faire fonctionner Spip en local, il faut supprimer (ou renommer) le fichier « ecrire/inc_connect.php3 » et écrire l’url suivant dans un navigateur et répondre aux questions posées :

http://localhost/Dossier_Du_Site_Spip/ecrire/

Il faut aller ensuite dans « Administration du site » et renseigner la zone « Adresse (URL) du site public »

WIKINI -> wakka.config.php

Pour faire fonctionner un Wikini, il faut modifier manuellement le fichier « wakka.config.php »

PhpMyAdmin -> config.inc.php

Pour faire fonctionner PhpMyAdmin, il faut modifier manuellement le fichier « config.inc.php »

Historique des modifications

Version Date Commentaire
0.1 04/05/05 Création par Tony GALMICHE

Commentaires

> Dupliquer automatiquement tous les fichiers d’un serveur dista

Il semble qu’il y est aussi des problèmes avec les espace dans les nom de dossier dans la fonction :

ftp_rawlist($conn_id, $path) ;

Si quelqu’un peux m’aider....

Merci

> Dupliquer automatiquement tous les fichiers d’un serveur dista

Pour ceu qui sont derrière firewall vous pouvez avoir quelque soucis, mettez donc :

// Activation du mode passif

ftp_pasv($Connexion, true) ;

APrès :

ftp_login($Connexion, $Login, $MotDePasse)

or die ("Utilisateur $Login ou mot de passe inconnu ! \n") ;

> Dupliquer automatiquement tous les fichiers d’un serveur dista

merci Tony ;)

il y avais le login pass du ftp de coagul en brut dans ton script ...