Lång tid att utföra operation.

PHPportalen Forum Index » Databaser
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
snylften



Medlem i: 3907 dagar

Status: Offline



#740833
Inlägg Skrivet: 2016-06-06 08:33      Ämne: Lång tid att utföra operation. Citera

Jag har en tabell med kunder på ca 600 poster som jag listar i en tabell. Varje kund har ett kundnummer ($reference).

Med det kundnumret tar jag fram statistik hur många gånger kundens sida har visats. Statistiken ligger i en egen statistiktabell. Statistiktabellen har 3 värden, "kundnummer", "datum" och "antal träffar".

Jag har skapat en funktion som returnerar hur många gånger kundens sida har visats. Den heter getNumViewsProfile och till den skickar man då de tre parametrarna $fromDte som är fråndatum ,$toDte som är tilldatum $ref som är kundnummer. Med de två datumen så kan jag då få tillbaka antal visningar mellan dessa två datum. Så här ser funktionen ut i kod.

KOD:
1:
function getNumViewsProfile($frmDte,$toDte,$ref) {
2:
 
3:
   $query = "SELECT SUM(hits) FROM stats_profile WHERE (date BETWEEN '".$frmDte."' AND '".$toDte."') AND customer_id=".$ref."";
4:
   include "conn.php"; // kopplar upp mot databasen.
5:
   if ($stmtSelsect = mysqli_prepare($connection, $query)) {
6:
   mysqli_stmt_bind_result($stmtSelsect, $numViews);  /* bind result variables */   
7:
   mysqli_stmt_execute($stmtSelsect); /* execute query */
8:
   mysqli_stmt_fetch($stmtSelsect);
9:
   mysqli_stmt_close($stmtSelsect); /* close statement */
10:
   } else {           
11:
     echo ("<p>Fel i SQL</p>");
12:
     exit;   
13:
   } //end if (create a prepared statement)
14:
 
15:
   return $numViews;
16:
 
17:
} // End function


Nu till mitt problem.
Funktionen fungerar precis som det ska. Men när jag loopar igenom hela min kunddatabas och på varje rad vill ta fram antal visningar med min funktion getNumViewsProfile så blir det oäääändligt segt. Sidan tar ibland 30 sekunder att ladda.

Hur ska jag göra för att sidan ska bli blixtsnabb?


Här kommer loppen där jag loopar ut alla kunder också.
KOD:
1:
<?PHP
2:
include "../functions.php";
3:
include "../pre_body_tag.php";
4:
include "../conn.php";
5:
  $fromDte = date("Y-m-d", strtotime('2016-01-01'));
6:
  $toDte = date("Y-m-d");
7:
?>
8:
 
9:
<!-- Your Page Content Here -->
10:
 
11:
  <div class="box">
12:
    <div class="box-header">
13:
      <h3 class="box-title">Kunder</h3>
14:
    </div>
15:
    <!-- /.box-header -->
16:
    <div class="box-body">
17:
      <table id="example2" class="table table-bordered table-hover">
18:
        <thead>
19:
        <tr>
20:
          <th>Kundnummer</th>
21:
          <th>Företag</th>
22:
          <th>Profilsida</th>
23:
          <th></th>
24:
          <th></th>
25:
        </tr>
26:
        </thead>
27:
        <tbody>
28:
<?php
29:
include "../conn.php";
30:
$query = " SELECT c.reference, c.company FROM customers c";
31:
if ($stmtSelsect = mysqli_prepare($connection, $query)) {
32:
mysqli_stmt_execute($stmtSelsect); /* execute query */
33:
mysqli_stmt_bind_result($stmtSelsect, $reference, $company );  /* bind result variables */   
34:
while ( mysqli_stmt_fetch($stmtSelsect) ) { ;
35:
 
36:
echo "
37:
<tr>
38:
  <td>".$reference."</td>
39:
  <td>".$company."</td>
40:
  <td>";
41:
  if ( getNumViewsProfile($fromDte,$toDte,$reference)>0 OR getNumViewsProfile($fromDte,$toDte,$reference)!=NULL ) {
42:
     echo getNumViewsProfile($fromDte,$toDte,$reference);
43:
   } else {
44:
    echo "Inget data";
45:
   }
46:
   echo "</td><td>";
47:
   echo "</td><td>";
48:
  echo "%</td>
49:
</tr>
50:
";
51:
 
52:
} // end while
53:
mysqli_stmt_close($stmtSelsect); /* close statement */
54:
} else {           
55:
  echo ("<p>Fel i SQL sökresultat</p>");
56:
  exit;   
57:
} //end if (create a prepared statement)
58:
?>
59:
        </tbody>
60:
        <tfoot>
61:
        <tr>
62:
          <th>Kundnummer</th>
63:
          <th>Företag</th>
64:
          <th>Profilsida</th>
65:
          <th>Sökresultat</th>
66:
          <th>CTR</th>
67:
        </tr>
68:
        </tfoot>
69:
      </table>
70:
    </div>
71:
    <!-- /.box-body -->
72:
  </div>
73:
  <!-- /.box -->
74:
<?php include "../post_body_tag.php"; ?>
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4114 dagar
Från: Tavesta
Status: Offline



#740834
Inlägg Skrivet: 2016-06-06 11:29      Ämne: Citera

Du ansluter på nytt till databasen varje gång du gör en databasfråga. Det kunde du enkelt slippa genom att använda require_once istället för include, och göra $connection global i din funktion

Du anropar getNumViewsProfile() tre gånger på rad 41-42, varav två är helt onödiga.
Du kunde istället anropa funktionen en gång och spara resultatet i en variabel, och använda den sedan i if-sater och utskrift.


Istället för att ta fram statistik över antal visningar för en kund i taget kunde du kanske göra det för alla kunder på en gång?
Du kunde kanske ändra sql-koden så du kör GROUP BY customer_id och tar med customer_id i resultatet.

När du optimerar kod kan det vara bra att mäta hur lång körtiden verkligen är, så du ser ifall förändringar ger framgång eller inte.
I början av koden:
PHP:
1:
 $timerstart microtime(true); 

och i slutet:
PHP:
999:
 echo '<p>Kodkörningstid: 'microtime(true)-$timerstart' sekunder</p>'
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
snylften



Medlem i: 3907 dagar

Status: Offline



#740835
Inlägg Skrivet: 2016-06-06 22:53      Ämne: Citera

, mycket bra tips. Det låter mycket vettigt att bara koppla upp sig mot DB en gång. Men jag vill i conn.php där $connection deklareras, sätta $connection som en global variabel så jag kan komma åt den inuti funktionen. Hur deklarerar man att en funktion ska vara global för att fungera inuti en funktion?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4114 dagar
Från: Tavesta
Status: Offline



#740836
Inlägg Skrivet: 2016-06-07 00:30      Ämne: Citera

PHP:
1:
 function getNumViewsProfile($frmDte,$toDte,$ref) { 
2:
    global $connection
3:
    //Nu kommer den globala $connection användas, istället för en lokal variabel med samma namn.
4:
    ...
5:
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » Databaser
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic