Avatar billede syswatch Novice
04. januar 2011 - 12:22 Der er 17 kommentarer og
1 løsning

Optimering af php script ?

Hej Eksperter,
Jeg sidder og roder med et script som egentlig virker i teorien, men i praksis lægger den min server ned, fordi den bruger for mange ressourcer... :-( Er der nogen af jer der kan hjælpe med at optimere scriptet så det muligvis kan køre på min server ?

include("dbcon_stock.php");
                        $query = "SELECT a.ITEMRELATION, a.ACCOUNTRELATION, a.QUANTITYAMOUNT, a.FROMDATE, a.TODATE, a.AMOUNT, a.EXCHANGE, b.ITEMNUMBER, b.COSTPRICE, b.SALESPRICE FROM pricedisc a, stocktable b, debtable c WHERE a.ITEMRELATION = b.ITEMNUMBER AND a.ACCOUNTCODE = c.ACCOUNTNUMBER AND c.DEPARTMENT = 7 ORDER BY $_POST[show]";
                        $result = mysql_query($query);
                   
                        $i = 0;
                        print "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
                       
                   
                          if($_POST[show] == "a.ITEMRELATION, a.ACCOUNTRELATION") {
                         
                          print "<tr><td width=\"125\"><b>Varenr</b></td><td width=\"60\" align=\"center\"><b>Kundenr</b></td><td width=\"80\"><b>Fra dato</b></td><td width=\"80\"><b>Til dato</b></td><td width=\"50\" align=\"center\"><b>Pris</b></td><td width=\"5\"></td><td width=\"50\" align=\"center\"><b>DG</b></td><td width=\"25\"></td><td width=\"25\"></td></tr>";   
                         
                          while($row = mysql_fetch_array($result)) {   
                             
                                if($row[EXCHANGE] == "EUR") {
                                    $row[AMOUNT] = $row[AMONUT] * 7.47;
                                } 
                                  if($row[EXCHANGE] == "USA") {
                                    $row[AMOUNT] = $row[AMONUT] * 6.00;
                                }
                                 
                            $aftaltpris = number_format($row[AMOUNT], 2, ',','.');
                            $fradato = substr($row[FROMDATE], 8, 2) . "-" . substr($row[FROMDATE], 5, 2) . "-" . substr($row[FROMDATE], 0, 4);
                            $tildato = substr($row[TODATE], 8, 2) . "-" . substr($row[TODATE], 5, 2) . "-" . substr($row[TODATE], 0, 4);
                            $tildato2 = str_replace("-", "", $row[TODATE]);
                            $nudato = date("Ymd");                           
                            $dg = @((($row[AMOUNT]-$row[COSTPRICE])*100)/$row[AMOUNT]);
                            $dg2 = number_format($dg, 2, ',','.');
Avatar billede jakobdo Ekspert
04. januar 2011 - 12:48 #1
Er det alt koden ?
Avatar billede syswatch Novice
04. januar 2011 - 13:15 #2
Den komplette php kode er her:

<?
                if(@$_POST[submit]) {
                                       
                   
                   
                        include("dbcon_stock.php");
                        $query = "SELECT a.ITEMRELATION, a.ACCOUNTRELATION, a.QUANTITYAMOUNT, a.FROMDATE, a.TODATE, a.AMOUNT, a.EXCHANGE, b.ITEMNUMBER, b.COSTPRICE, b.SALESPRICE FROM pricedisc a, stocktable b, debtable c WHERE a.ITEMRELATION = b.ITEMNUMBER AND a.ACCOUNTCODE = c.ACCOUNTNUMBER AND c.DEPARTMENT = 7 ORDER BY $_POST[show]";
                        $result = mysql_query($query);
                   
                        $i = 0;
                        print "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
                       
                   
                          if($_POST[show] == "a.ITEMRELATION, a.ACCOUNTRELATION") {
                         
                          print "<tr><td width=\"125\"><b>Varenr</b></td><td width=\"60\" align=\"center\"><b>Kundenr</b></td><td width=\"80\"><b>Fra dato</b></td><td width=\"80\"><b>Til dato</b></td><td width=\"50\" align=\"center\"><b>Pris</b></td><td width=\"5\"></td><td width=\"50\" align=\"center\"><b>DG</b></td><td width=\"25\"></td><td width=\"25\"></td></tr>";   
                         
                          while($row = mysql_fetch_array($result)) {   
                             
                                if($row[EXCHANGE] == "EUR") {
                                    $row[AMOUNT] = $row[AMONUT] * 7.47;
                                } 
                                  if($row[EXCHANGE] == "USA") {
                                    $row[AMOUNT] = $row[AMONUT] * 6.10;
                                }
                                 
                            $aftaltpris = number_format($row[AMOUNT], 2, ',','.');
                            $fradato = substr($row[FROMDATE], 8, 2) . "-" . substr($row[FROMDATE], 5, 2) . "-" . substr($row[FROMDATE], 0, 4);
                            $tildato = substr($row[TODATE], 8, 2) . "-" . substr($row[TODATE], 5, 2) . "-" . substr($row[TODATE], 0, 4);
                            $tildato2 = str_replace("-", "", $row[TODATE]);
                            $nudato = date("Ymd");                           
                            $dg = @((($row[AMOUNT]-$row[COSTPRICE])*100)/$row[AMOUNT]);
                            $dg2 = number_format($dg, 2, ',','.');
                           
                            if ($i & 1) {
                            print "<tr><td bgcolor=\"#aecbeb\">$row[ITEMRELATION]</td><td bgcolor=\"#aecbeb\" align=\"center\">$row[ACCOUNTRELATION]</td><td bgcolor=\"#aecbeb\">$fradato</td><td bgcolor=\"#aecbeb\">$tildato</td><td bgcolor=\"#aecbeb\" align=\"right\">$aftaltpris</td><td bgcolor=\"#aecbeb\"></td><td bgcolor=\"#aecbeb\" align=\"center\">$dg2%</td><td bgcolor=\"#aecbeb\">";               
                               
                                if($dg >= 0 && $dg <= 20) {print "<img src=\"grafik/rod.gif\"";}
                                if($dg >= 20.1 && $dg <= 30) {print "<img src=\"grafik/gul.gif\"";}
                                if($dg >= 30.1 && $dg <= 99.9) {print "<img src=\"grafik/groen.gif\"";}
                               
                            print "</td><td bgcolor=\"#aecbeb\">";
                           
                                if($tildato2 >= $nudato) {
                                    print "<img src=\"grafik/okay.gif\" border=\"0\">";
                                }else{
                                    print "<img src=\"grafik/notokay.gif\" border=\"0\">";
                                }
                           
                            print "</td></tr>";
                           
                            }else{
                            print "<tr><td>$row[ITEMRELATION]</td><td align=\"center\">$row[ACCOUNTRELATION]</td><td>$fradato</td><td>$tildato</td><td align=\"right\">$aftaltpris</td><td></td><td align=\"center\">$dg2%</td><td>";               
                               
                                if($dg >= 0 && $dg <= 20) {print "<img src=\"grafik/rod.gif\"";}
                                if($dg >= 20.1 && $dg <= 30) {print "<img src=\"grafik/gul.gif\"";}
                                if($dg >= 30.1 && $dg <= 99.9) {print "<img src=\"grafik/groen.gif\"";}
                               
                            print "</td><td>";
                           
                                if($tildato2 >= $nudato) {
                                    print "<img src=\"grafik/okay.gif\" border=\"0\">";
                                }else{
                                    print "<img src=\"grafik/notokay.gif\" border=\"0\">";
                                }
                           
                            print "</td></tr>";
                            }
                            $i++;
                              }   
                          print "</table>";
                          }   
                         
                          if($_POST[show] == "a.ACCOUNTRELATION, a.ITEMRELATION") {
                         
                          print "<tr><td width=\"60\"><b>Kundenr</b></td><td width=\"125\" align=\"center\"><b>Varenr</b></td><td width=\"80\"><b>Fra dato</b></td><td width=\"80\"><b>Til dato</b></td><td width=\"50\" align=\"center\"><b>Pris</b></td><td width=\"5\"></td><td width=\"50\" align=\"center\"><b>DG</b></td><td width=\"25\"></td><td width=\"25\"></td></tr>";   
                         
                          while($row = mysql_fetch_array($result)) {   
                             
                                if($row[EXCHANGE] == "EUR") {
                                    $row[AMOUNT] = $row[AMONUT] * 7.47;
                                } 
                                  if($row[EXCHANGE] == "USA") {
                                    $row[AMOUNT] = $row[AMONUT] * 6.10;
                                }
                                 
                            $aftaltpris = number_format($row[AMOUNT], 2, ',','.');
                            $fradato = substr($row[FROMDATE], 8, 2) . "-" . substr($row[FROMDATE], 5, 2) . "-" . substr($row[FROMDATE], 0, 4);
                            $tildato = substr($row[TODATE], 8, 2) . "-" . substr($row[TODATE], 5, 2) . "-" . substr($row[TODATE], 0, 4);
                            $tildato2 = str_replace("-", "", $row[TODATE]);
                            $nudato = date("Ymd");                           
                            $dg = @((($row[AMOUNT]-$row[COSTPRICE])*100)/$row[AMOUNT]);
                            $dg2 = number_format($dg, 2, ',','.');
                           
                            if ($i & 1) {
                            print "<tr><td bgcolor=\"#aecbeb\">$row[ACCOUNTRELATION]</td><td bgcolor=\"#aecbeb\" align=\"center\">$row[ITEMRELATION]</td><td bgcolor=\"#aecbeb\">$fradato</td><td bgcolor=\"#aecbeb\">$tildato</td><td bgcolor=\"#aecbeb\" align=\"right\">$aftaltpris</td><td bgcolor=\"#aecbeb\"></td><td bgcolor=\"#aecbeb\" align=\"center\">$dg2%</td><td bgcolor=\"#aecbeb\">";               
                               
                                if($dg >= 0 && $dg <= 20) {print "<img src=\"grafik/rod.gif\"";}
                                if($dg >= 20.1 && $dg <= 30) {print "<img src=\"grafik/gul.gif\"";}
                                if($dg >= 30.1 && $dg <= 99.9) {print "<img src=\"grafik/groen.gif\"";}
                               
                            print "</td><td bgcolor=\"#aecbeb\">";
                           
                                if($tildato2 >= $nudato) {
                                    print "<img src=\"grafik/okay.gif\" border=\"0\">";
                                }else{
                                    print "<img src=\"grafik/notokay.gif\" border=\"0\">";
                                }
                           
                            print "</td></tr>";
                           
                            }else{
                            print "<tr><td>$row[ACCOUNTRELATION]</td><td align=\"center\">$row[ITEMRELATION]</td><td>$fradato</td><td>$tildato</td><td align=\"right\">$aftaltpris</td><td></td><td align=\"center\">$dg2%</td><td>";               
                               
                                if($dg >= 0 && $dg <= 20) {print "<img src=\"grafik/rod.gif\"";}
                                if($dg >= 20.1 && $dg <= 30) {print "<img src=\"grafik/gul.gif\"";}
                                if($dg >= 30.1 && $dg <= 99.9) {print "<img src=\"grafik/groen.gif\"";}
                               
                            print "</td><td>";
                           
                                if($tildato2 >= $nudato) {
                                    print "<img src=\"grafik/okay.gif\" border=\"0\">";
                                }else{
                                    print "<img src=\"grafik/notokay.gif\" border=\"0\">";
                                }
                           
                            print "</td></tr>";
                            }
                            $i++;
                              }   
                          print "</table>";
                          }
                   
                   
                   
                       
                       
               
                }
               
           
               
                ?>
Avatar billede mcb2001 Nybegynder
04. januar 2011 - 13:59 #3
start med at læse op på JOIN (enten INNER eller LEFT OUTER), så kan du gøre din kode mere fornuftigt afviklingsmæssigt.

Og så vil glemmer du at sige hvor mange varer og så videre du har i din base, og hvor i koden det går galt?

sæt f.eks.
[code]
ECHO "FISK1";
ECHO "FISK2";
[/code]
ind, så kan du se hvilken fisk du når til, inden koden dør...
Avatar billede jakobdo Ekspert
04. januar 2011 - 14:45 #4
Ja, hvor mange rækker du har i din database, kunne netop være interessant.
Avatar billede syswatch Novice
04. januar 2011 - 14:51 #5
Tak for jeres input indtil videre. Tabellerne har følgende antal rækker.

pricedisc: 2048
debtable: 13791
stocktable: 33336

mcb2001: Jeg kan ikke lige gennemskue de kommandoer du henviser til, har du et eksempel ?
Avatar billede mcb2001 Nybegynder
04. januar 2011 - 15:03 #6
antallet af rækker er ikke ekstremt... jeg kører selv med nogle tabeller med mere end 1 million rækker (dog i MsSQL), og disse kan til tider være langsomme.

Mht. kommandoerne, så er der ikke noget særligt i dem, det kunne bare være rart at vide hvor i din kode det går galt.
Er det ved udskrift af data?
Er det ved query?
eller hvor er det?
Avatar billede syswatch Novice
04. januar 2011 - 15:09 #7
mcb2001:
Jeg ved ikke hvornår det helt går galt.
Der når ikke at komme noget output på skærmen overhovedet, så jeg vil tro at det er selv query'en der lægger serveren ned.
Jeg bliver nød til at genstarte den, da den er fuldstændig lammet, og kører MEGET langsom.

Jeg har læst denne turtorial (http://www.w3schools.com/sql/sql_join_inner.asp), men hvordan gør man hvis man fx. har 3 tabeller som mig ?
Avatar billede mcb2001 Nybegynder
04. januar 2011 - 15:21 #8
SELECT a.ITEMRELATION
        ,a.ACCOUNTRELATION
        ,a.QUANTITYAMOUNT
        ,a.FROMDATE
        ,a.TODATE
        ,a.AMOUNT
        ,a.EXCHANGE
        ,b.ITEMNUMBER
        ,b.COSTPRICE
        ,b.SALESPRICE
FROM pricedisc a
    INNER JOIN stocktable b
    ON a.ITEMRELATION = b.ITEMNUMBER
    INNER JOIN debtable c
    ON a.ACCOUNTCODE = c.ACCOUNTNUMBER
WHERE c.DEPARTMENT = 7
ORDER BY $_POST[show]
Avatar billede syswatch Novice
05. januar 2011 - 12:51 #9
mcb2001: Nu har jeg prøvet at implementere din kode ovenfor, og så lade scriptet stoppe lige efter query'en, men den kommer ikke igennem queryen, den crasher min server som bare står og hænger...
Kan det virkelig passe at det er så stor en mundfuld for den ?
Avatar billede jakobdo Ekspert
05. januar 2011 - 12:57 #10
Det burde det jo ikke umiddelbart.
Hvad hvis du laver en analyze via phpmyadmin ?
Hvordan har din database det generelt ?
Avatar billede syswatch Novice
05. januar 2011 - 12:58 #11
Lidt info om serveren:
Intel Pentium 3 med 1gb ram... Kan det være mangel på server ressourcer der gør at den ikke kan klare denne query ?
Avatar billede jakobdo Ekspert
05. januar 2011 - 13:01 #12
Nej, men det kan jo være fejl i dine tabeller.
Prøv som sagt at kig på analyze via phpmyadmin.
Avatar billede syswatch Novice
05. januar 2011 - 13:14 #13
jakobdo: Nu er vi ude i noget som jeg ikke har prøvet før...
Analyze via phpmyadmin ? Hmmm... har ikke engang phpmyadmin installeret, men det kan jeg da lige gøre.

Database status, hvordan skal jeg checke det, det er en MySQL database.
Avatar billede jakobdo Ekspert
05. januar 2011 - 13:19 #14
http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html

Det er dog meget nemmere via phpmyadmin. :o)
Avatar billede syswatch Novice
05. januar 2011 - 13:48 #15
jakobdo:
Her er resultatet fra phpMyAdmins analyze af de 3 tabeller:

Table    Op    Msg_type    Msg_text
dbtest.debtable            analyze    status    OK
dbtest.pricedisc    analyze    status    OK
dbtest.stocktable    analyze    status    OK

Er der andet jeg kan kigge på ?
Avatar billede jakobdo Ekspert
05. januar 2011 - 14:03 #16
Optimize ?
Dog skal jeg ikke begynde at lege den store mysql ekspert, når alt kommer til alt. :o)
Men man kunne måske kigge på dine datatyper, dine indexes etc.
Avatar billede mcb2001 Nybegynder
08. februar 2011 - 12:52 #17
er det ikke på tide at lukke dit spørgsmål?
Avatar billede syswatch Novice
08. februar 2011 - 13:00 #18
Lukker...
Endte med jeg købte en ny kraftigere server, og så virkede det.
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