[php][mysql] Script laden duurt te lang

Pagina: 1
Acties:

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Ik ben bezig aan een site, en roep daarbij nu 174 records aan uit een MySQL database. Dit alles is lokaal hier geen probleem, en de gast van wie de server is _zegt_ bij hem lokaal ook geen problemen te hebben.

Dit is de code:
PHP:
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
if ($_GET['action']=="view") {
    echo "<TABLE border=\"1\" width=\"750\" bordercolorlight=\"#C6CED8\" bordercolordark=\"#A7B4C5\">";
    $server = mysql_connect("$db_host","$db_user","$db_pass") or die("connection error");
              mysql_select_db("$db_name",$server) or die("couldn't select db");

    $sql = "SELECT * FROM $db_table_name";
    $query = mysql_query($sql);
    $count = mysql_num_rows($query);
    if ($count > 0) {
        echo "<TR><TD colspan=\"7\"><center><FONT face=\"Verdana\" size=\"2\"><b>gevonden cd's ($count):</b></FONT></center></TD></TR>";
        echo "<TR>
                 <TD width=\"100\"><FONT face=\"Verdana\" size=\"2\"><b><u>Categorie:</u></b></FONT></TD>
                 <TD width=\"75\"><FONT face=\"Verdana\" size=\"2\"><u>Bestel#:</u></FONT></TD>
                 <TD width=\"215\"><FONT face=\"Verdana\" size=\"2\"><u>Naam:</u></FONT></TD>
                 <TD width=\"50\"><FONT face=\"Verdana\" size=\"2\"><u>CD's:</u></FONT></TD>
                 <TD width=\"60\"><FONT face=\"Verdana\" size=\"2\"><u>Prijs:</u></FONT></TD>
                 <TD width=\"220\"><FONT face=\"Verdana\" size=\"2\"><i><u>Comments:</u></i></FONT></TD>
                 <TD width=\"30\"><FONT face=\"Verdana\" size=\"2\"><u>edit</u></FONT></TD>
             </TR>";
    }
    else {
        echo "<TR><TD colspan=\"7\"><center><FONT face=\"Verdana\" size=\"2\"><b>Geen CD's gevonden!</b></FONT></center></TD></TR>";
    }
    $q = 0;
    $colorarray = array("#C6CED8", "#f0f0f0");

    while ($res = mysql_fetch_array($query)) {
       $celcolor = $colorarray[$q%2];
       echo "<TR bgcolor=\"$celcolor\">
                 <TD width=\"100\"><FONT face=\"Verdana\" size=\"2\"><b>$res[cat]</b></FONT></TD>
                 <TD width=\"75\"><FONT face=\"Verdana\" size=\"2\"><i>$res[id]|$time</i></FONT></TD>
                 <TD width=\"215\"><FONT face=\"Verdana\" size=\"2\">$res[naam]</FONT></TD>
                 <TD width=\"50\"><FONT face=\"Verdana\" size=\"2\">$res[aantalcd]</FONT></TD>
                 <TD width=\"60\"><FONT face=\"Verdana\" size=\"2\">&#8364 $res[prijs]</FONT></TD>
                 <TD width=\"220\"><FONT face=\"Verdana\" size=\"2\"><i>$res[comments]&nbsp;</i></FONT></TD>
                 <TD width=\"30\"><FONT face=\"Verdana\" size=\"2\"><a href=\"admin_edit.php?action=edit&id=$res[id]\"><FONT color=\"#000000\">edit</FONT></A></FONT></TD>
             </TR>";


       $q++;

    }
    echo "</TABLE>";
}


Daarmee lijkt me op het eerste gezicht nix mis mee, maar toch komt er na 30seconde een error:
code:
1
Fatal error: Maximum execution time of 30 seconds exceeded in c:\www\cdcopy\admin\admin_edit.php on line 50


Line 50 is $q++;, dus lijkt me gewoon een waardeloze error :P

Hij laat overigens wel zien hoeveel matches hij in de database heeft gevonden (174), maar lijkt daarna dicht te slippen bij het lopen. Hoe kan dit?

Zit nu al 2 dagen strak naar die code te kijken en te veranderen, maar nog steeds die error. Hier heb ik een cd-database staan met 2500 entry's, en die heeft geen probleem met nagenoeg dezelfde code...

