Bonjour,

J'ai commencé à développer une appli web en PHP qui va chercher des données dans une bdd MSSQL d'un logiciel métier afin d'afficher une sorte de planning.

J'avais (pour des raisons de débutisme aigu) commencer à développer en partant sur le principe que je dressais en X la liste des employés en Y la liste des jours de la semaine et que au croisement des 2 dans chaque cellule j'allais chercher les infos de tâches du planning dans la BDD.

Bien évidemment, un membre d'ici (merci darkstar) m'a alerté sur le fait que balancer pour certaines agences 17 fois 7 jours (donc 119 fois la requête) n'était pas intelligent mais qu'il valait mieux aller chercher toutes les tâches de tous les employés de toute la semaine d'un coup et de trier par case en PHP après !

Me suis dit : il a raison vu que la page met 5 sec à se lancer c'est forcément à cause de ça.

Du coup j'ai tant bien que mal réussi à regrouper tous mes appels à la bdd MSSQL en un seul et là, ô miracle, ça .... fait pareil... 5.70s dans chrome pour afficher la page dont 2.80s de Waiting(TTFB) et 2.89s de content download.

Alors voici la fonction PHP en question avec la requête MSSQL :

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
53
54
55
56
57
58
59
60
61
62
63
64
function bddtoarray($agence,$activite,$lundi,$dimanche) {
    require('config.php');
    setlocale(LC_TIME, 'fr','fr_FR','fr_FR@euro','fr_FR.utf8','fr-FR','fra');
    date_default_timezone_set('Europe/Paris');
    $lundi = $lundi->format('Y-d-m');
    $dimanche = $dimanche->format('Y-d-m');
 
    $query = "SELECT
                TA.idTaches AS Taches,
                TA.idTypeTache AS TypeT,
                TA.DateDebut AS Debut,
                TA.DateFin AS Fin,
                TA.Rouge AS R,
                TA.Vert AS G,
                TA.Bleu AS B,
                TA.LibelleClient AS Client,
                TA.AdresseChantier AS Chantier,
                TA.Observation AS Note,
                TA.NumFacture AS Fact,
                PE.Nom AS Nom,
                PE.Prenom AS Prenom,
                PE.idPersonne as UserId,
                PE.Ordre as Ordre
            FROM  bdd.Taches TA
            INNER JOIN bdd.PersonneFacturation PF
                ON PF.idTaches=TA.idTaches
            INNER JOIN bdd.Personne PE
                ON PF.idPersonnel = PE.idPersonne
            WHERE   PE.idAgence = '$agence'
                AND PE.idTypeActivite = '$activite'
                AND PE.DateSortie IS NULL 
                AND PE.Indisponible = '1'
                AND (('$lundi 08:30:00' BETWEEN TA.DateDebut AND TA.DateFin AND NOT TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59') OR TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59')
            ORDER BY Ordre,Debut ASC
            ";
    $result = sqlsrv_query($conn,$query, array(), array( "Scrollable" => 'static' ));
    while( $row = sqlsrv_fetch_array( $result) ) {
        $Taches[] = $row["Taches"];
        $TypeT[] = $row["TypeT"];
        $Debut[] = $row["Debut"];
        $Fin[] = $row["Fin"];
        $Red[] = $row["R"];
        $Green[] = $row["G"];
        $Blue[] = $row["B"];
        $Client[] = $row["Client"];
        $Chantier[] = $row["Chantier"];
        $Note[] = $row["Note"];
        $Fact[] = $row["Fact"];
        $Nom[] = $row["Nom"];
        $Prenom[] = $row["Prenom"];
        $UserId[] = $row["UserId"];
        $Ordre[] = $row["Ordre"];
    }
 
	sqlsrv_free_stmt($result);
 
    if(!isset($Taches)) { $ListeTaches = NULL; }
    else {
        global $ListeTaches;
        $ListeTaches = ["Taches"=>$Taches,"TypeT"=>$TypeT,"Debut"=>$Debut,"Fin"=>$Fin, "R"=>$Red, "G"=>$Green, "B"=>$Blue, "Client"=>$Client, "Chantier"=>$Chantier, "Note"=>$Note, "Fact"=>$Fact, "Nom"=>$Nom, "Prenom"=>$Prenom, "UserId"=>$UserId, "Ordre"=>$Ordre];
    }
    return $ListeTaches;
 
}

Du coup exactement le même temps à un poil de *** près que si je balance mes 119 requêtes !!!

Je précise :
  • que ma BDD MSSQL 2008 se trouve sur une machine virtuelle de mon réseau
  • que mon serveur Web est actuellement hébergé via Wamp sur mon poste en gigabit sur le réseau
  • que quand je fais la même requête via DBeaver sur mon poste elle met 73ms à s'exécuter
  • que ma table la plus volumineuse (Taches) fait environ 69000 lignes mais j'imagine que ça n'importe peu vu que via le soft d'admin BDD le temps est correct pour me pondre les données


Pouvez-vous SVP m'éclairer et me donner une piste ? car là j'avoue ne pas comprendre d'où vient le pb !

iLtG