IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

creation d'archive ZIP récursive [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut creation d'archive ZIP récursive
    Bonjour,

    je n'arrive pas à faire une archive d'un dossier en récupérant tous les sous dossiers de manière récursive en PHP.

    La fonction ZIP est bien configurée.

    Le code donne ça (c'est du stackoverflow) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public static function createArchive( $source, $destination )
    		{
    			if ( !extension_loaded( 'zip' ) || !file_exists( $source ) )
    			{
    				return false;
    			}
     
    			$zip = new \ZipArchive();
    			if ( !$zip->open( $destination, \ZipArchive::CREATE ) )
    			{
    				return false;
    			}
     
    			$source = str_replace( '\\', '/', realpath( $source ) );
     
    			if ( is_dir( $source ) === true )
    			{
    				$files = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator( $source ), \RecursiveIteratorIterator::SELF_FIRST );
     
    				foreach ( $files as $file )
    				{
    					$file = str_replace( '\\', '/', $file );
     
    					// Ignore "." and ".." folders
    					if ( in_array( substr( $file, strrpos( $file, '/' ) + 1 ), ['.', '..'] ) )
    					{
    						continue;
    					}
     
    					$file = realpath( $file );
     
    					if ( is_dir( $file ) === true )
    					{
    						$zip->addEmptyDir( str_replace( $source . '/', '', $file . '/' ) );
    					}
    					else if ( is_file( $file ) === true )
    					{
    						$zip->addFromString( str_replace( $source . '/', '', $file ), file_get_contents( $file ) );
    					}
    				}
    			}
    			else if ( is_file( $source ) === true )
    			{
    				$zip->addFromString( basename( $source ), file_get_contents( $source ) );
    			}
     
    			return $zip->close();
    		}
    L'erreur :
    Warning: ZipArchive::close(): Failure to create temporary file: Permission denied.
    Droits d'accès : Lecture/Écriture/Exécution (777).

    Sans vouloir troller, est-ce trop demandé d'avoir une blibliothèque standard PHP avec des fonctions de ce type ? createZipFromDirectory en C#
    Exprimer une différence d'opinion vaut mieux que :

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Sans vouloir troller, est-ce trop demandé d'avoir une blibliothèque standard PHP
    Je vais te dire un secret : il y a très peu de gens sur ce forum qui travaillent aux blibliothèques fournies avec PHP.

    Pour la fonction proposée, elle fonctionne bien chez moi.
    Tu l'as essayé avec divers repertoires sources et destinations ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    As-tu vu ceci?

  4. #4
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Bonsoir,

    c'est bon, j'ai réussi à faire fonctionner la fonction.

    @sabotage : Oui ben une bonne bibliothèque standard totalement OO ne serait pas du tout un mal, je ne sais pas pourquoi cette idée rebute la communauté PHP. C'est quand même plus simple d'appeler des méthodes liés au type que l'on manipule que d'avoir un tas de fonctions qui se baladent.

    Bref, c'est pas l'objectif de mon message que de parler de mon aversion pour PHP. J'ai une autre problématique sachant que ma méthode créé des archives à la volée sur des répertoires. Quelle est la méthode la plus propre pour gérer les demandes de plusieurs utilisateurs en même temps sur le même répertoire ? J'ai ajouté une timestamp au fichier pour ne pas créer une même archive si n personnes demandent une mais je ne trouve pas ça génial.

    Des idées ?

    Bon weekend.
    Exprimer une différence d'opinion vaut mieux que :

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Citation Envoyé par Aizen64 Voir le message
    Bonsoir,

    c'est bon, j'ai réussi à faire fonctionner la fonction.

    @sabotage : Oui ben une bonne bibliothèque standard totalement OO ne serait pas du tout un mal, je ne sais pas pourquoi cette idée rebute la communauté PHP. C'est quand même plus simple d'appeler des méthodes liés au type que l'on manipule que d'avoir un tas de fonctions qui se balancent.
    L'immense majorité est d'accord avec ça, et ça va arriver. C'est juste que c'est long à faire, et qu'il n'y a pas de salariés qui travaillent à plein temps sur le langage, donc malheureusement ça prendra le temps qu'il faudra.

    Citation Envoyé par Aizen64 Voir le message
    sachant que ma méthode créé des archives à la volée sur des répertoires. Quelle est la méthode la plus propre pour gérer les demandes de plusieurs utilisateurs en même temps sur le même répertoire ? J'ai ajouté une timestamp au fichier pour ne pas créer une même archive si n personnes demandent une mais je ne trouve pas ça génial.
    Est-ce que tu veux empêcher la création parallèle d'archives ou ne pas récréer une archive qui existe déjà?

    Si c'est la première solution (problème de concurrence), tu peux utiliser un lock file: tu crées le fichier lock quand tu commences la création et tu le supprimes une fois l'archive créée; puis avant chaque nouvelle création tu testes l'existence de ce fichier. S'il existe c'est qu'un autre utilisateur est déjà en train de créer une archive donc tu bloques le script en cours jusqu'à ce que le fichier lock n'existe plus.

    Si c'est la seconde (problème de redondance), tu peux faire un hash md5 du contenu de tous les dossiers, stocker ce hash quelque part et à chaque nouvelle demande tu recalcules le hash du contenu de tous les dossier. Si le hash est identique, tu sers l'archive existante; sinon tu recrées l'archive.

    En passant, peux-tu indiquer comment tu as résolu ton problème initial? Ça pourrait servir à quelqu'un d'autre plus tard.

  6. #6
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Je voulais écrire fonctions qui se 'baladent' et non 'balances', corrigé dans mon message initial.

    Post marqué comme résolu.

    Une partie de mon argumentation vient du fait que je suis fainéant, je vois pas pourquoi quelqu'un devrait écrire ses propres fonctions pour créer des archives ZIP, faire de la recherche récursive de répertoire (ce que fait bien Symfony/Finder) mais que va il se passer le jour où le composant n'est plus maintenu ?

    Autre question, pourquoi l'utilisation d'un débugger en PHP est souvent considéré comme une offense par de nombreux dev PHP ? C'est depuis l'utilisation d'xDebug, des namespaces, composer et PHPDoc pour aider à l'autocomplétition que je déteste un peu moins utiliser PHP. C'est toujours moche mais utilisable.

    Je vais regarder pour les lockfile.
    Exprimer une différence d'opinion vaut mieux que :

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Tu as marqué comme résolu, mais tu n'as pas donné la solution. C'était le plus important.

    Citation Envoyé par Aizen64 Voir le message

    Une partie de mon argumentation vient du fait que je suis fainéant, je vois pas pourquoi quelqu'un devrait écrire ses propres fonctions pour créer des archives ZIP, faire de la recherche récursive de répertoire (ce que fait bien Symfony/Finder) mais que va il se passer le jour où le composant n'est plus maintenu ?
    Ce sont les limites de l'Open Source. Ceci dit, il y a quand même beaucoup de solutions disponibles. Ne me dis pas que pas une seule de ces bibliothèques ne remplit ton cahier des charges?

    Citation Envoyé par Aizen64 Voir le message
    Autre question, pourquoi l'utilisation d'un débugger en PHP est souvent considéré comme une offense par de nombreux dev PHP ? C'est depuis l'utilisation d'xDebug, des namespaces, composer et PHPDoc pour aider à l'autocomplétition que je déteste un peu moins utiliser PHP. C'est toujours moche mais utilisable.
    Je ne sais pas quels dev PHP tu fréquentes, mais ce sont des gens qui en sont restés au PHP d'il y a dix ans, qui mélangent PHP et HTML, utilisent FTP et codent sur le serveur de prod. L'écosystème a énormément évolué, et beaucoup de devs avec. Mais tu as toujours des réfractaires...

  8. #8
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Je n'ai pas encore jeté un oeil à ton lien et je reviendrai sur la solution un peu plus tard (c'est le weekend non ?).

    Ton argumentation fait plaisir à lire, notamment parce que je la trouve ouverte d'esprit.

    Oui, c'est exactement ça pour le codage à la volée sur le serveur de prod avec transfert en FTP, pas de CVS, mélange de HTML, CSS et logique applicative, une horreur à débugger.

    Je ne vois pas ce qu'il y a de mal à utiliser des breakpoints, et que l'on ne me dise pas que C# et Java, c'est pas la même chose que PHP sur ce point, c'est un argument qui est un non sens si ça aide au développement.
    Exprimer une différence d'opinion vaut mieux que :

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir les archive zip avec l'explorateur windows
    Par koKoTis dans le forum Windows XP
    Réponses: 2
    Dernier message: 20/08/2006, 23h17
  2. [Zip] Problème de création d'archives (Zip.lib.php)
    Par BOUHAMOU dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 24/04/2006, 12h51
  3. [Zip] Comment lire des archives ZIP ?
    Par Paganoni dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 23/01/2006, 23h34
  4. [C#] [WinForms] Lecture d'un fichier dans une archive ZIP
    Par aegypius dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/12/2004, 17h15
  5. Archive::Zip
    Par Cyspak dans le forum Modules
    Réponses: 2
    Dernier message: 09/09/2003, 13h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo