2010-06-10 10 views
4

J'essaie de sauvegarder un dossier contenant plusieurs dossiers et fichiers vers un emplacement distant (je téléchargerai des fichiers compressés). Y at-il des scripts existants qui peuvent m'aider, qui vérifie si les fichiers ont été modifiés après la date de la dernière sauvegarde, et ne sauvegarde que les fichiers créés/modifiés après cela?Sauvegardes incrémentales/Sauvegardes versionnées utilisant PHP

La taille actuelle des données est d'environ 1Go, et je me attends d'ajouter 50 Mo-200 Mo par mois

En outre, quelle serait la meilleure façon d'extraire l'état des fichiers à une date précise?

+7

Faut-il être PHP? Avez-vous accès à une ligne de commande Linux ou Windows? Je suis sûr qu'il existe des solutions en PHP pour cela, mais il y en a d'autres, plus flexibles et plus stables dans d'autres langages (comme 'rsync' par exemple). –

+4

'rsync' fonctionnerait certainement mais j'allais suggérer d'utiliser' git', 'mercurial' ou les goûts pour faire le travail. –

+0

@Pekka, je suis spécifiquement à la recherche de solutions basées sur PHP, car cela doit fonctionner sur un hôte partagé.'rsync' est certainement le meilleur pour de telles choses, mais je cherchais quelque chose qui pourrait fonctionner de façon transparente sur des hôtes partagés. – Dogbert

Répondre

1

Je ne pense pas que quelque chose comme ça existe. D'abord, vous aurez besoin d'une fonction récursive pour trouver tous les fichiers dans un répertoire et tous les sous-répertoires. Il y a beaucoup d'exemples pour ce problème. L'idée est d'utiliser le scandir() fonction récursive

Ensuite, pour chaque fichier trouvé, vous devez vérifier si le fichier a été modifié depuis la dernière sauvegarde, et si elle a été modifiée, annonce à la liste des fichiers à sauvegarder. Vous pouvez faire quelque chose comme:

if (filemtime($filename) > $last_backup_time) 
{ 
    $files_to_backup[] = $filename; 
} 

Enfin, pour chaque fichier de sauvegarde, il vous suffit de copie() ou ftp_put() votre archive de fichiers modifiés.

+1

RecursiveDirectoryIterator du SPL est une manière beaucoup plus agréable que les appels récursifs scandir;) http://stackoverflow.com/questions/2418068/php-spl-recursivedirectoryiterator-recursiveiteratoriterator-retrieving-the-full –

+0

Vous pouvez également exécuter rdiff commander pour cela aussi. Voir http://en.wikipedia.org/wiki/Rsync#Variations – redben

2

Je voudrais utiliser Subversion pour cela. Si vous avez un shell sur le système distant, il est facile de le faire avec un travail cron.

Si vous avez un hôte partagé, vous pouvez automatiser ce processus sur sftp/ftp en montant le lecteur distant (peut-être avec un fusible), puis exécuter un svn commit via un travail cron.

2

Vous pouvez appeler/exécuter rsync de php, rsync est une commande qui synchronise les répertoires distants, comme son nom l'indique. La bonne chose à propos de rsync est qu'elle ajoute seulement de nouvelles ressources, n'envoie que des différences sur les ressources mises à jour, et supprime tout ce qui n'est pas dans le répertoire source (si vous le voulez aussi). Notez que vous n'avez pas de sauvegardes incrémentielles. Pour cela, vous devez utiliser un VCS (Git, SVN ou CVS) comme indiqué sur les autres réponses.

est ici a step by step rsync+php tutorial pour l'utiliser à partir de php

0

Au lieu de rsync vous pourriez envisager rdiff-backup. En utilisant les techniques rsync, il est capable de faire des sauvegardes à distance incrémentielles. Git est également possible de le faire, mais l'inconvénient est que vous ne pouvez pas supprimer les éléments incrémentiels plus anciens du dépôt (en raison de la nature de Gits).

Je ne vois pas pourquoi vous écririez votre propre solution, alors que d'autres excellentes solutions existent déjà.