Fopen et

Résolu
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 - 30 oct. 2010 à 13:29
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 1 nov. 2010 à 14:27
Bonjour à tous :)

M'étant m'y récemment au PHP j'ai voulu créer une petite automatisation de backup de base données (journalier).

Voici mon code :
$db_host =  "**";
$db_user = "**";
$db_pass = "**";
$db_name = "**";
$backup_name = "backup_".date(l).".sql";

system("mysqldump --host="".$db_host."" --user="".$db_user."" --password="".$db_pass."" ".$db_name." > ".$backup_name);
system("gzip ".$backup_name);
$backup_name = $backup_name.".gz";

$open = fopen($backup_name,'a+');
fwrite($open, $backup_name);
fclose($open);

Le fichier backup_Saturday.sql.gz est bien créé mais lors du samedi suivant un backup_Saturday.sql apparait....
Je pense que ça vient de l'utilisation du mode de fopen. Mais j'en ai essayé plusieurs et a+ est celui qui me convient le plus.

Comment faire en sorte que le fichier backup_Saturday.sql ne soit pas automatiquement créé.
Merci de vos réponses =)



J'ai bien essayé en ajoutant ceci mais je n'ai pas réussi à le faire fonctionner ^^ :
[b]$backup_name = strstr($backup_name, '.gz', true);
unlink($backup_name);/b

10 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
30 oct. 2010 à 20:04
Salut,

Tu as fait une erreur de syntaxe à la ligne 3 de ton message :
M'étant mis récemment au PHP

Pour concaténer plus proprement et améliorer la lisibilité, tu peux utiliser sprintf :
$command = sprintf('mysqldump --host="%s" --user="%s" --password="%s" %s > %s', $db_host, $db_db_user, $db_pass, $db_name, $backup_name);
system($command);


$backup_name $backup_name.".gz";

>
$backup_name .= ".gz";



Bon concernant ton problème...
Tu ne peux pas empêcher le fichier .sql d'être créé, puisque c'est lui qui contient le backup produit par mysqldump. Par contre, si je comprends bien, lors de la première sauvegarde, le fichier backup_Saturday.sql est gzippé en backup_Saturday.sql.gz et seul ce fichier reste. Lors de la deuxième sauvegarde, le fichier .sql est toujours présent à la fin de l'opération... Est-ce que, lors de la deuxième sauvegarde, le fichier .sql.gz correspond bien à la bonne version de la sauvegarde ? As-tu regardé son contenu pour être sûr que ce n'est pas la première sauvegarde ?

Mais qu'est-ce que tu veux faire avec ce code ???
$open = fopen($backup_name,'a+');
fwrite($open, $backup_name);
fclose($open);