Server specs:
-Apache 1.3
-PHP 4.2.2
-Windows 2k (Windows NT 5.0 build 2195)

  • PieterJ
  • Registratie: Juli 2000
  • Laatst online: 16:04
Het fetchen van je data duurt te lang.
Simpelste oplossing is de execution timeout omhoog gooien.

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Tjah, maar voor 174 dingetjes is dat toch helemaal niet nodig? Zoals ik al zei, hier heb ik een database met 2500 dingen die hij laat zien op 1 pagina, daar doet hij net 3 seconde over.

En wat als er 10 users op die site zijn? Dan heeft 'ie dus ongeveer 10 minuten nodig? :/


edit:

PHPMyAdmin doet er ook vrij lang over, maar geeft toch nog geen error terug dattie meer dan 30sec bezig is...

  • rickmans
  • Registratie: Juli 2001
  • Niet online

rickmans

twittert

je zou
PHP:
1
SELECT * FROM $db_table_name
wat kunnen aanpassen dus de velden noemen ipv het *

Don't mind Rick


  • PieterJ
  • Registratie: Juli 2000
  • Laatst online: 16:04
Als ik naar je code kijk zou ik het ook zo gedaan hebben. Daar lijkt niets mis mee.
Misschien dat er iets met je SQL server niet goed is. Of met je DB.

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Heb net met de "server-gast" gesproken, die zegt dat als hij dezelfde link intern bekijkt, hij binnen 2-3 seconde klaar is? VAAAG

rickmans: ik moet juist alle velden hebben, dus dat maakt niets uit denk :)

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Ik heb PHP ook naar 4.2.0 omlaag gehaald, dat was de oplossing ook niet. Kan het apache zijn?

  • Rashann
  • Registratie: Maart 2000
  • Laatst online: 24-08 07:20

Rashann

Zoek de hond...

Databeest is geindexeerd?

Probeer anders met een flush() in je while te kijken wat voor informatie er al is weergegeven, misschien looped ie ergens gewoon constant...

If nothing is written below, I was the last to reply...


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Rickbv schreef op 28 augustus 2002 @ 21:21:
Heb net met de "server-gast" gesproken, die zegt dat als hij dezelfde link intern bekijkt, hij binnen 2-3 seconde klaar is? VAAAG

rickmans: ik moet juist alle velden hebben, dus dat maakt niets uit denk :)
Over wat voor verbinding trek je query dan?

Sundown Circus


  • Grum
  • Registratie: Juni 2001
  • Niet online
Je kan de output best wel verkleinen door een leuke combo van JS & CSS. Tis redelijk aan te raden om daar eventjes naar te kijken.

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Is opzich geen slecht idee, bedankt! :)

Maar wat ik zo raar vind, als ik die server gast moet geloven gaat het bij hem lokaal wel gewoon snel. En zo'n grote loop is dit toch ook niet?

Verwijderd

Rickbv schreef op 28 augustus 2002 @ 21:21:
rickmans: ik moet juist alle velden hebben, dus dat maakt niets uit denk :)
benchmarks wijzen uit dat alle velden appart noemen veel sneller is dan het * gebruiken, dus zowiezo altijd doen.

  • rickmans
  • Registratie: Juli 2001
  • Niet online

rickmans

twittert

Rickbv schreef op 28 augustus 2002 @ 21:21:
Heb net met de "server-gast" gesproken, die zegt dat als hij dezelfde link intern bekijkt, hij binnen 2-3 seconde klaar is? VAAAG

rickmans: ik moet juist alle velden hebben, dus dat maakt niets uit denk :)
ow zeker wel :)

Nu zoekt het ding naar alle velden en hij weet niet wanneer hij klaar is, indien je velden aangeeft dan zoekt hij dus alleen naar de betrokken velden :) dus weet hij wanneer hij klaar is.

Don't mind Rick


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

rickmans schreef op 29 augustus 2002 @ 18:18:
ow zeker wel :)

Nu zoekt het ding naar alle velden en hij weet niet wanneer hij klaar is, indien je velden aangeeft dan zoekt hij dus alleen naar de betrokken velden :) dus weet hij wanneer hij klaar is.
Drugs are bad, mkay :{

Ontopic: de fout moet in je laatste echo zitten, want het gegeven foutregelnummer is vaak het regeltje na de fout, niks waardeloos, gewoon een onvolkomen statement :)

De enige fout die ik zo direct zie staan is die &#8364 - daar moet een puntkomma achter! Check it out & suc6.

[ Voor 0% gewijzigd door Rataplan op 29-08-2002 18:50 . Reden: Het zal wel een euro zijn :) ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Foxboy & rickmans: ik heb het veranderd, maar geen resultaat. Maar zoals ik al zei, hij weet me wel te melden dat er 174 records aanwezig zijn, dus de traagheid ligt dan niet bij MySQL zou je zeggen?

Rataplan: ik heb een puntkomma aan dat euro teken toegevoegd, ook geen resultaat.

Het mysterie gaat verder... :D

  • rickmans
  • Registratie: Juli 2001
  • Niet online

rickmans

twittert

Rickbv schreef op 29 augustus 2002 @ 19:14:
Foxboy & rickmans: ik heb het veranderd, maar geen resultaat. Maar zoals ik al zei, hij weet me wel te melden dat er 174 records aanwezig zijn, dus de traagheid ligt dan niet bij MySQL zou je zeggen?

Rataplan: ik heb een puntkomma aan dat euro teken toegevoegd, ook geen resultaat.

Het mysterie gaat verder... :D
En als je je query uitvoert in phpmyadmin oid?

Don't mind Rick


  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Sorry, moet nu even weg...

Als ik terug kom zal ik het proberen, en ik zelf had het volgende plan bedacht:

bij elke actie ff de microtime laten displayen? Dus na de SQL query en in de loop. Is dat wat?

  • Rashann
  • Registratie: Maart 2000
  • Laatst online: 24-08 07:20

Rashann

Zoek de hond...

Probeer eens van je while dit te maken:
code:
1
while ($res = mysql_fetch_array($query) && $q < $count)


Dan zou hij in ieder geval niet oneindig moeten kunnen loopen...

[ Voor 0% gewijzigd door Rashann op 29-08-2002 21:13 . Reden: iets teveel getypt :) ]

If nothing is written below, I was the last to reply...


  • RvdB
  • Registratie: Februari 2001
  • Laatst online: 11-02-2025
op line 50 zeg je staat $q++; maar bedoel je line 40? Of staat-ie er twee keer in?

Athlon 800 @ A7V133; 256MB; 40GB, GeForce2MX-GS 205/205


  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
OK, hier de resultaten:

-als ik dit invoer: while($res = mysql_fetch_array($query) && $q < $count) dan komen er geen resultaten meer uit de $res array, hij loopt echter wel?

deze code:
PHP:
1
2
3
4
function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
    }

SCRIPT
PHP:
1
2
3
    $time_end = getmicrotime();
    $time = $time_end - $time_start;
    echo $time;


Zit die server gast hem lokaal te bekijken, staat er parsetime: 0,4nog wat. Bekijk ik hem, komt parsetime er niet eens te staan, want het script stopt na 30seconde :| Ik ga nog ff de max. loop tijd van zo'n script veranderen, kijken wat nu de werkelijke parse time is. Maar dis heeeeel vreemd...

edit:

Line 50 bij mij is line 40 hierboven...

Het is net 1 keer snel gegaan, toen stond het zooitje binnen 28seconde op't scherm...

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
*schop kick pats boem knal :D

  • Vulpecula
  • Registratie: April 2001
  • Laatst online: 18-08 21:00
Vervang dit eens in gewone quotes.

