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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    453
    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 : 453
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    453
    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 : 453
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    453
    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 : 453
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 ?

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