[PHP] Pagina laadt traag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey,

Ik heb een php script geschreven voor mijn scoutssite (http://www.dezwaluw.org/), zodat de vergaderingen bij elke tak uit een txt file worden gelezen, de eerstvolgende vergadering wordt gezocht en alle vergaderingen worden geprint. Nu duren die php paginas een beetje langer om te laden (niet zo veel, maar toch valt het op), dus ik vraag mij af hoe dit komt.
Ik doorloop de vergaderingen wel 2x, maar het zijn er maar 35 ofzo, dus dit kan toch niet de reden zijn? Of ligt het gewoon bij de fopen functie, die sowieso wat tijd in beslag neemt?

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
//Input inlezen van txt file met vergaderingen en bijhorende data.
      $file = fopen("verg/Jvg.txt", "r");
    $i=0;
    
    while (!feof($file)){
        $line = fgets($file, 4096);

        $pieces = explode("=", $line);
        $datum = explode("-", $pieces[0]);

        $jaar = (int)$datum[0];
        $maand = (int)$datum[1];
        $dag = (int)$datum[2];
        $datumke = $jaar . '-' . $maand . '-' . $dag . ' 14:00:00';
        $datetime = new DateTime($datumke);

        $datums[$i]=$datetime;
        $verg[$i]=$pieces[1];

        $i++;
    }
    fclose($file);


    //Eerstvolgende vergadering zoeken
    $currentYear = (int)date("Y");
    $currentMonth = (int)date("m");
    $currentDay = (int)date("d");
    $currentSom = $currentYear*365 + $currentMonth*30 + $currentDay;
    $vergNr;

    for ($j = 0; $j < $i; $j++){
        $year = (int)$datums[$j]->format('Y');
        $month = (int)$datums[$j]->format('m');
        $day = (int)$datums[$j]->format('d');
        $som = $year*365 + $month*30 + $day;

        if ($som > $currentSom){
            echo '<table class="bodytekst" width="500"><tr><th align="left"><a href="#verg">';
            echo 'Zaterdag ' . $day . '/' . $month . '/'  . $year;
            echo '</a></th><th>' . $verg[$j]. '</th></tr></table>';

            $vergNr = $j;
            $j = $i;
        }
    }
    if ($vergNr == -1) echo '<strong>Geen vergadering in de kalender</strong><br />';
?>
...(wat html code)
<?php

    //Alle vergaderingen afprinten.
    $tekst1='';
    $tekst2='';
    $tekst3='';
    $tekst4='';

    for ($j = 0; $j < $i; $j++){
        $year = $datums[$j]->format('Y');
        $month = $datums[$j]->format('m');
        $day = $datums[$j]->format('d');
        $vergTekst = $verg[$j];

        if ($j == $vergNr){
            $tekst1 = '<a name="verg"></a>';
            $tekst2 = ' | <a href="#top">Top</a>';
            $tekst3 = '<strong>';
            $tekst4 = '</strong>';
        }

        echo $tekst3 . '<span class="bodytekst_geel">' . $tekst1;
        echo 'Zaterdag ' . $day . '/' . $month . '/'  . $year;
        echo '</span>' . $tekst2 . '<br />' . $vergTekst . $tekst4 . '<br /><br />';

        if ($j == $vergNr){
            $tekst1 = '';
            $tekst2 = '';
            $tekst3 = '';
            $tekst4 = '';
        }
    }

?>

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dit is zegmaar waar databases ook voor uitgevonden zijn ;) Misschien een idee om je daar in te verdiepen? Het doorlopen van tekstbestanden en per regel van alles checken is gewoon niet the way to go.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Lol weet ik, maar dat is voor na mijn examens ;)

Het ligt dus inderdaad aan het inlezen van de txt file volgens jou?

Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Ik zou eens wat tests doen met microtime() om te zien waar het zo lang duurt. Je kunt het ook eens met file_get_contents() proberen, is een stuk makkelijker voor het uitlezen en misschien sneller. Wat is lang trouwens?

[ Voor 5% gewijzigd door Y0ur1 op 14-12-2008 12:19 ]


Acties:
  • 0 Henk 'm!

  • hellfighter87
  • Registratie: Mei 2008
  • Laatst online: 13:22
Ik zou stap voor stap stukken code weg laten en dan kijken hoe snel hij laad. probeer bijvoorbeeld eerst door de tekst file heen te lopen zonder iets er verder mee te doen. als die dan al traag is is je hele basis crap :P

