Avatar billede thorus Nybegynder
19. december 2003 - 03:50 Der er 5 kommentarer og
1 løsning

PHP tuning

Er det noget i det her script som muligvis kan slow ens server?

# TOP 5
$top="";
$res56 = mysql_query("SELECT navn, uid, date_format(Date, '%d.%m.%Y, %H:%i') as Date, hits+0 as hits FROM drinks where

Date > DATE_SUB(Now(), INTERVAL 100 DAY) and verified = 1

ORDER BY hits_print DESC ");
$i = 0;

while ($i < 5)
{ 
$row56 = mysql_fetch_array($res56);
$top = $top = $top ."<TABLE WIDTH=\"145\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\"><TR><TD WIDTH=\"15\" ALIGN=\"center\" VALIGN=\"TOP\"><p>+</TD><TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><P><a href=\"show.phtml?uid={$row56["uid"]}\">{$row56["navn"]}<BR><FONT SIZE=\"1\" COLOR=\"#666666\">{$row56["Date"]}</FONT><br><img height=4 width=1 border=0 src/grafik/menu.gif></a></TD></TR></TABLE>";
$i++;
}
Avatar billede jakoba Nybegynder
19. december 2003 - 04:14 #1
mySQL kører som en separat process, så det er en god ide at begrænse den datamængde der skal overføres. Du bruger kun de første 5 rækker, så lad være med at hente flere end det.
Det gøres ved at tilføje en LIMIT clause
    LIMIT 0, 5
forenden af din query.

$top = $top = $top ...  er pjat. hvorfor give $top den værdi der ligger i $top? Fjern det første '$top = '

din funktion i WHILE wil muligvis (jeg er ikke sikker) blive udført for hver eneste række. Hvis der er mange kan det være hurtigere at udføre den een gang i en anden query og så bruge resuktatet:

$skerings_tid = mysql_result( mysql_query( "
    select DATE_SUB(Now(), INTERVAL 100 DAY)
", 0, 0 );
$top="";
$res56 = mysql_query("
    SELECT navn, uid, date_format(Date, '%d.%m.%Y, %H:%i') as Date,
          hits+0 as hits
    FROM drinks
    WHERE Date > $skerings_tid
      AND verified = 1
    ORDER BY hits_print DESC
    LIMIT 0,5
");

$i = 0;
while ($i < 5) {
    $row56 = mysql_fetch_array($res56);
    $top = $top ."<TABLE WIDTH=\"145\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\"><TR><TD WIDTH=\"15\" ALIGN=\"center\" VALIGN=\"TOP\"><p>+</TD><TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><P><a href=\"show.phtml?uid={$row56["uid"]}\">{$row56["navn"]}<BR><FONT SIZE=\"1\" COLOR=\"#666666\">{$row56["Date"]}</FONT><br><img height=4 width=1 border=0 src/grafik/menu.gif></a></TD></TR></TABLE>";
    $i++;
}

mvh JakobA
Avatar billede jakoba Nybegynder
19. december 2003 - 04:16 #2
Ups. der mangler en slutparentes :(
$skerings_tid = mysql_result(
        mysql_query( "select DATE_SUB(Now(), INTERVAL 100 DAY)" ), 0, 0
                            );
Avatar billede thorus Nybegynder
19. december 2003 - 14:42 #3
ok den prøver jeg så.  Jeg har et kæmpe problem med min server så her kommer 2 scripts til som jeg meget gerne vil have en mening om.

$query = "SELECT * FROM reklamer_tekst_75 ORDER BY RAND() LIMIT 1";
$result12 = mysql_query($query, $linkup);
$rowt75 = mysql_fetch_assoc($result12);
$tekst751 = $tekst751 . "<p><a href=\"{$rowt75["url"]}\" target=\"_blank\">{$rowt75["tekst"]}</a>";
Avatar billede thorus Nybegynder
19. december 2003 - 14:43 #4
+ det her



$res = mysql_query("SELECT samlet_points, bruger_id, brugernavn, lastdate FROM brugere order by samlet_points desc limit 10", $linkup);

$i = 0;

$samletPoints = 0;
$oldSamletPoints = -1;

while($row = mysql_fetch_array($res))
{       
    if ($samletPoints != $oldSamletPoints)
    {
        $oldSamletPoints = $row["samlet_points"];
        $i = $i + 1;
    }

    $topbruger = $topbruger . "

<table width=300 border=0 cellspacing=0 cellpadding=0>
  <tr>
    <td align=center>
      <table width=350 border=0 cellspacing=1 cellpadding=0>
        <tr BGCOLOR=#EEEFDD>
          <td width=40><p>&nbsp;<a href=se_profil.phtml?giverId=" . $row["bruger_id"] . "> " . $i . "</a></p></td>
          <td width=160><p>&nbsp;<a href=se_profil.phtml?giverId=" . $row["bruger_id"] . "> " . $row["brugernavn"] . "</a></p></td>   
          <td width=100><p>&nbsp;<a href=se_profil.phtml?giverId=" . $row["bruger_id"] . "> Antal point: " . $row["samlet_points"] . "</a></p></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
";
}

while ($i < 10)
{
    $i = $i + 1;
   
}
Avatar billede jakoba Nybegynder
19. december 2003 - 16:57 #5
den første  (thorus 19/12-2003 14:42:52)  er det ikke umagen værd at gøre noget ved. det udføres kun een gang.
den anden  (thorus 19/12-2003 14:43:36)  har en løkke der kører gang 10 gange. det er igen en småting.

Men jeg bemærker du har det med at sige:
    $langstreng = $langstreng ."noget mere streg.";
og efterhåden som $langstreng bliver længere og længere kan det meget nemt gå hen at blive endog meget dyrt. Hvergang du udfører sådan en sætning skal php:
1) Allokere et dataareal der er stort nok til at indeholde den nye længere streng
2) kopiere den gamle værdi i $langstreng derover.
3) kopiere den nye tilføjelse derover
4) sætte variable $langstrent til at pege på det nye dataareal.
5) frigive og måske garbagecollecte det dataareal $langstreng pegede på før.

kopiering koster i proportion til hvor lang den kopierede streng er.

lager-allokering/deallokering koster i omvendt proportion med hvormeget lager du har. Hvis du har masser ad RAM er det ikke vældig dyrt, hvis du kun har lidt kan det koste kassen.

Så det er en risikabel kommando at bruge.

et alternativ er at lave et array

$topbruger = array();
og så komme tilføjelserne ind i hver sin celle istedet for hele tiden at sætte dem sammen:
dvs
  $topbruger = $topbruger . "...  // kopier og alloker al plads
bliver til
  $topbruger[] = "...    // kun tilføjelsen kopieres og får allokeret plads

og så, til allersidst når hele strengen skal skrives til output ændrer du
fra:
  echo $topbruger;  // skriv hele strengen
til:
  for ( $i=0; i<count($topbruger); $i++ ) {
      echo $topbruger[$i];  // udskriv alt i arrayet
  }

jo flere gang du sætter strenge sammen jo mere vil det spare af servertid.

mvh JakobA
Avatar billede thorus Nybegynder
13. januar 2004 - 18:00 #6
hej
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester