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 :

Temps d'exécution maximum d'une heure


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut Temps d'exécution maximum d'une heure
    Bonjour,

    j'ai cherché des tas de trucs sur internet, mais rien trouvé de très bon

    Alors voila, je possède un script PHP qui appel un petit logiciel (Sql*Loader). Ce petit logiciel charge des données dans une table d'une base de données.

    Le problème c'est que les chargements sont très longs (tout à fait normal)! Mais en attendant mon script PHP tourne, et au bout d'une heure exactement, ma page internet affiche "the page cannot be displayed"...

    Au départ mes scripts se coupaient au bout de 30 seconde! J'avais donc modifié le temps avec set_time_limit(3600), et donc ça tournait très bien pendant une heure! Maintenant je me rend compte qu'une heure est trop juste, mais il ne se passe même plus rien quand je modifie le set_time_limit.. Même en le repassant à 30 secondes la page ne se bloque plus quand j'exécute une longue requête..

    J'aurais voulu modifier ce bug pour que le script continue de tourner pendant 10 ou 20 heures... (c'est ce que j'aurais idéalement besoin)

    Une solution? Merci à tous

  2. #2
    Membre émérite
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 811
    Par défaut
    Bonjour,
    Si tu mets
    ton script se déroulera indéfiniment jusqu'à son exécution finale. Il ne faut pas oublier la charge qu'il va générer sur ton serveur.
    Mais l'idéal et c'est ce que je fais pour mes scripts c'est de faire rouler le script en parties. Je m'explique si je dois remplir 10.000 enregistrements, je crée un champ qui va contenir un sorte de compteur, je rempli ma table avec des portions de 200 enregistrements et je mets à jour mon compteur pour qu'à mon prochain lancement il consulte ce compteur et commence à cette valeur avec 200 enregistrements et ainsi de suite.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Merci pour cette réponse
    Pour la charge du serveur tu parles du serveur php ou celui de ma base de données (Oracle) ?

    Pour ce qui est de découper je voudrai bien, mais comment? Car ici ma table à charger va contenir 11millions d'enregistrements environ. Donc admettons que je charge 1million d'enregistrements, comment indiquer à php de se relancer? Le problème pour moi n'est pas de repartir à l'enregistrement 1000001, mais c'est de dire à PHP comment se relancer..

    Je ne vais pas vous balancer mon code, ça serai beaucoup trop long.. En gros voilà ce qu'il se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1 - l'utilisateur clique sur un bouton "parcourir", et recherche le fichier de données à insérer dans la table
    2 - PHP créé les fichiers de configurations d'Sql*Loader
    3 - Sql*Loader est appelé par PHP, et charge le fichier qu'a indiqué l'utilisateur. A partir de ce moment, le chargement commence et prend environ 1-2h.
    Le problème c'est que je ne suis pas sûr que ce rechargement de page soit dû au temps d'exécution.. En effet, même en ayant changé dans le php.ini la valeur du max_exec_time(36000), la page me sort un "The page cannot be displayed" au bout d'1 heure exactement C'est bizarre quand même...

  4. #4
    Membre émérite
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 811
    Par défaut
    Bonjour,
    En ce qui concerne la charge du serveur, je parle de tous les serveurs qui vont traiter ton script.
    11 millions... Je ne sais quoi dire!
    Expliques un peu ce que tu compte faire. D'où proviennent les données que tu veux envoyer? Est-ce d'une base vers une autre? Là c'est sutout de la curiosité qui me fait poser ces questions. 11 millions...

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    J'ai le même sentiment que Kabkab ... 1 million d'enregistrements ???
    Puis faire tourner un script Php en continue pendant 10 ou 20 heures ???

    Je veux bien admettre qu'il y a des cas particuliers, mais là, j'ai plutôt l'impression qu'il y a un problème sur le choix ou la manière de faire, non ?
    Là, on a l'impression que tu utilise une trottinette alors qu'il y a au moins 30 bornes à faire quotidiennement.

    Utiliser du tout Php dans ce cas là me semble pas adapté.
    Au lieu d'utiliser Php pour requêter, pourquoi ne pas le faire directement via le système ? (par exemple)

    Puis charger un fichier via un bouton "parcourir", donc tout ça via HTTP, est ce réellement la meilleur technique ?
    L'intervention humaine est elle vraiment nécessaire dans un cas pareil ?
    N'y a t-il pas moyen de mettre les machines en réseau, et de le faire via un cron (par exemple), tous ça via des commandes systèmes.
    Etc, etc ...

    En tout cas, faire un backup via une commande système prend quelque secondes, quelques minutes tout au plus, même pour 1 million de lignes, alors qu'en le faisant en boucle via Php ça prends des plombes.

    Bref, pas sûr que les bons outils soient utilisés dans un cas pareil.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Bonjour
    Tout d'abord merci à tous pour ces remarques

    Alors oui 11 millions d'enregistrements (et encore, ce n'est qu'une table (il y en a 3 en tout qui sont relativement conséquentes). Ces données proviennent des réseaux de France Telecom. Ce sont donc des fichiers .txt de données brutes (contenant des séparateurs), qu'il faut insérer dans des tables sur un serveur Oracle. Ces fichiers sont assez importants (un peu moins de 4Go).

    Pour cela il n'y a pas 36 façons de les charger dans la base de données, mais 2 (Sql*Loader, ou des tables externes). Mon programme PHP appelle donc Sql*Loader via une ligne de commande (ce n'est pas PHP qui bosse, mais bien Sql*Loader). Simplement la page web reste "figée" tant que Sql*Loader n'a pas fini (que j'importe les données directement par l'invite de commande DOS avec un appel à Sql*Loader, ou bien par l'application, le résultat est le même niveau temps de chargement).

    Les requêtes en elles-mêmes sont assez longues à exécuter (environ 5 minutes, parfois moins). En même temps les infos sont recherchées entre plusieurs tables de plusieurs millions de lignes, et le nombre de résultat est parfois important..!

    Enfin, pour ce qui est du bouton "parcourir", je ne récupère ainsi que le chemin du fichier qui apparaît dans la zone de texte Je n'upload rien du tout! Je récupère juste ce chemin afin de créer les fichiers de configuration d'Sql*Loader (ces fichiers ont besoin du chemin du fichier de données)

    Voilà, j'espère vous avoir correctement répondu

Discussions similaires

  1. Temps d'exécution différent pour une même tâche
    Par franculo_caoulene dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 26/03/2008, 08h41
  2. [SQL] Problème de temps d'exécution maximum
    Par manshoon dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/05/2006, 14h07
  3. Temps d'exécution d'une vue
    Par mic79 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2005, 16h50
  4. Réponses: 9
    Dernier message: 20/06/2005, 12h17
  5. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48

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