AL ben ik het er wel mee eens dat databases hiervoor zijn uitgevonden is het natuurlijk ook een leuke oefening om dit met text files te doen omdat je die ook nog weleens tegen komt :P

Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 06:21
hellfighter87 schreef op zondag 14 december 2008 @ 12:21:
Ik zou stap voor stap stukken code weg laten en dan kijken hoe snel hij laad. probeer bijvoorbeeld eerst door de tekst file heen te lopen zonder iets er verder mee te doen. als die dan al traag is is je hele basis crap :P

AL ben ik het er wel mee eens dat databases hiervoor zijn uitgevonden is het natuurlijk ook een leuke oefening om dit met text files te doen omdat je die ook nog weleens tegen komt :P
Dat zou ik dus zelf nooit doen. Wat Y0ur1 zegt is al genoeg. Zet in je code op diverse plekken het aantal seconden dat hij er over doet om daar te komen en klaar. Code weghalen om te kijken waar het leg zit is alleen maar fout gevoelig.

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Even naast het probleem dat je hebt met de snelheid zou ik je willen wijzen op een probleem dat niet elke dag in het jaar een uniek nummertje oplevert in je berekening.
bijvoorbeeld 31 januari en 1 februari:
code:
1
2
2009*365 + 1*30 + 31 = 733346
2009*365 + 2*30 + 1  = 733346

Ik weet niet of dit voor jou een probleem gaat opleveren, maar het zou al beter zijn als je "The day of the year (starting from 0)" gebruikte ( date("z") )
PHP:
1
date("y")*365 + date("z");
Maar ook deze manier levert volgens mij soms dubbele resultaten op, bij bv een schrikkeljaar.

Ik zelf zou dan ook gebruik maken van een timestamp, zoals time() en mktime() (het aantal seconden dat verstreken is sinds 1 januari 1970). Voorbeeld:
PHP:
1
2
3
4
5
        $year = (int)$datums[$j]->format('Y');
        $month = (int)$datums[$j]->format('m');
        $day = (int)$datums[$j]->format('d');
        //$som = $year*365 + $month*30 + $day;
        $som = mktime( 0, 0, 0, $month, $day, $year );

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok thx KompjoeFriek, het kon zijn dat het geen probleem leverde, maar mktime lijkt me sowieso veiliger :)

De file openen en inlezen duurt idd veel langer dan de rest, zoals de microtime aantoonde.

De functie file_get_contents() maakt dus van de file een gehele string. Hoe lees ik die dan best regel per regel in? Of doe ik vb een explode van de gehele string?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Verwijderd schreef op zondag 14 december 2008 @ 20:51:
De file openen en inlezen duurt idd veel langer dan de rest, zoals de microtime aantoonde.
Met een bestand van slechts 35 vergaderingen hoor je nou niet bepaald een merkbaar lange tijd bezig te zijn met dit soort for-loops. Althans, tenzij je kilobytes aan tekst per vergadering wegschrijft? Of er allemaal verlopen vergaderingen in blijven staan ofzo.
De functie file_get_contents() maakt dus van de file een gehele string. Hoe lees ik die dan best regel per regel in? Of doe ik vb een explode van de gehele string?
Er is ook nog 'file()' die een file per regel in een array stopt. Maar als je fgets-loop nu erg langzaam is, verwacht dan geen wonderen van file_get_contents of file, je werkt nu niet met een enorm kleine buffer, dus heel slecht hoort je performance nu niet te zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Qua tekst zijn de vergaderingen nooit lang, vb hier: http://www.dezwaluw.org/verg/Jvg.txt
De verlopen vergaderingen staan hier in ja, maar dat is deel vd 35 die ik telde.

Nuja, zoals ik al zei merk je de vertraging op zich niet echt op, maar als je het dan vergelijkt met een normale html pagina valt het wel op (behalve als die dan weer in de cache zit), vb Contact ofzo. En dat vind ik (persoonlijk) wel vervelend.

Heeft het mss te maken met de parameter vd fgets? "$line = fgets($file, 4096);"
Maar dat is zeker de enige manier om een volledige regel in te lezen?

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 15:51
Verwijderd schreef op zondag 14 december 2008 @ 21:26:
Heeft het mss te maken met de parameter vd fgets? "$line = fgets($file, 4096);"
Maar dat is zeker de enige manier om een volledige regel in te lezen?
ACM schreef op zondag 14 december 2008 @ 21:09:
Er is ook nog 'file()' die een file per regel in een array stopt. Maar als je fgets-loop nu erg langzaam is, verwacht dan geen wonderen van file_get_contents of file, je werkt nu niet met een enorm kleine buffer, dus heel slecht hoort je performance nu niet te zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik bedoelde met fgets, ik lees wel degelijk alles, toch bedankt...

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Als je het toch op deze manier doet (tekstfile ipv database), kun je net zo goed Javascript gebruiken om de boel uit te lezen. Scheelt weer load op de server.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok ik ben nu de fgets, file_get_contents en file aan het vergelijken, maar ze zien er hetzelfde uit qua tijd (misschien wel te verwachten doordat het maar 35 lijnen zijn). Ook als ik met web developer de cache uitschakel duurt het even lang...

http://www.dezwaluw.org/2/jvg.php -> file
http://www.dezwaluw.org/2/jvg2.php -> fgets
http://www.dezwaluw.org/2/jvg3.php -> file_get_contents

Acties:
  • 0 Henk 'm!

  • MuisM4t
  • Registratie: Mei 2007
  • Niet online
Zet het gewoon eens in een database. Dat is echt geen rocketscience hoor, zeker niet als je phpmyadmin gebruikt. Zie bijvoorbeeld hier. Met basiskennis van SQL kun je dit al prima doen.

Mocht je het per se in een textfile willen aanpassen, schrijf dan een script dat het periodiek in de database zet.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op zondag 14 december 2008 @ 21:26:
Nuja, zoals ik al zei merk je de vertraging op zich niet echt op, maar als je het dan vergelijkt met een normale html pagina valt het wel op (behalve als die dan weer in de cache zit), vb Contact ofzo. En dat vind ik (persoonlijk) wel vervelend.

Heeft het mss te maken met de parameter vd fgets? "$line = fgets($file, 4096);"
Maar dat is zeker de enige manier om een volledige regel in te lezen?
Vergelijk je het nu met een willekeurige php pagina of met een html pagina? Want html is altijd sneller ( hoeft gewoon geen php-parser geladen te worden, inhoud zelf hoeft niet door de server geparsed te worden etc ), normaal gesproken levert een goed geconfigureerde php geen merkbare vertraging op.

Maar als je enige referentie kader op deze server alleen maar html is, dan kan het lonend zijn om te kijken of php wel goed / optimaal geinstalleerd is.

Gooi gewoon eens een bestandje op je server neer met :
PHP:
1
2
3
<?php
echo "hello world";
?>

en kijk of je hier ook het idee van hebt dat het traag is.

Want je code is nou niet echt optimaal ( imho ) maar snelheidsoptimalisaties zijn niet nodig zolang het alleen maar dit doet. Daar win je gewoon reeel gezien niets mee...
MuisM4t schreef op zondag 14 december 2008 @ 23:50:
Zet het gewoon eens in een database. Dat is echt geen rocketscience hoor, zeker niet als je phpmyadmin gebruikt. Zie bijvoorbeeld hier. Met basiskennis van SQL kun je dit al prima doen.

Mocht je het per se in een textfile willen aanpassen, schrijf dan een script dat het periodiek in de database zet.
Wat zou hij ermee opschieten qua snelheid om het in een dbase te zetten? Ik schat dat php sneller een txt file van 35 regels uitleest dan dat er een dbase call plaatsvind ( verbinding opbouwen, query versturen, query verwerken door dbase en dan het resultaat nog eens interpreteren tov 35 regels inlezen en interpreteren? )

Toekomstgericht gezien geef ik je gelijk want dan schat ik dat er meer dan 35 regels gaan komen etc etc. Maar puur sec voor dit probleem is een dbase met 1 tabel met 35 rows erin imho niet de oplossing...

[ Voor 27% gewijzigd door Gomez12 op 15-12-2008 00:08 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Idd Gomez12, dat zijn volledig mijn redenen dat ik niet direct voor een db ben gegaan. Ik ken genoeg van MySQL om er een te maken, maar dat vond ik op het moment te veel werk/de moeite niet waard. Ik ga het allesinds doen na mijn examens, en dan misschien ook meer doen met die db. Maar op het moment leek een txt file meer dan voldoende.

Ik heb nu zo een test erop gegooid: http://www.dezwaluw.org/2/test.php
Ik vind het moeilijk te vergelijken echter. Bestaat er geen tool of dergelijke om te meten hoe snel paginas worden geladen? Want zo op gevoel afgaan lijkt mij niet zo accuraat.
Ik vergeleek idd met html paginas, omdat daarmee het verschil opviel. Maar ik dacht ook niet dat ik dat verschil tussen html en php paginas zou mogen opmerken.

Zeker bedankt voor het meedenken iedereen :)

