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

PHP & Base de données Discussion :

php postgresql timeout [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut php postgresql timeout
    bonjour a tous

    je dois developper une interface web avec postgresql/postgis

    le volume de données est tres important.

    par exemple je dois permettre le depot sur le site de gros fichiers texte (env 500MO par fichier). j'ai utilisé curl pour ça.

    ensuite je dois intégrer ces donnees dans la bdd, traitement, etc...

    j'ai bien sur rencontre le pbm du time out.


    j'ai regle differente choses dans le php.ini, comme la taille maxi pour l'upload, la duree du script, etc...

    ca passe mais c'est limite et je rallonge un peu plus chaque fois la duree du time out....

    ca ne me semble pas etre fiable, ni même la bonne façon de faire.


    comment procedez vous de maniere generale pour de gros traitement de donnees ? je ne pense pas que la maniere interactive (web client/serveur) soit judicieuse, j'aimerai faire quelque chose comme ca :
    l'administrateur via l'appli depose son gros fichier, il clique sur un bouton "traiter" et il reprend la main.
    derriere un script s'executerai en faisant tout le travail et peu importe le temps que ca prendra. une fois le traitement fini, l'utilisateur en est informé d'une manière ou d'une autre (mail ?)

    est-ce faisable ?

    les scripts cgi sont ils capables de ca ? j'ai lu certain post et/ou doc mais je ne suis pas sure de bien comprendre comment ça marche.

    merci d'avance pour votre aide,

    n

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par nine Voir le message
    bonjour a tous

    je dois developper une interface web avec postgresql/postgis

    le volume de données est tres important.

    par exemple je dois permettre le depot sur le site de gros fichiers texte (env 500MO par fichier). j'ai utilisé curl pour ça.

    ensuite je dois intégrer ces donnees dans la bdd, traitement, etc...

    j'ai bien sur rencontre le pbm du time out.


    j'ai regle differente choses dans le php.ini, comme la taille maxi pour l'upload, la duree du script, etc...

    ca passe mais c'est limite et je rallonge un peu plus chaque fois la duree du time out....

    ca ne me semble pas etre fiable, ni même la bonne façon de faire.


    comment procedez vous de maniere generale pour de gros traitement de donnees ? je ne pense pas que la maniere interactive (web client/serveur) soit judicieuse, j'aimerai faire quelque chose comme ca :
    l'administrateur via l'appli depose son gros fichier, il clique sur un bouton "traiter" et il reprend la main.
    derriere un script s'executerai en faisant tout le travail et peu importe le temps que ca prendra. une fois le traitement fini, l'utilisateur en est informé d'une manière ou d'une autre (mail ?)

    est-ce faisable ?

    les scripts cgi sont ils capables de ca ? j'ai lu certain post et/ou doc mais je ne suis pas sure de bien comprendre comment ça marche.

    merci d'avance pour votre aide,

    n
    Je pense que tu n'as pas vraiment le choix quant a utiliser un model client serveur pour deposer tes fichiers. Apres je ne connais pas les technos que tu utilises pour faire tourner ton appli et donc pas leur fiabilite. Mais j'imagine que c'est typiquement de l'up/download en http, et c'est ce qui ce fait tous les jours sur le web, donc pas de probleme quant a la conception.
    Enfin je veux pas dire de betises donc arretez moi si je dis n'importe quoi.

    Pour ta derniere demande, tu veux "threader" (paralleliser) les taches.
    Il me semble que php propose une classe abstraite Thread que tu dois pouvoir faire etendre a des classes filles et surcharger la methode start

    Mais je crois que ce lien fera toon bonheur :
    http://www.copix.org/index.php/wiki/Thread

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    merci moumoutte, je ne connaissais pas effectivement et je vais regarder

    cependant je me pose des questions quasi existentielles, vu que je n'ai de ma vie approcher les scripts cgi ... je me demandais une chose :

    quand avec perl j'ecris qque chsoe comme : exec(commande)
    perl est sensé lancé la dite commande et reprendre la main non ?

    sois un script psql, par exemple, qui dure 20 min. si je le lance que se passe t-il ? est -ce que perl le lance et s'en va (au niveau browser pas de sablier)
    ou alors ca va mouliner parce que perl attend patiamment un retour?

    en somme un script de 20 minutes peut il etre traité en cgi ?
    sinon je me rabat sur ta solutions en eclatant mes taches dans plusieurs threads.

    merci encore, je cherche depuis qque jours une soluce snas resultat!

    n

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par nine Voir le message
    merci moumoutte, je ne connaissais pas effectivement et je vais regarder

    cependant je me pose des questions quasi existentielles, vu que je n'ai de ma vie approcher les scripts cgi ... je me demandais une chose :
    Je ne vois pas de quoi tu parles que tu dis "scripts cgi"....

    EDIT : ca y'est je sais ce que c'est

    quand avec perl j'ecris qque chsoe comme : exec(commande)
    perl est sensé lancé la dite commande et reprendre la main non ?
    Je ne pense pas... La commande exec a pour tache de transformer le processus en cours (ton script perl) en un autre processus que tu lui passes en parametre (commande).
    Donc tu perds la main sur ton script... en interne de la machine il n'existe plus.


    Regarde du cote de "fork ()" (je ne sais pas si ca existe en perl...) qui permet de dupliquer le processus , puis une fois que ton processus c'est duplique (il en existe donc deux dans ta machine), sers toi du fils (le processus duplique) et fais un exec (), dedans

    ca donnera un bazarre de ce style, en pseudo code , voir en C, a adapter pour le perl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (fork () != 0) // fork duplique le processus, et retourne le pid (processus id) si on est dans le fils, 0 pour le pere
    {
       // on est dans le processus fils
       exec (command);
    }
    else
    {
        print ("Je suis ton pere");
    }
    sois un script psql, par exemple, qui dure 20 min. si je le lance que se passe t-il ? est -ce que perl le lance et s'en va (au niveau browser pas de sablier)
    ou alors ca va mouliner parce que perl attend patiamment un retour?
    Sans utiliser le exec, perl va lancer l'execution de ton script postgres et attendre le retour avant de continuer a interpreter le reste du code
    en somme un script de 20 minutes peut il etre traité en cgi ?
    Je ne sais toujours pas ce qu'est un cgi depuis le debut de ton post

    EDIT : Bien sur, tu es meme plus ou moins oblige. Et puis c'est fait pour.
    J'imagine que c'est ton serveur postgres qui mets 20 min a traiter une requete.
    Ne t'en fais pas pour ca, lui meme est programme en thread, ce n'est pas a toi de le gerer normalement. MAis precise ta question j'aui peur de repondre a cote la..

    sinon je me rabat sur ta solutions en eclatant mes taches dans plusieurs threads.
    Ca depend, si les threads c'est plus utile quand tu veux gerer 12 000 instructions simultannees
    Si tu veux juste lancer une requet SQL et continuer ton script, un fork - exec devrait suffire (Le systeme d'exploitation fait tourner nativement plusieurs processus en pseudo parallele, sinon comment ecouter de la musique et coder sous son editeur de texte prefere ?)

    merci encore, je cherche depuis qque jours une soluce snas resultat!

    n
    Je t'en prie, n'hesite a poser des questions si des choses ne sont pas claires.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    encore merci moumoute,

    quand je parle de script cgi, cela veut dire pour moi la possibilité de lancer une commande (psql en l'occurrence) depuis une page web.
    pourquoi ?
    parce que la durée du script sql dépasse le timeout du browser, entre autre.
    et parce que la partie administration bdd n'a pas vocation a être "interactive", simplement lancer un gros script sql qui fera son travail et puis une fois fini envoie d'un mail a l'administrateur de l'appli pour compte rendu.

    comment?
    j'ai configuré apache pour permettre l'exécution de script perl :
    modification des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
        ScriptAlias /cgi-bin/ "C:/wamp/bin/apache/apache2.2.8/cgi-bin/"
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    <Directory "C:/wamp/bin/apache/apache2.2.8/cgi-bin">
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory
    voila, j'ai teste le script de demo printenv.pl, ca marche.

    j'espere que c'est plus clair !

    ce qui ne marche pas et bien, c'est que quand je lance mon script perl en mode console ça marche mais quand je le lance depuis le browser ça mouline pendant une éternité puis j'ai le message d'erreur apache timeout.

    voila, c'est simple et déprimant...

    a+
    n

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Bonjour,

    Il y a effectivement une solution plus appropriée : utilisée une tache planifiée (job) dans la base de données. Pour cela il faut installer le planificateur de taches (voir la doc de PgAdmin III) puis créer la tache qui va lancer le script très long, sans la planifier, et enfin lancer cette tache en one-shot depuis PHP : PHP n'aura que lancé la tache mais n'attendra pas la fin de celle-ci, qui va s'exécuter en tache de fond sur le SGBD.

    Voilà pour le principe, maintenant pour la pratique c'est plus dur car autant je connais très bien ça sous Oracle, autant je n'ai fait que regarder un peu les taches planifiées sous Postgres... Mais sur le principe c'est la solution la plus appropriée étant donné que ce que vous voulez faire est purement de la manipulation de données.

    Une fois le planificateur installé, les taches planifiées se gèrent facilement depuis PgAdmin. Reste à trouver la commande SQL à lancer pour exécuter la tache (sûrement un appel de procédure stockée).

    En espérant que ça vous aide...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    merci pour ta reponse, je vais creuser dans ce sens là et ferai un retour
    mais dans le principe c bien ce que je veux faire, trouver la solution la plus appropriée (et qui marche, ca ne gene pas ;-)) pour ce cas de figure.
    ce que tu proposes me va donc tout a fait.
    je crains ne jamais savoir pourquoi mon script ne marche pas (je pencherai pour une question de droit), mais tant pis il faut avancer alors, let's go!
    a+

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    chose promise, chose due, je vous fais un retour sur ce que j'ai mis en place...

    en fait je ne suis pas parvenue a grand chose avec les job/tache planifiee de prosgres. Le temps passant (trop vite) j'ai donc finalement fais ceci :

    une procedure stockee
    un script shell qui lance la procedure en tache de fond :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    nohup ./lescript 'param1' 'param2' > /dev/null 2>&1 &
     
    dans le script en question :
    psql --set param1 --set param2 -f fichier.sql -U unUser maBDD
     
    et dand le fichier.sql
     
    select * from maProcedure(:param1,:param2);
    Voila, merci a tous de m'avoir aider,

    n

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

Discussions similaires

  1. PHP & Postgresql
    Par garou51 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 19/03/2005, 12h40
  2. Transfert d'une base PHP postgreSQL
    Par colore dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/04/2004, 16h35
  3. [PHP & PostGreSQL] Connexion persistante & Res Id
    Par BuLma dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 25/08/2003, 11h35
  4. [PHP & Postgresql] urgent please
    Par garou51 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/06/2003, 16h30
  5. [php][postgresql] tutoriaux
    Par clark59 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 28/05/2003, 11h38

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