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 :

Utiliser la Librairie PHP multithread Pthreads


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut Utiliser la Librairie PHP multithread Pthreads
    Bonjour à vous.
    Ça fait plusieurs jours que je me casse la tête à résoudre ce problème concernant la lenteur d'exécution de mon Code qui est chargé générer des numéros à partir de numéro et de la longueur renseignés depuis le formulaire HTML.
    Toujours dans le souci d'accélérer ou de réduire totalement le temps de traitement de la génération des Numéros avec mon Code, j'ai découvert qu'il était possible d'exécuter parallèlement plusieurs tâches avec mon Script PHP ci-dessous qui feraient chacune une partie du traitement. Chacune des tâches générera une partie des numéros totaux qu'est chargé généré le Code normalement. Une fois toutes tâches terminées (générations terminées en plusieurs morceaux), un dernier Script devait automatiquement s'occuper de rassembler tous les numéros générés pour être envoyé au Client via son email récupérée depuis le formulaire HTML.
    En fouillant un peu, j'ai découvert qu'il était possible de faire cela avec la Librairie Multithread de PHP nommée "Pthreads" (https://github.com/krakjoe/pthreads):


    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
    49
    50
    51
    52
    $now = gmdate("D, d M Y H:i:s");
    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    header("Last-Modified: {$now} GMT");
     
    // force download  
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
     
    $filename = "numero.csv";
     
    // disposition / encoding on response body
    header("Content-Disposition: attachment;filename={$filename}");
    header("Content-Transfer-Encoding: binary");
     
    ob_start();
    $df = fopen("php://output", 'w');
     
    // pour mettre un entête sur le CSV
    $entetes = ['Numero'];
    fputcsv($df, $entetes);
     
    // numéro de base
    $numero         = (isset($_POST['numField'])) ? $_POST['numField'] : 0;
    // longueur souhaité (doit être plus grande que longueur de $numéro)
    $longueur_total = (isset($_POST['numLength'])) ? $_POST['numLength'] : 0;
    // longueur utilisé en retirant la longueur de base
    $longueur       = $longueur_total - strlen($numero);
    // calcule de la puissance de 10 en fonction de la longueur souhaité
    $max            = pow(10, $longueur);
    // affichage du maximun de tour de la boucle
    // echo "<h1>$max</h1>";
    for ($i = 0; $i < $max; $i++) {
        // différence de longueur
        $diff = $longueur - strlen($i);
        $zero = "";
        for ($a = 0; $a < $diff; $a++) {
            // ajout des zéro devant
            $zero .= "0";
        }
        // concaténation du résultat
        $resultat = $numero . $zero . $i;
        // effacement des zéro
        $zero     = "";
        // affichage du résultat
        $row = [$resultat];
        fputcsv($df, $row);
    }
    fclose($df);
    echo ob_get_clean();
    exit(0);
    Comment donc utiliser cette librairie "Pthreads" dans mon Code ci-dessus pour décomposer en plusieurs Scripts exécutant des tâches parallèlement pour générer des numéros afin de réduire totalement le temps de traitement de la génération des Numéros pour finalement les envoyer par mail récupérée via les formulaire HTML ???

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu peux donner quelques jeux de données exemple qui correspondent à une utilisation routinière de ton script, stp.
    Je crois que tu arrives très vite aux limites de la machine avec $max

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Je ne comprends pas bien. Vous pourrez l"éclairer à travers un exemple de Code SVP ???
    Sinon, comment contourner cette limite (de la machine) avec $max ???

    Pour rappel, c'est toute la Partie PHP qui traite le Projet que j'ai affiché ci-dessus. Alors, que me proposez-vous pour ma Variable $max = pow(10, $longueur); ???

    Vous pensez que c'est là que se pose le problème ??? Si oui, comment le contourner pour ne plus que le Traitement prennent autant de temps ???

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je te demande juste de donner quelques cas d'utilisation de ton script.
    Tu pourrais aussi m'éclairer sur son utilité sauf si c'est secret défense.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Je te demande juste de donner quelques cas d'utilisation de ton script.
    Tu pourrais aussi m'éclairer sur son utilité sauf si c'est secret défense.
    C'est simple:
    1 - L'utilisateur renseigne le préfixe de Numéro à générer. Ce qui est récupéré dans le Champs numField.

    2 - Puis dans le champs numLenght, il renseigne la LONGUEUR que dois chaque numéro à générer.

    3 - Puis enfin, le Script (Code ci-dessus) se chargera de générer les Numéros de 0 à 9999 en tenant compte de la longueur et en même temps du Préfixe.
    Ex: si le préfixe des nombres à générer est 111 et que la longueur souhaitée est 9, alors le résultat devrait donné un truc de ce genre:

    111000000
    111000001
    111000002
    ....
    ....
    ....
    111999999

    4 - Le tout stocké dans un fichier .csv ligne par ligne.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    c'est normal que tout plante : j'ai fait un essai avec $numero = 125 et $longueur_totale = 12.
    J'a abandonné quand le fichier .csv a atteint 3.60 Gigas avec pour index : 125297393640
    Au final et pour cet exemple, le fichier .csv devrait atteindre les 10 gigas !!!!

    Tu ne peux pas exploiter cette approche, c'est tout bonnement impossible, faut revoir le design.
    Voici mon code :
    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
    fileName = 'numero.csv';
     
    $file = fopen($fileName, 'w');
     
    $_POST['numField'] = 125;
    $_POST['numLength'] = 12;
     
    $get_int = function(string $k): int {
        return isset($_POST[$k]) ? (int)$_POST[$k] : 0;
    };
     
    // numéro de base
    $prefix = $get_int('numField');
    // longueur souhaité (doit être plus grande que longueur de $numéro)
    $longueur_total = $get_int('numLength');
    // longueur utilisé en retirant la longueur de base
    $longueur = $longueur_total - strlen("{$prefix}");
    if ($longueur < 0) {
        echo 'Erreur : Longueur totale invalide';
        exit;
    }
     
    $max = str_repeat('9', $longueur);
    $i   = -1;
    while (++$i < $max) {
        fwrite($file, $prefix.sprintf("%0{$longueur}d", $i)."\n");
    }
     
    fclose($file);
    je pose toujours la question de l'utilité de ce genre de script ?

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Merci beaucoup, je vais essayer ton Code pour voir ce que ça me retournera.
    Comme, je l'ai dit, je cherche à créer un générateur puissant et souple de Numéro à partir du préfixe et de la longueur renseignés par l'user.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    tu peux générer ces numéros sur le poste local tout en prévenant qu'en fonction des valeurs saisies, ça risque de prendre énormément de temps.
    Enfin un générateur de série de nombre qui fait juste +1 avec le prédécesseur... C'est utile en quoi ?
    Dans tous les cas, te devrais borner les limites.

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Bonjour.

    En fait, j'ai essayé ce Code et il marche avec une réduction d'environ 5 minutes par rapport à mon code initial. Mais le souci est que lorsque je rentre comme Préfixe un nombre commençant par le chiffre "0", ça ne prend pas en compte le zéro comme valeur incluse dans le préfixe. Alors que je voulais aussi que le chiffre zéro "0" soit inclus et traité comme préfixe si c'est renseigné.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $_POST['numField'] = 0125;
    $_POST['numLength'] = 12;
    Devrait normalement me retourner :

    012500000000 AU LIEU DE 125000000000

    012500000001 AU LIEU DE 125000000001

    ...
    ...
    012599999999 AU LIEU DE 125999999999

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    tu peux essayer de corriger par toi-même, non ?
    sinon tu peux aussi je pense améliorer le temps en évitant de faire appel à fwrite() à chaque itération.
    Tu stockes par exemple 1000 itérations dans un tableau et tu enregistres le tout par bloc

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Vu que vous tenez tant à connaître l'utilité, sachez que ceci est en réalité un exercice qui m'a été donné.

    1 - À propos du zéro (0) qui n'est toujours pas pris en compte par le Script, je me dit que c'est peut-être le (int) disponible dans la fonction string $k de la variable $get_int qui annule le zéro. Du coup, j'ai supprimé le (int). Mais pourtant c'est pareil.
    Le zéro n'apparaît toujours pas dans les résultats comme Préfixe.

    2 - Aidez-moi vraiment à réduire au Maximum le temps de traitement en corrigeant ce Code pour qu'il prenne en compte le Zéro comme valeur incluse dans le Préfixe ET SI POSSIBLE se passer du fwrite().

    Merci d'avance.

Discussions similaires

  1. Utilisation de Open SSL avec les librairies PHP
    Par onlajoy dans le forum Langage
    Réponses: 0
    Dernier message: 11/05/2010, 09h15
  2. Utiliser une librairie en multithread
    Par mister3957 dans le forum C++
    Réponses: 1
    Dernier message: 14/08/2006, 12h47
  3. portage d'une appli utilisant la librairie word
    Par neonico dans le forum MFC
    Réponses: 4
    Dernier message: 23/02/2005, 23h48
  4. Creer et utiliser une librairie externe à l'exécutable
    Par multani dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 06/11/2003, 10h11
  5. Utiliser une librairie graphique
    Par Troopers dans le forum Linux
    Réponses: 6
    Dernier message: 22/08/2003, 11h22

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