Fopen et

[Résolu]
Signaler
Messages postés
233
Date d'inscription
jeudi 30 septembre 2004
Statut
Membre
Dernière intervention
26 juin 2011
-
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
-
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

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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à ;)
Messages postés
233
Date d'inscription
jeudi 30 septembre 2004
Statut
Membre
Dernière intervention
26 juin 2011
2
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 ?
Messages postés
233
Date d'inscription
jeudi 30 septembre 2004
Statut
Membre
Dernière intervention
26 juin 2011
2
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.
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
18
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é
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
18
$backup_name = "backup_".date('m_d_Y').".sql";
je devrais me relire ... excuses
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
@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à ;)
Messages postés
233
Date d'inscription
jeudi 30 septembre 2004
Statut
Membre
Dernière intervention
26 juin 2011
2
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
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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à ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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à ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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à ;)