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 :

Passer une référence d'une archive zip à un script php via exec


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Passer une référence d'une archive zip à un script php via exec
    Bonjour à tous,

    je rencontre des difficultés dans un script php dans lequel j'utilise la libraire php multi process.
    La libraire ne pose pas de problème en soi. J'aimerai simplement passer un zip handle (Classe ZIPARCHIVE) aux scripts fils afin qu'ils y copient des fichiers.

    Les portions de code :
    script père :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    $processes[] = array('path'=>'/path/to/seq_dispatch_para.php','variables'=>array('fichier' => $fichier, 'fichier_root' => $fichier_root, 'plate_name' => $plate_name, 'zip_handle' => &$zip));
    ...
    $mp = new multi_process();
    $mp->createChildren($processes);
    $mp->checkStatus();
    $mp->cleanup();
    ...
    script fils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    $mp = new childProcess($argv);
    $var = $mp->getVariables();
    ...
    $zip = $var['zip_handle'];
    if($zip->addEmptyDir('TEST'))
    {
          ...;
    }
    ....
    Il faut savoir que les variable passées du père au fils sont stocké dans une db mysql de "cache" et encodées via base64().

    Avez vous des idées pour que mes scripts fils puissent tous accéder au même zip handle ?
    Merci

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Il faut savoir que les variable passées du père au fils sont stocké dans une db mysql de "cache" et encodées via base64().
    Aïe. Je vois pas l'intérêt de faire des pseudo forks (surtout à coups d'exec comme c'est le cas dans ta lib) sans pouvoir utiliser un espace commun pour les données et vu que les requêtes SQL sont les opérations les plus coûteuses (traditionnellement) d'un script utiliser la DB comme espace global relève selon moi du bidouillage... J'aurais plutôt vu Redis ou MemCached pour faire ça.

    Bref, tu ne peux pas passer un handle de type Ressource car ils ne sont pas sérializable (regarde la doc de PHP pour plus de détails). En fait, les variables qui transitent entre les scripts par $_SESSION par exemple sont toujours encodées et décodées sous forme de chaine de caractères, or une ressource ne peut pas subir un tel traitement. Ce qu'il faut donc que tu fasses pour palier à ça serait de créer une structure de données (un tableau ou un objet pourraient faire l'affaire) et que cette structure permette de "recréer" le handle dans l'état ou il était dans le script parent.
    Regarde du coté de __sleep et __wakeup ça te donnera des idées.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse.
    J'avoue qu'utiliser une DB comme espace global est limitant en terme de vitesse, mais c'était la seule chose que j'appréhendais correctement. A ce sujet, je vais aller me renseigner sur Redis et memcached.

    Ce qu'il faut donc que tu fasses pour palier à ça serait de créer une structure de données (un tableau ou un objet pourraient faire l'affaire) et que cette structure permette de "recréer" le handle dans l'état
    Le problème avec ZipArchive c'est qu'on ne peut pas ouvrir plus d'une fois la même archive. Au départ je procédais comme tu le dis, à savoir de filer les infos pour ouvrir l'archive dans le fils, mais les scripts fils, tournant en parallèle, me renvoyaient une erreur...

    EDIT : Redis ne gère au final que des variables de types string int array ... mais pas de handle de fichier, non ?
    It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Le problème avec ZipArchive c'est qu'on ne peut pas ouvrir plus d'une fois la même archive
    Alors il faut que lors de l'accès à la ressource les différents process impliqués lockent le fichier et détruisent le lock (et ferment la ressource) quand ils ont fini, ce qui annule totalement l'avantage d'utiliser le pseudo parallélisme. Tu peux locker un fichier avec flock.

    -- Edit

    Je pense que ce que tu cherches à faire peut être rattaché au design pattern Chain of responsibilities, tu devrais y jeter un oeil.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Ouai effectivement ça annule l'utilité du pseudo parallélisme.
    Du coup c'est pas terrible, puisque mon but premier c'est d'aller plus vite qu'avec la 1 ère version du script.

    Avec memcached ce bout de code me permettrait il de stocker et récupérer un handle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Dans le père
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $m->set('foo', $handle);
    ...
    //j'envoie l'objet sérialisé
    ...
     
    //que je récupère
    //dans le fils
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $m->get('foo');
    EDIT : Ce que je cherche à faire c'est ouvrir une archive zip dans un script père, filer le handle aux x scripts fils lancés à partir du père. Insérer des fichiers dans cette archive après traitement sur les dits fichiers, rangés dans répertoires bien précis.
    Le père attends que tous les fils aient finis et balance le zip en dl via un header('location : blabla.zip')

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Avec memcached ce bout de code me permettrait il de stocker et récupérer un handle ?
    Non plus, c'est toujours pareil, si tu sors de PHP, il faut sérialiser et là PAN.

    La solution pour toi est de n'avoir qu'un seul script à lancer en "arrière plan" du script parent.

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    OK.
    Le problème c'est que j'ai pensé à cette pseudo parallélisation car le script initial tournait avec un foreach, dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach($array as $file)
    {
         //fait 2,3 trucs
         // $zip->addFile($source_file,$destination_file);
    }
    Ca met un temps conséquent pour plus de 200 fichiers à traiter (logique vu les traitements), mais le plus problématique c'est que l'archive finale n'est souvent pas complète ou invalide.
    D'où mon idée de pseudo paralléliser ce foreach.

    Je suppose que ça doit être pareil en Perl au niveau du passage d'handle d'un script à un script fils ... ?

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je suppose que ça doit être pareil en Perl au niveau du passage d'handle d'un script à un script fils ... ?
    Je sais pas... Je pense que tu as besoin de repenser ta solution.

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    J'ai repris le script de mon prédécesseur et je suis ouvert à toute proposition.
    J'ai même tenter de créer l'arborescence et les fichiers directement sur le serveur, dans un répertoire temporaire via les scripts fils.
    Et de d'archiver le tout dans le script père ...
    C'est pas terrible ... Les lenteurs sont toujours là....
    Mais je pense creuser dans cette voie en essayant d'aller plus loin.

    Merci pour vos conseils!

Discussions similaires

  1. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. Garder une référence vers une variable d'une autre classe
    Par choupeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2007, 18h30
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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