Bonjour a tous.
je me prends la tête avec la fonction zip ....
je souhaiterais avoir une archive de APP mais je n'optiens que celle de var/www/app/
J'ai bien tester le zip -R mais celui ci ne veut pas fonctionner !!!
quand a $rep_to_save = APP_DIR idem aucune sauvegarde.
Je penses que je vais devenir chèvre !
public function backup_app(){
$rep_to_save = ROOT . DS . APP_DIR ;
$zip_file_save = ROOT . DS . "saves" . DS . "app_backups" . DS . date("Y-m-d_H-i-s") . ".zip";
$command = "zip -r $zip_file_save $rep_to_save";
if (exec($command)){
sleep(1);
$this->Session->setFlash("La sauvegarde du site a bien été exécutée.","notif",array('type'=>'alert-success"'));
$this->redirect($this->referer());
} else {
$this->Session->setFlash("La sauvegarde du site n'a pas été exécutée corectement.","notif",array('type'=>'alert-danger"'));
$this->redirect($this->referer());
}
}
Merci d'avance.
PS pour ceux que ça intéresse la fonction pour la base de données de l'appli:
public function backup_bd(){
// Récupération infos BD
App::Import('ConnectionManager');
$ds = ConnectionManager::getDataSource('default');
$dsc = $ds->config;
// Récupération infos BD
$file_mysql = ROOT . DS . "saves" . DS . "mysql_backups" . DS . date("Y-m-d_H-i-s") . ".sql";
// Creation de la sauvegarde MySQL
$command = "mysqldump --host=" . $dsc'host'] . " --user=" . $dsc'login'] . " --password=" . $dsc'password'];
$command .= " --skip-opt --compress --add-locks --create-options --disable-keys --quote-names --quick --extended-insert --complete-insert --default-character-set=latin1 --compatible=mysql40 --result-file=".$file_mysql;
$command .= " " . $dsc'database'];
exec($command);
sleep(1);
$this->Session->setFlash("La sauvegarde MySQL a bien été exécutée.","notif",array('type'=>'alert-success"'));
$this->redirect($this->referer());
}
Qui elle fonctionne très bien !!!
Bon alors les news .... en mode ligne de commande avec zip -r .... RIEN a faire j'ai toujours la structure depuis la racine.
Ayant fouillez un peu partout je suis tomber sur un component fort intéressant .... Et un nettoyer et hop voila le résultat !
Dans le controller :
$rep_to_save = APP ;
$zip_file_save = ROOT . DS . "saves" . DS . "app_backups" . DS . "toto" . "_" . date("U") . ".zip";
$this->Zip->begin($zip_file_save);
if ($this->Zip->addDirectory(APP , "app")){
$this->Session->setFlash("La sauvegarde du site a bien été exécutée.","notif",array('type'=>'alert-success"'));
$this->redirect($this->referer());
} else {
$this->Session->setFlash("La sauvegarde du site n'a pas été exécutée corectement.","notif",array('type'=>'alert-danger"'));
$this->redirect($this->referer());
}
Et la bingo j'ai bien mon archive depuis le répertoire app.
Et maintenant le fameux component (j'ai pas regarder toute les fonctions .....)
<?php
class ZipComponent extends Component {
var $controller;
var $zip;
function __construct(ComponentCollection $collection, $settings = array()){
parent::__construct($collection, $settings);
$this->zip = new ZipArchive();
}
function __destruct(){
}
function __get($function){
return $this->zip->{$function};
}
/*
* @return boolean
*
* @params string, boolean
*
* $path : local path for zip
* $overwrite :
*
* usage :
*/
function begin($path = '', $overwrite = true){
$overwrite = ($overwrite) ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE;
return $this->zip->open($path, $overwrite);
}
function close(){
return $this->zip->close();
}
function end(){
return $this->close();
}
/*
* @return boolean
*
* @params string, string (optional)
*
* $file : file to be included (full path)
* $localFile : name of file in zip, if different
*
*/
function addFile($file, $localFile = null ){
return $this->zip->addFile($file, (is_null($localFile) ? $file : $localFile));
}
/*
* @return boolean
*
* @params string, string
*
* $localFile : name of file in zip
* $contents : contents of file
*
* usage : $this->Zip->addByContents('myTextFile.txt', 'Test text file');
*/
function addByContent($localFile, $contents){
return $this->zip->addFromString($localFile, $contents);
}
/*
* @return boolean
*
* @params string, string
*
*
*/
function addDirectory($directory, $as){
if(substr($directory, -1, 1) != DS){
$directory = $directory.DS;
}
if(substr($as, -1, 1) != DS){
$as = $as.DS;
}
if(is_dir($directory)){
if($handle = opendir($directory)){
while(false !== ($file = readdir($handle))){
if(is_dir($directory.$file.DS)){
if($file != '.' && $file != '..'){
$this->addDirectory($directory.$file.DS, $as.$file.DS);
}
}else{
$this->addFile($directory.$file, $as.$file);
}
}
closedir($handle);
}else{
return false;
}
}else{
return false;
}
return true;
}
function addDir($directory, $as){
$this->addDirectory($directory, $as);
}
/*
* @return boolean
*
* @params mixed
*
* $mixed : undo changes to an archive by index(int), name(string), all ('all' | '*' | blank)
*
* usage : $this->Zip->undo(1);
* $this->Zip->undo('myText.txt');
* $this->Zip->undo('*');
*
* $this->Zip->undo('myText.txt, myText1.txt');
* $this->Zip->undo(array(1, 'myText.txt'));
*/
function undo($mixed = '*'){
if(is_array($mixed)){
foreach($mixed as $value){
$constant = is_string($value) ? 'Name' : 'Index';
if(!$this->zip->unchange{$constant}($value)){
return false;
}
}
}else{
$mixed = explode(',', $mixed);
if(in_array($mixed[0], array('*', 'all'))){
if(!$this->zip->unchangeAll()){
return false;
}
}else{
foreach($mixed as $name){
if(!$this->zip->unchangeName($name)){
return false;
}
}
}
}
return true;
}
/*
* @return boolean
*
* @params mixed, string (optional)
*
*
*/
function rename($old, $new = null){
if(is_array($old)){
foreach($old as $cur => $new){
$constant = is_string($cur) ? 'Name' : 'Index';
if(!$this->zip->rename{$constant}($ur, $new)){
return false;
}
}
}else{
$constant = is_string($old) ? 'Name' : 'Index';
if(!$this->zip->rename{$constant}($old, $new)){
return false;
}
}
return true;
}
/*
* @return index, name or FALSE
*
* @params mixed, mixed (FL_NODIR, FL_NOCASE)
*
*/
function find($mixed, $options = 0){
if(is_string($mixed)){
return $this->zip->locatename($mixed, $options);
}else{
return $this->zip->getNameIndex($mixed);
}
}
/*
* @return boolean
*
* @params mixed
*
* $mixed : undo changes to an archive by index(int), name(string), all ('all' | '*' | blank)
*
*/
function delete($mixed){
if(is_array($mixed)){
foreach($mixed as $value){
$constant = is_string($value) ? 'Name' : 'Index';
if(!$this->zip->delete{$constant}($value)){
return false;
}
}
}else{
$mixed = explode(',', $mixed);
foreach($mixed as $value){
$constant = is_string($value) ? 'Name' : 'Index';
if(!$this->zip->delete{$constant}($value)){
return false;
}
}
}
}
/*
* @return boolean
*
* @params mixed, string
*
* $mixed : comment by index(int), name(string), entire archive ('archive')
*/
function comment($mixed = 'archive', $comment){
if(is_array($mixed)){
//unsupported currently
}else{
if(low($mixed) === 'archive'){
return $this->zip->setArchiveComment($comment);
}else{
$constant = is_string($mixed) ? 'Name' : 'Index';
return $this->zip->setComment{$constant}($comment);
}
}
}
function stats($mixed){
$constant = is_string($mixed) ? 'Name' : 'Index';
return $this->zip->stat{$constant}();
}
/*
* @return boolean
*
* @params string, mixed
*
* $entries : single name or array of names to extract, null to extract all
*
*/
function extract($location, $entries = null){
return $this->zip->extract($location, $entries);
}
function unzip($location, $entries = null){
$this->extract($location, $entries);
}
}
Merci a ceux qui m'ont aidé sur ce coup là !
Si t'es sous Windows, tu ne pourras pas utiliser la commande "zip -r". De plus, il me semble que même sous linux, elle ne fonctionne pas.
Essaies plutôt avec l'objet zip de PHP.
Zip
Si si elle fonctionne bien sous Debian.
Juste le truc c'est que ca me zip depuis la racine ....
Je vais regarder la fonction objet Zip de PHP
T'as essayé avec la variable globale APP ?
Donc :
public function backup_app(){
$rep_to_save = APP ;
$zip_file_save = ROOT . DS . "saves" . DS . "app_backups" . DS . date("Y-m-d_H-i-s") . ".zip";
$command = "zip -r $zip_file_save $rep_to_save";
if (exec($command)){
sleep(1);
$this->Session->setFlash("La sauvegarde du site a bien été exécutée.","notif",array('type'=>'alert-success"'));
$this->redirect($this->referer());
} else {
$this->Session->setFlash("La sauvegarde du site n'a pas été exécutée corectement.","notif",array('type'=>'alert-danger"'));
$this->redirect($this->referer());
}
}
Ou simplement ajouter un DS en fin de ligne :
public function backup_app(){
$rep_to_save = ROOT . DS . APP_DIR . DS ;
$zip_file_save = ROOT . DS . "saves" . DS . "app_backups" . DS . date("Y-m-d_H-i-s") . ".zip";
$command = "zip -r $zip_file_save $rep_to_save";
if (exec($command)){
sleep(1);
$this->Session->setFlash("La sauvegarde du site a bien été exécutée.","notif",array('type'=>'alert-success"'));
$this->redirect($this->referer());
} else {
$this->Session->setFlash("La sauvegarde du site n'a pas été exécutée corectement.","notif",array('type'=>'alert-danger"'));
$this->redirect($this->referer());
}
}
Alors dans les 2 cas je zip toujours avec var/www/toto/app/ dans l'arborescence de l'archive. (toto étant le répertoire du site).
Alors que je voudrait avoir juste "APP" et ses sous répertoires dans l'archive.
Bon après c'est plus pour faciliter en cas de restauration du répertoire APP.
J'ai aussi le cron qui fonctionne mais qui me donne le même résultat. c'est a dire mon var/www/toto dans l'archive.
C'est pour ça que je commence a devenir chèvre !
Ton cron point vers ton script en PHP ou vers un bash exécutable ?
Car si c'est par le script PHP, le problème vient de là...
Les fonctions "cakephp" sont accessible depuis le back-office.
Pour le CRON c'est un fichier php différent mais construit sur la même base.
$host = 'xxx';
$db_name = 'xxx';
$user = 'xxx';
$password = 'xxx';
$repsite = "/var/www/toto/";
$repsauvegarde = $repsite . "saves/";
$file_app = date("w");
$file_mysql = $repsauvegarde . "mysql_backups/" . date("w") . ".sql";
if(file_exists($file_mysql)){
unlink($file_mysql);
}
// Creation de la sauvegarde MySQL
$command = "mysqldump --host=" . $host . " --user=" . $user . " --password=" . $password;
$command .= " --skip-opt --compress --add-locks --create-options --disable-keys --quote-names --quick --extended-insert --complete-insert --default-character-set=latin1 --compatible=mysql40 --result-file=".$file_mysql;
$command .= " ".$db_name;
exec($command);
// Création de la sauvegarde APP
$zip_file_save = $repsauvegarde . "app_backups/" . date("w") . ".zip";
if(file_exists($zip_file_save)){
unlink($zip_file_save);
}
$rep_to_save = $repsite . 'app';
$command = "zip -r $zip_file_save $rep_to_save";
exec($command);
Dans les 2 cas cela fonctionne très bien sauf mon histoire de chemin racine dans l'archive.
A mon avis ça doit venir de la syntaxe de zip -r ....
Je viens de tester et je crois pouvoir régler ton problème côté Cron, pas sûr que ça marche avec le back-office
Pour régler le problème, je crois que tu vas devoir mettre le script PHP à la racine de ton application (/var/www/toto).
Point de vue Cron (Tous les dimanches à minuit, à toi de régler) :
0 0 * * 0 cd /var/www/toto ; php backup.php
Point de vue script :
$host = 'xxx';
$db_name = 'xxx';
$user = 'xxx';
$password = 'xxx';
$repsauvegarde = "./saves/";
$file_app = date("w");
$file_mysql = $repsauvegarde . "mysql_backups/" . $file_app . ".sql";
if(file_exists($file_mysql)){
unlink($file_mysql);
}
// Creation de la sauvegarde MySQL
$command = "mysqldump --host=" . $host . " --user=" . $user . " --password=" . $password;
$command .= " --skip-opt --compress --add-locks --create-options --disable-keys --quote-names --quick --extended-insert --complete-insert --default-character-set=latin1 --compatible=mysql40 --result-file=".$file_mysql;
$command .= " ".$db_name;
exec($command);
// Création de la sauvegarde APP
$zip_file_save = $repsauvegarde . "app_backups/" . date("w") . ".zip";
if(file_exists($zip_file_save)){
unlink($zip_file_save);
}
$command = "zip -r $zip_file_save app";
exec($command);
Le problème vient du fait que tu ne te trouves pas dans le dossier où se situe ton application.
Quand tu es dedans, il n'y a plus le problème des dossiers parents.
Edit : Je viens de réfléchir, tu peux aussi créer un fichier exécutable pour lancer le script depuis le back office :
Tu créé un script "backup" (par exemple) que tu places, par exemple dans /home/toto
#!/bin/sh
cd /var/www/toto;
php backup.php
Tu le rends exécutable : chmod +x backup
Puis, côté back office :
public function backup(){
$command = "./home/toto/backup";
if (exec($command)){
sleep(1);
$this->Session->setFlash("La sauvegarde du site et de la base de donnée a bien été exécutée.","notif",array('type'=>'alert-success"'));
$this->redirect($this->referer());
} else {
$this->Session->setFlash("La sauvegarde du site et de la base de donnée n'a pas été exécutée corectement.","notif",array('type'=>'alert-danger"'));
$this->redirect($this->referer());
}
}
Et ça devrait marcher
A toi de changer ce qui ne te plait pas.