PHP:
1
if ($_GET['action']=="view") {


Dus wordt het
PHP:
1
if ($_GET['action']=="view") {


Doe dit overal in je PHP code. Wanneer er HTML wordt weergegeven kun je die wel gebruiken, bijv.

PHP:
1
echo "Ik heet 'Frank Schers&#039";

  • Grum
  • Registratie: Juni 2001
  • Niet online
frankschers: dat is een bug van Parse maar die gasten zijn te lui om et te fixen. (:+)

Rickbv: add een counter, laat hem 'exit'en na 10 items en check of alles klopt.

Ow! je zal prolly wel een brakke modemlijn hebben en een slechte verbinding naar die server en daardoor dus door slechte snelheid de max-execution-time overschreiden.

  • Vulpecula
  • Registratie: April 2001
  • Laatst online: 18-08 21:00
Grum: Klopt zag het net ook.

Hier zal het denk ik niet aan liggen, maar het is gewoon een tip.
Haal de quote's weg bij connect, dus zo:

PHP:
1
2
$server = mysql_connect($db_host,$db_user,$db_pass) or die("connection error"); 
              mysql_select_db($db_name,$server) or die("couldn't select db");

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Ok, bedankt voor de PHP-code correcties, je leert jezelf wat aan, maar weet eigelijk niet eens of het allemaal wel helemaal correct is :)

Maar wat ik nog niet helemaal snap: slechte verbinding
Ok, het is casema die in de spits niet sneller gaat dan 2kb/sec. Maar ik dacht dat het hele zooitje eerst op de server geparsed werd, en daarna door naar mij werd gestuurd?

Owja, heb blijkbaar over een paar reacties heen gelezen, ik zal dat flush ed ook wel ff proberen...

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Waarom geef je de link niet even, dan kunnen wij kijken of hier het script ook stopt.

Ik blijf er iig vrij nuchter onder....


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Grum schreef op 31 augustus 2002 @ 22:25:
Ow! je zal prolly wel een brakke modemlijn hebben en een slechte verbinding naar die server en daardoor dus door slechte snelheid de max-execution-time overschreiden.
Dat zeg ik :P
maartenvdv schreef op 01 september 2002 @ 13:13:
Waarom geef je de link niet even, dan kunnen wij kijken of hier het script ook stopt.
Goed plan... linkje please Rickbv?

Sundown Circus


  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Linkje komt er zo aan, eerst nog even tweaker-proof maken :P (kan ff duren, de gast van wie die server is zit weer op school en is vergeten z'n ftp open te zetten :( )

Verwijderd

Om te testen: je query zo aanpassen dat er maar 1 record wordt teruggegeven en kijken wat er gebeurd?
Is dit iets? Ben nog nieuw in php en mysql.

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 30-08 16:58
Heb nu een andere pagina gemaakt, maar nu krijg ik na 44 entry's eenzelfde probleem. Max. exe. time of 30seconds ends. Ik zou van de vorige een link geven, maar die is inmiddels al weer weg. Vandaar dat ik ff de nieuwe geef.

Het probleem is al iets uitgebreider getest:
-local: supersnel, geen vertraging
-@school@kennisnet: lichte vertraging
-56k6 modem: niet snel, toch komtie binnen
-casema hier en bij iemand anders: execution time error.

Wat valt hier aan te doen? :/

edit:

FOK! de link vergeten |:(

http://80.126.46.12/ipaq/


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 20:27
Max execution time prob ligt bij de server en niet bij de client.

  • Mawlana
  • Registratie: Juli 2002
  • Laatst online: 17:42
Ik krijg alles te zien, maar het is vrij langzaam :{ !
Wat d8 je van mysql_fetch_assoc() of mysql_fetch_row() ;) (voor meer uitleg zie PHP.net :D)
mysql_fetch_row() is het snelst
(Ja, ik kan het weten. Ik had een tijdje geleden ook hetzelfde probleem met een van m'n scripts.)

  • djack
  • Registratie: September 2002
  • Laatst online: 11-11-2024
Het geen je kan doen is het weer geven van het result opsplitsen in 10 of 20 per page en met een kleine functie die reageert op een next button of zo de volgende 10 of 2 laten ophalen.

Because Great minds Think alike


Verwijderd

Page komt hier binnen, maar heeeeeeeel traag. Maximum 6 a 7 k/sec.
En volgens mij is er met je script ook niks fout... heb je er al eens aan gedacht dat de routing van die server naar de buitenwereld wel eens brak kan zijn waardoor je een timeout krijgt simpelweg omdat er massaal retransmissions gebeuren door de webserver... ? En de ene provider kan er dan meer last van hebben dan de andere... wat zou kunnen verklaren dat het via Casema niet gaat, en via een andere weg wel zeer traag werkt...

  • Grum
  • Registratie: Juni 2001
  • Niet online
De originele html is: 53761bytes

Mijn versie is nu (ziet er 100% identiek uit) 18664 bytes.

Ik zal nog eventjes doorgaan en het resultaat online zetten.
Ik ga voor de ~9-11kb .. btw dit heb ik eerder al gesuggereerd.

Wip: 18664 -> 16036 -> 6573 -> 6293

hier enzo

Have fun (btw de code is niet naar me tevredenheid, kan kleiner, zeker netter maar het is alleen maar om je op een idee te brengen ;))
Pagina: 1