Concrètement, tu ouvres le fichier de backup créé (le .sql.gz) et tu écris dedans, en fin de fichier le son nom, ce qui a pour conséquence de rendre le fichier archive invalide (mauvais format, ce n'est plus un gzip).
C'est vraiment ça que tu veux faire ?

J'ai un peu de mal à comprendre où tu veux en venir avec ça...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
3
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 5
1 nov. 2010 à 12:07
Ha oui, mince ! Merci pour la correction.
Donc j'ai bien un .gz qui se créé mais pas de .sql à la première exécution. Aux suivantes oui...

Concernant le nommage indiqué par Code57 et bien j'ai bien un nouveau fichier qui se créé chaque jour.
Mon but est d'avoir un fichier par jour de la semaine et donc la semaine suivante de renouveler ces sauvegardes.
Mais je commence à penser que je vais dans un premier temps supprimer le fichier GZ existant et exécuter le backup.
Ainsi, le SQL ne sera pas créé et je serai sûr que le le GZ soit la nouvelle version.

$backup_name = "backup_".date(l).".sql";
unlink($backup_name.".gz");
//$backup_name = "backup_".date('m_d_Y').".sql"; 

$command = sprintf('mysqldump --host="%s" --user="%s" --password="%s" %s > %s', $db_host, $db_user, $db_pass, $db_name, $backup_name);
system($command);
system("gzip ".$backup_name);
$backup_name .= ".gz";

Tout est correct à votre avis ?
3
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 5
31 oct. 2010 à 17:49
salut neigedhiver, merci pour ta réponse.

Pour commencer :
$command = sprintf('mysqldump --host="%s" --user="%s" --password="%s" %s > %s', $db_host, $db_db_user, $db_pass, $db_name, $backup_name);
system($command);
$backup_name .= ".gz";

C'est bien plus rapide à exécuter mais me donne un fichier .sql vide... (le .gz aussi du coup).

MAIS ça me créé bien un .sql dès la première exécution. Vide, certes.
J'ai vérifié, lors des exécutions suivantes le .gz était bien mis à jour.


J'ai compris mon erreur pour le fopen, fwrite, fclose. Je recommencerai plus promis
Pour la suppression du fichier .sql j'ai mis le nom en .sql dans une variable et un unlink, ça c'est bouclé.



Donc concrètement comment puis-je utiliser ton code mais d'une façon.... que ça marche quoi ^^
Merci.
0
cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
31 oct. 2010 à 21:03
salut


$backup_name = "backup_".date(m_d_Y).".sql";


//w+ force la creation d'un fichier

$open = fopen($backup_name,'w+');
fwrite($open, $backup_name);
fclose($open);



puis tu peux aussi copier ton fichier dans un répertoire
annexe avec la fonction copy() pour plus de securité
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
31 oct. 2010 à 21:07
$backup_name = "backup_".date('m_d_Y').".sql";
je devrais me relire ... excuses
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
31 oct. 2010 à 22:01
@Cod57 : Pffffffffff là, tu continues d'écrire le nom du fichier dans le fichier... Tu n'as pas lu la réponse que j'ai faite précédemment.

@JackNumber : Le code que je t'ai fourni fait strictement la même chose que le tiens, sauf que la chaîne de caractères représentant la commande shell est plus lisible. J'ai juste fait une erreur (d'inattention) sur $db_user que j'ai écrit $db_db_user.

Est-ce que tu as essayé en nommant ton fichier comme l'indique Cod57, c'est à dire avec la date complète au lieu du nom du jour ? L'idée est de créer un fichier portant un nom qui n'est pas déjà utilisé.

J'avoue que j'ai un peu de mal à comprendre le problème...
Est-ce que tu peux poster ton code mis à jour avec ton histoire de fopen() corrigée ?

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 5
1 nov. 2010 à 00:50
Sans la faute de frappe ça fonctionne = )
Mais maintenant le .gz n'est plus créé, avec
backup_name .= ".gz";
comme avec
$backup_name = $backup_name.".gz";...


J'ai enlevé le fopen qui ne servait plus à rien en vérité. Enfin je crois qui ne servait plus à rien....

$db_host = "***";
$db_user = "***";
$db_pass = "***";
$db_name = "***";
$backup_name = "backup_".date(l).".sql";

$command = sprintf('mysqldump --host="%s" --user="%s" --password="%s" %s > %s', $db_host, $db_user, $db_pass, $db_name, $backup_name);
system($command);
//$sql_a_delete = $backup_name;
$backup_name .= ".gz";

//unlink($sql_a_delete);


Merci de votre aide =D
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
1 nov. 2010 à 00:55
Tu n'as pas répondu à la question :
Est-ce que tu as essayé en nommant ton fichier comme l'indique Cod57, c'est à dire avec la date complète au lieu du nom du jour ?


La réponse m'intéresse ^^

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
1 nov. 2010 à 00:56
Le .gz n'est plus créé, parce que tu as enlevé la ligne qui le créait ;)

system("gzip ".$backup_name);


--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
1 nov. 2010 à 14:27
Ben a priori, ça devrait aller, même si la dernière ligne ne sert à rien.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0