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 :

pérformances de odbc_fetch_row


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut pérformances de odbc_fetch_row
    salut,
    j'utilise un scripte php comme Webservice pour accéder à SQLSERVER à partir de Silverlight ça marche très bien sauf que ça prend beaucoup de temps pour me renvoyer un résultat (5 a 8 secondes pour retourner 10 000 lignes)
    ce qui est largement loin de 1 seconde avec un Service WCF sur la même BDD et le même serveur
    du coup je me demande si le problème viens de mon scripte ou c'est vraiment un problème de performance de odbc_fetch_row
    voici mon scripte :
    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
    include 'sqlserver_vars.php';
    $Requete = $_GET['Requete'];
    if($Requete != NULL and $Requete != "")
    {
        $connection = odbc_connect("Driver={SQL Server};Server=$server;Database=$db",$dbUsername,$dbPassword) ;
        $Resultat= odbc_exec($connection, $Requete);
        $NbrChamps = odbc_num_fields($Resultat);                
        $data = array();    
        while($itemRow = odbc_fetch_row($Resultat))
        {        
            $lig = array();    
            for($i=1;$i<=$NbrChamps;$i++)
            {
                $val = utf8_encode(odbc_result($Resultat,$i ));
                array_push($lig,$val);
            }    
            array_push($data,$lig);
        }
        echo json_encode($data);
        odbc_close($connection);
    }

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    Bonjour,

    Je n'ai pas d'infos sur les performances d'odbc en php mais je peux par contre proposer une petite astuce pour optimiser le code présenté. Ce code utilise array_push pour rajouter à la fin des tableaux $lig et $data. Dans la doc officielle ils conseillent d'utiliser la forme équivalente:
    afin d'éviter d'appeler inutilement une fonction.
    Je ne sais pas quel impact cela aura sur le temps d’exécution du script mais c'est peut-être une piste.

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    en reprenant ton code de manière plus optimale, cela donnerait ça :
    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
    <?php
    include 'sqlserver_vars.php';
     
    $sql  = isset($_GET['Requete']) ? $_GET['Requete'] : '';
    $data = array();
     
    if (strlen($sql)) {
       $cnx = odbc_connect("Driver={SQL Server};Server=$server;Database=$db",$dbUsername,$dbPassword) ;
       $qry = odbc_exec($cnx, $sql);
       while($row = odbc_fetch_array($qry)) {
          $data[] = array_map('utf8_encode', $row);
       }
    }
    odbc_close($cnx);
    echo json_encode($data);
     
    ?>

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    merci pour votre réponse,
    efffictivement pour le push jai chercher la facilité, je vais faire des testes avec la nouvelle optimisation et je vous en dirais des nouvelles

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    je viens de faire un test , (tout les serveurs sont sur localhost)
    je m’attendait a voir une diference mais c'est finalement pareille
    après une dizaine d’exécutions de chaque version du scripte jais u :

    1. meilleure score pour l'ancien scripte : 5,95 secondes
    2. meilleure score pour le nouveau scripte : 5,05 secondes

    donc une seconde de mieux (c'est déjà ça) mais c'est aléatoire des fois les deux scriptes prennent jusqu’à 10 secondes
    apparemment c'est le fetch_row qui est lourd

Discussions similaires

  1. [ODBC] Connexion BDD Access avec "new com" - utilisation de odbc_fetch_row ?
    Par polothentik dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/04/2008, 15h12

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