Bonjour, comme j'ai un peu galéré pour mettre en place une backup auto sur mon site j'ai décidé de faire ce petit tuto
Pourquoi ? parce que backuper à la main un site complet en le copiant en ftp c'est très vite très peu pratique, surtout si on n'y pense quasiment jamais, qu'il y a des répertoires à exclure (gros fichiers par exemple), qu'il y a beaucoup de répertoires et de fichiers, etc.
Le but ici est de générer une archive zippée à intervales réguliers sans aucune intervention humaine. Il ne reste plus qu'à télécharger l'archive ensuite, ou alors, on peut même automatiser cette étape si la configuration du serveur le permet et qu'on a un autre serveur pour y envoyer les backups
L'intérêt de l'archive est que ça ne fait qu'un seul fichier à télécharger, certes gros, mais un seul fichier. Au final comme il est compressé et comme il n'y a pas à attendre entre chaque initialisation du transfert de chaque fichier comme pour la copie fichier par fichier c'est bien plus rapide pour le télécharger.
Donc voyons comment générer un zip en php : il existe plusieurs librairies, la seule que j'ai trouvé qui soit relativement simple et légère est PclZip --> http://www.phpconcept.net/pclzip/
Pour l'utiliser c'est très simple : http://biduleohm.free.fr/images_forums/brigole/cron_backup/backup.php.html (à cause de la coloration syntaxique il ne faut ne pas enregistrer et renommer le fichier mais faire un ctrl+a suivi d'un ctrl+v dans un nouveau fichier php) je pense que c'est assez clair et correctement commenté
Il faut bien-sûr modifier certaines variables pour l'adapter à votre config. Par ailleurs un petit problème s'est posé quand j'ai utilisé pour la première fois la lib : elle n'exclue pas automatiquement le répertoire où le zip est généré donc à chaque nouvelle backup elle prenait aussi les précédents zips... j'ai dû modifier légèrement la classe pclzip pour y ajouter une exclusion de répertoire mais de toute façon j'avais quelques autres répertoires à exclure à cause de leur contenu très lourd. La version modifiée se trouve ici (attention, le fichier est très lourd à cause de la coloration syntaxique, ne pas l'ouvrir avec un navigateur en carton) http://biduleohm.free.fr/images_forums/brigole/cron_backup/pclzip.lib.php.html la liste des répertoires à exclure se trouve à la ligne 195 du fichier.
Certains vont se demander c'est quoi le bloc de if douteux tout en bas... la fonction mail est assez capricieuse (en fait elle l'est extrêmement avec ses paramètres...) et quelques fois le mail n'est pas envoyé. Si c'est le cas on le détecte et on relance la fonction, là y'a 3 essais ce qui devrait amplement suffir (si après 3 tentatives elle échoue encore c'est pas la peine de s'acharner...) alors oui j'aurais pu faire une boucle mais c'est un peu overkill pour maximum 3 itérations et une seule 90% du temps...
Bon, on a de quoi zipper notre site, c'est cool mais il faut lancer le fichier à la main... comment faire pour automatiser tout ça ?
D'habitude on utilise un cron qui, grosso-modo, sert à exécuter un script périodiquement (par exemple tous les jours à 3H exécute-moi toto.php) oui mais étant sur un serveur free.fr je n'ai pas de cron disponible. La solution qui m'est venue à l'esprit est d'utiliser les visites des personnes pour déclencher le cron, le problème c'est que le temps de génération du zip est d'environ 20 à 30 secondes... donc j'ai cherché sur le net et j'ai trouvé un script juste génial --> http://a32.me/2012/01/do-php-cron-without-cron-available/ :D
Le problème c'est que ma config actuelle ne permettait pas de faire ça facilement et je n'avais pas envie de me lancer dans de grosses modifs de choses qui marchent déjà niquel, donc retour case départ. Bon le visiteur n'est pas content si la page se load pendant 20 sec mais les bots d'indexation, eux ils s'en foutent en principe. Quelques tests plus tard et effectivement ils s'en foutent (il se peut toutefois que du coup l'indexation de cette page soit mal prise en compte, je n'en sais rien mais perso je m'en fou un peu, c'est pas grave comparé au service que ça me rend) \0/
J'ai donc pondu ce script --> http://biduleohm.free.fr/images_forums/brigole/cron_backup/cron.php.html qui permet de lancer le cron à chaque visite de bot ou de soi-même (ce qui déchargera un peu les bots) le but est de regarder les dates des zips et de voir si le plus récent est assez vieux pour lancer une nouvelle backup
Si vous modifiez le path ou le nom de l'archive dans le backup.php pensez à faire correspondre le cron.php. Là encore rien de miraculeux. Le cron.php doit être inclus sur toutes les pages, ou au moins l'accueil, pour pouvoir être déclenché par les visites.
Le délai est fixé à 5 jours mais il est à noter que les backups seront éloignées d'un peu plus que ce temps là vu qu'il n'y a pas un bot toute les minutes qui passe sur les sites... on peut compenser en réduisant un peu le temps si on veut.
J'en profite pour détailler un peu le "lock.txt" dans le backup.php --> il sert à éviter de lancer plusieurs fois simultanément le script de backup, ce qui serait à tous les coups le cas avec les bots car en général ils arrivent et scannent tout un répertoire d'un coup. C'est exactement le même principe que les mutex quand on fait du multithreadé, ça évite d'accéder à la même ressource de deux endroits différents (ce qui amènerait à des résultats aléatoires, dans le meilleur des cas...)
Par ailleurs il faut créer ce fichier la première fois en écrivant unlocked dedans sans aucun saut de ligne.
Pour info j'ai testé ces scripts depuis une semaine en les améliorant un peu chaque jour et je pense qu'ils sont niquels (toutefois pas parfaits, notamment les paths en relatif qu'il faudrait passer en absolu, mais la flemme...). J'ai remarqué qu'il y avait en moyenne une visite de bot toutes les 3 heures ce qui permet une cadence assez soutenue au niveau du cron quand même. Il faut voir aussi qu'à la base les bots ne sont pas fait pour ça donc évitez de potentiellement détruire le référencement de votre site en mettant un délai trop court dans le cron, je pense que 2-3 jours est le minimum et une semaine me parait parfait
Pensez à mettre un .htaccess qui interdit l'accès au répertoire du script et à celui des backups sinon vous risquez d'avoir quelques suprises si quelqu'un trouve le répertoire.
Si vous avez des questions, n'hésitez pas