Acties:
  • 0 Henk 'm!

  • harrald
  • Registratie: September 2005
  • Laatst online: 16-09 08:44
Verwijderd schreef op maandag 15 december 2008 @ 09:46:
Idd Gomez12, dat zijn volledig mijn redenen dat ik niet direct voor een db ben gegaan. Ik ken genoeg van MySQL om er een te maken, maar dat vond ik op het moment te veel werk/de moeite niet waard. Ik ga het allesinds doen na mijn examens, en dan misschien ook meer doen met die db. Maar op het moment leek een txt file meer dan voldoende.

Ik heb nu zo een test erop gegooid: http://www.dezwaluw.org/2/test.php
Ik vind het moeilijk te vergelijken echter. Bestaat er geen tool of dergelijke om te meten hoe snel paginas worden geladen? Want zo op gevoel afgaan lijkt mij niet zo accuraat.
Ik vergeleek idd met html paginas, omdat daarmee het verschil opviel. Maar ik dacht ook niet dat ik dat verschil tussen html en php paginas zou mogen opmerken.

Zeker bedankt voor het meedenken iedereen :)
Voor firebug heb je een extensie genaamd yslow. die laat je heel precies zien hoe lang je pagina erover doet om te laden.

Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
naja tekstbestanden zijn sneller wanneer ze klein zijn, en het script maar weinig keren aangeroepen word. Daarna zou ik toch gaan voor databases, die caching, prepared statements, fulltext searches etc bieden. Stukken makkelijker bij te houden, meer features, sneller bij grotere datasets.

Ik zou het je toch aanraden om (al is het maar vanwege toekomstvoorbereiding) een database aan te knopen.

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op maandag 15 december 2008 @ 09:46:
Ik heb nu zo een test erop gegooid: http://www.dezwaluw.org/2/test.php
Ik vind het moeilijk te vergelijken echter. Bestaat er geen tool of dergelijke om te meten hoe snel paginas worden geladen? Want zo op gevoel afgaan lijkt mij niet zo accuraat.
Gooi de pagina 1000x door wget en pak de gemiddelde tijd.
YSlow etc kan ook nuttig zijn, maar die meet maar 1x. Internet gaat over te veel schijven om uit 1 meting iets zinnigs te halen.

Zo op gevoel is an sich niet accuraat, maar dat was toch ook je eerste graadmeter waarom je het wilde versnellen? Als je het met je 1e pagina nog steeds merkt en met je hello world pagina niet meer dan ligt het niet aan je php-installatie maar aan je code ( alhoewel ik niet zie waaraan als je inderdaad maar rond de 35 regels hebt ). Merk je het nu niet meer op beide pagina's dan vermoed ik eerder dat je broertje net wou gaan gamen / dat je browser nog je html pagina in zijn cache had staan / dat je provider een transparante proxy gebruikt waar de html pagina nog in stond etc etc.

Heel simpel gezegd, je constateerde eerst zelf een probleem. Waar is dat probleem nu?
Je kunt tot in de oneindigheid aan die code gaan sleutelen en optimaliseren, maar het is vrij simpele code die gewoon snel genoeg moet kunnen draaien. Draait het niet snel genoeg dan ligt het zeer waarschijnlijk niet aan deze code ( mag gewoon geen vertraging opleveren ) maar ergens anders aan.
Ik vergeleek idd met html paginas, omdat daarmee het verschil opviel. Maar ik dacht ook niet dat ik dat verschil tussen html en php paginas zou mogen opmerken.
Bedenk wel dat het uitvoeren van een simpele php pagina ongeveer 10x zo zwaar is voor je server als het serveren van 1 statisch html bestandje.
In principe zou je het verschil niet mogen opmerken op huidige servers ( als iedereen alleen maar statische html gebruikte was een 486 nog genoeg als webserver ), maar met een super overloaded shared hosting kan je dit soms toch nog wel merken.

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Gomez12 schreef op maandag 15 december 2008 @ 23:01:
Internet gaat over te veel schijven om uit 1 meting iets zinnigs te halen.
Internet gaat niet over schijven, maar door tubes!

https://niels.nu


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, bedankt voor de info, best interessant :)

Al de pagina's zijn nu in php omdat ik de header en footer nu overal include, dus je merkt geen verschillen meer.

Op naar een db hiervoor :)
Pagina: 1