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 :

Pcntl_fork et écriture fichier


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 13
    Points
    13
    Par défaut Pcntl_fork et écriture fichier
    Bonjour à tous,

    Je travail actuellement sur une problématique de détection de liens brisés dans les contenues des utilisateurs.

    Pour cela, j'utilise un module Drupal "linkchecker". Cependant les performances ne me convenaient pas et j'ai voulu le modifier, pour être plus précis, le paralléliser. Pour cela j'utilise une petite classe de Thread utilisant pcntl_fork(). Les threads font appels à une fonction qui elle même fait appel à un http_requests. Jusque là pas de problème apparent.

    Le soucis se pose dans la sauvegarde des données retournées par le http_request. Je voulais les enregistrer dans un fichier par thread pour pouvoir récupérer le résultat plus tard et faire mes manipulations en fonction. Le soucis est le suivant : Je lance mes threads via une URL, les threads se terminent correctement et là, pas de fichiers ... Mes fichiers apparaissent environ 3 minutes après la fin de l'execution des threads.

    J'ai donc pensé que cela pouvais être due aux buffers, mais des flushs n'y font rien ... Pour éviter d'utiliser des fichiers j'avais aussi pensé utiliser des variables globales, mais les threads en PHP ont apparemment leurs propres contextes mémoires ... Une des solutions que je vois encore serai d'enregistrer les données en BDD directement en utilisant un petit sémaphore mais je pense perdre l'interêt d'avoir parallélisé ...

    Ma question est donc la suivante : quelqu'un aurait-il une idée de pourquoi les fichiers sont crées à retardement ou aurait une idée de comment sauvegarder ces données ? J'ai surement raté quelque chose ...

    Dans l'attente de vous lire, je vous souhaite une bonne journée.

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    à priori je ne vois pas. est-ce que le fclose() ou sont équivalent est appelé dans le thread? est ce que la date écriture du fichier est celle de la fin d’exécution ?

    il est aussi possible que ton interface graphique ne te montre pas le fichier tout de suite pour un pb de rafraichissement. clearstatcache() peut aider si le phénomène se limite à php mais ça consomme tellement de ressource....

    Une des solutions que je vois encore serai d'enregistrer les données en BDD directement en utilisant un petit sémaphore mais je pense perdre l'interêt d'avoir parallélisé ...
    quelle est cette base de données qui ne traiterait pas correctement les insertions concurrentes?
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Salut et merci de ta réponse.

    Oui j'appel fclose() dans mon thread que se soit dans le try ou le catch.

    Je regarde directement l'apparition du fichier sur la VM donc pas de problème de cache de ce côté. Je me demandais si APC ou Memcache pouvais posé problème mais je ne pense pas que le problème viennent de la.

    J'avais déjà effectué un test avec file_puts_contents($filename, $line, FILE_APPEND | LOCK_EX). Cela avait fonctionné correctement, les fichiers étaient apparent dès la fin de l'execution. Mais maintenant cela ne fonctionne plus.

    Je viens aussi de me rendre compte de quelque chose : Quand cela fonctionnait je faisais un traitement sur 1000 liens avec un timeout de 5 minutes. Le traitement ne se finissait pas en plein (timeout atteint) mais mes fichiers étaient présents et remplis. En ce moment j'effectue mes tests sur 100 liens, le traitement ce fini "correctement" mais les fichiers apparaissent plus tard.

    Cela pourrait-il venir du fait que les threads font une sorte de flush de buffer lorsque leur session expire ?

    La base c'est du mysql, je préfère mettre un sémaphore pour plus de sécurité.

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    La base c'est du mysql, je préfère mettre un sémaphore pour plus de sécurité.
    pour moi c'est irrationnel. Quel moteur dans mysql?

    bon

    si le code est court je veux bien un aperçu.

    Ce que tu devrais faire c'est t'assurer que le code fonctionne sans les threads et ensuite on retourne à la partie thread pour optimiser. une autre question, c'est ton script principal, son execution dure combien de temps?
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Bien ! Je crois avoir compris le pourquoi du comment en refaisant des petits tests de bases :

    En version non threadé le code marchait parfaitement, les fichiers apparaissent dès la fin de l’exécution.

    En mode thread les fichiers apparaissaient en retard pour une raison simple : le processus mère meurt en par exemple 180 secondes. Cependant la fonction que j'ai threadé possédait elle un timeout de 240 secondes. donc le processus mère meurt, ne tu pas les fork, s'arrête (donc ma page n’apparaît plus en train de chargé dans ma navigateur) mais les forks eux, continu de s’exécuter et n'ont pas fini leur traitement et donc n'ont pas encore effectuer de fclose, ne flushant ainsi pas leur buffer.

    Cette explication me parait plutôt cohérente ... Qu'en pensez vous ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    hmm je déterre un peu le sujet, c'est surtout pour indiquer la solution du problème.

    Lorsqu'on lance un thread PHP depuis un contexte Apache, il se retrouve sous forme d'instance apache. Or il se trouve que ces instances ne se terminent pas avec un simple SIG_TERM qui est le signal envoyé par un exit ... J'ai passé ma solution en full PHP-CLI et plus de problème.

    Donc maintenant mes fichiers sont bien présent lors du close !

    En espérant que cela pourra servir à quelqu'un !

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

Discussions similaires

  1. écriture fichier properties
    Par touriste44 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 20/05/2010, 13h26
  2. [VBS] scan rep + écriture fichier
    Par mat10000 dans le forum VBScript
    Réponses: 3
    Dernier message: 24/03/2006, 08h11
  3. [C#] écriture fichier .txt + calcul écart-type
    Par titaB dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/05/2005, 13h09
  4. [Servlet] Probléme écriture fichier
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/05/2005, 15h17
  5. Ouverture/écriture fichier Excel
    Par mathieu04 dans le forum Windows
    Réponses: 17
    Dernier message: 07/06/2004, 11h23

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