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 :

Optimisation requete PHP


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut Optimisation requete PHP
    Bonjour

    je cherche à optimiser ma requete.

    je m'explique avec la requête ci dessous j'ai une erreur "Maximum execution time of 120 seconds exceeded ".
    si je retire les conditions if elseif et else (ligne 28 à 35). la requête fonctionne en en moins de 5 secondes et sans erreur.

    Comment optimiser ce code dont le but est de récupérer les données de la première ligne du fichier CSV pour créer ma table.

    je vous remercie d'avance pour votre aide

    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
    require('_connexion.php');
    if (isset($_POST["envoyer"])) {
    $table = pathinfo ($_FILES["file"]["name"], PATHINFO_FILENAME);
    $fich=str_replace('_', '',$table);
    $fichier=str_replace('-', '_',$fich);
    $file = $_FILES["file"]["tmp_name"];
    $delimiteur=";";
    $taille = 1000;
    var_dump($table);
    var_dump($fichier);
    var_dump($file);
     
     
     
    // get structure from csv and insert db
    ini_set('auto_detect_line_endings',TRUE);
     
    if (($handle = fopen($file,'r')) !==FALSE )
    {
    // ... obtenir le contenu de la ligne
    	$data = fgetcsv($handle,$taille,$delimiteur);
                $num = count($data);
                var_dump($data);
     
     
    for($f=0;$f<$num; $f++) 
    {
    	if ($f=0){
    	 $fields[] = $data[$f].' int(11)';
    	}
    	elseif ($f=1){
         $fields[] = $data[$f].' DATETIME';
    	}
    	else {
         $fields[] = $data[$f].' VARCHAR(45)';
       }
     //var_dump($fields);
     
    } 
    try
    {
    $sql='CREATE TABLE '.$fichier.' ('. implode(',', $fields) .');';
     var_dump($sql);
     $req=$pdo->query($sql);
    }
    catch(exception $e)
    {
    	die('erreur : '.$e->getMessage());
    }
    }
    fclose($handle);
    }

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Je sais pas si c'est plus rapide, à tester

    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
     
    $handle = file($file);
     
    		if($file){
     
    			list($int,$datetime,$varchar) = explode($delimiteur,$file[0]);
    			$int .=' int(11)';
    			$datetime .= ' DATETIME';
    			$varchar .= ' VARCHAR(45)';
    		try
    		{
    		$sql='CREATE TABLE '.$fichier.' ('.$int.','.$datetime.','.$varchar.');';
    		 var_dump($sql);
    		 $req=$pdo->query($sql);
    		}
    		catch(exception $e)
    		{
    			die('erreur : '.$e->getMessage());
    		}
    	}

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    bonjour MaitrePylos,

    Merci de ta réponse

    Avec ta solution je ne créer que 3 colonnes. Dans mon fichier j'ai 7 colonnes et cela peut être variable suivant les fichiers.

    Ce que je sais c'est que la première colonne est en INT, la deuxième est en DATETIME et que le reste des colonnes est en VARCHAR(45).

    merci d'avoir essayer.

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Du coup, vous pouvez alors faire votre implode, la différence réside dans la lecture du fichier un file() plutôt qu'un fopen(), je ne sais si l'un est plus rapide que l'autre

    Dans le file() , j'ai directement un tableau , tandis que le fopen(), on doit encore passer le fgetcsv().

  5. #5
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    bonjour,

    le file sera plus rapide que le fopen avec la lecture de la ligne.
    néanmoins je suis toujours obligé des conditions

    si ligne = 0
    je fait un explode(;, ligne)
    puis encore une condition pour les paramètres de colonne
    if col=0 -> data = int
    if col=1 -> data = DATETIME
    sinon -> data = VARCHAR

    sinon

    insert into
    ou
    load data local infile avec ignore 1 lines


    j'ai pas pu mettre mon code, car mon code tourne en boucle sur la première boucle depuis hier soir sur mon autre PC et j'arrive pas a l’arrêter !!!

    Que pensez vous de ma logique ? est elle trop compliqué?

    Merci a vous

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Que si cela boucle depuis hier c'est qu'il y a un souci, normalement PHP est limité à 30 secondes.

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

Discussions similaires

  1. [MySQL] Optimisation requete SQL/php
    Par tripsi dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/04/2010, 08h31
  2. optimisation requetes (besoin de votre avis)
    Par seb92 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/12/2004, 11h27
  3. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52
  4. [SYBASE] optimisation requete UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 8
    Dernier message: 24/05/2004, 17h01
  5. Optimisation requetes SQL
    Par joel90 dans le forum Administration
    Réponses: 18
    Dernier message: 15/05/2004, 21h45

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