compresser un repertoire (BZIP ou GZIP)

Eléphant du PHP | 254 Messages

21 mars 2006, 18:18

je me demande comment compresser directement un repertoire avec PHP sans etre obligé de gerer fichier par fichier a l'interieur de l'archive ...
le gros probleme c'est que j'ai pas loin de 100000 fichiers a compresser et ensuite a envoyer sur un serveur distant et a decompresser sur ce serveur
:?
donc je me vois mal utiliser la soluce de la classe d'archive perso.

une idée ?
linux peut etre de la partie :)

merci

Mammouth du PHP | 983 Messages

21 mars 2006, 20:26

Tu as le droit d'exécuter des commandes sur le serveur? Genre tar par exemple?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

21 mars 2006, 22:03

À tout hasard, comment transfères-tu ces fichiers et pourquoi les archives-tu ?

Par exemple, si le transfert s'effectue par FTP tu pourrais probablement activer la compression de données et les uploader directement. Ça prendrait un petit peu plus de temps, mais guère plus que l'archivage/désarchivage.

Eléphant du PHP | 254 Messages

22 mars 2006, 00:14

-le serveur de destination est tres bouclé niveau sécu par contre j'ai le controle total du serveur de depart sur lequel les fichiers sont crées.
je ne suis pas certain pour le tar, je vais demander.

-il faut une archive pour que le transfert des 100000 fichiers ne dure pas pres de 18h (d'apres un test) ... avec ca ne va pas durer plus de 50mn.
l'archive permet aussi de contourner le probleme des noms de repertoires qui utilisent des caracteres japonais/arabe/hindie/.... le transfert par FTP detruit completement ces noms ou bloque dessus :!:
donc l'archive est obligatoire !
la connexion SSH n'est pas dispo, donc juste une connexion FTP ...

-la compression auto des données pour le transfert FTP n'est surement pas la bonne solution, ce qui pose probleme c'est pas le poids des fichiers qui ne depasse pas les 135Mo mais le nombre de fichiers c'est ce qui utilise le plus de temps lors du transfert.
amuse toi a telecharger/envoyer 10000 fichiers de 0.1Ko ou 1 fichier de 1Mo ... tu vas voir la difference au niveau du temps pour la meme quantité de données-> c'est X10 !

Mammouth du PHP | 684 Messages

22 mars 2006, 11:12

Salut.

Si Linux est une possibilite, pourquoi ne pas faire un script crontab pour faire la compression de tes fichiers. Il est aussi possible de lancer du php en ligne de commande dans une crontab.

Si tu peux utiliser tar, utilise exec() de php. Il faut bien faire attention aux droits de l'utilisateur qui lance ton script pour permettre les droits de faire un tar sur tes fichiers. J'avais utilisé sudo pour avoir une meilleure qualité de sécurité.

Un autre outil que je viens de mettre en place est dar que tu trouveras sur http://dar.linux.free.fr/. Il est aussi simple d'utilisation que tar et à plusieurs avantages comme la compression en gzip ou bzip2, la possibilité de mettre dans l'archive le programme en lui même, de faire plusieurs archive pour être stockées sur cdrom et de faire des archives différentielles.

Je trouve cette outil bien pratique pour faire des backups de gros volumes sans faire du stockage inutile. Il permet aussi de ne pas inclure des répertoires et enlever des fichiers de certains types en fonction des extensions. Je crois même que l'on peut faire des backups de système windows, enfin c'est marquer dans la doc mais je n'ai pas essayé.
Zigz4g

Eléphant du PHP | 254 Messages

23 mars 2006, 20:48

merci les gars !

la soluce utilisé sera un exec() sur la commande tar, ca donne quelque chose dans ce genre (de tete) :

Code : Tout sélectionner

exec("cd /data/htdocs/projet_lolo/; tar c alternate.tar ./");
il ne faut pas trop de temps pour faire la compression, a peine 20mn .

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

23 mars 2006, 22:48

C'est bizarre, j'aurais pû jurer que j'avais posté deux fois dans ce thread. Content de voir que tu as trouvé une solution satisfaisante, c'est clair que vu le profil des fichiers les uploader un par un serait une mauvaise idée.

Eléphant du PHP | 254 Messages

24 mars 2006, 11:00

oui, je pense aussi :)
surtout que je viens de relancer une generation des fichiers apres avoir remarqué que j'avais tout simplement oublié d'activer certaines classes dans le fichier de config :oops: .... ca vient de me rajouter + de 15000 fichiers ...


pour ceux que ca interesse, voici la bonne commande que j'utilise a la fin du PHP :
exec("cd ".DEST_DIR."../; tar -cf  alternate.tar ./projet_lolo");
// ya aussi celle la pour tester les liens mais ne fonctionne pas comme je l'aurais voulu ...
exec("checklink -r -D 10 -b -q ".DEST_URL."' > ~/Desktop/checlink.log');

ViPHP
ViPHP | 1380 Messages

24 mars 2006, 11:38

Avec les options -cf tu ne compresses pas. Tu ne fais que créer une archive qui occupe le même volume que l'original.

Essaye -czf (gzip) ou -cjf (bzip2 - plus rapide, mais pas supporté par toutes les distro).
ripat

Eléphant du PHP | 254 Messages

24 mars 2006, 15:01

ah exact, je viens de faire un test et la difference avec ou sans le "v" est enorme ... par contre avec le "j" je vois pas de vraie difference avec le "v", la taille de l'archive est juste inferieur de 1%

Eléphant du PHP | 312 Messages

24 mars 2006, 15:49

Le j c'est pas pour avoir du bzip2 justement, comme la souligné Ripat ?

Eléphant du PHP | 254 Messages

24 mars 2006, 20:52

si si, mais je pensais avoir un difference bien visible au niveau de la taille de l'archive ... hors les 2 compressions sont equivalentes .

Mammouth du PHP | 684 Messages

25 mars 2006, 00:02

Sous bzip2, tu peux choisir un niveau de compression. Lis le man mais normallement ca vas de 0 a 9 ou 9 est le plus compresser et le 0 le moins. C'est peut etre l'inverse. Bien sur si tu compresse plus, tu prendra plus de temps.
Zigz4g