[php] Hoge parsetime bij iets meer code

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Hallo Tweakers,
Ik zit met een vraag waar ik eigenlijk al een tijdje mee zit.

Ik werk namelijk met PHP en gebruik een scriptje om de parsetime te berekenen. Dat werkt naar mijn weten prima.
Alleen af en toe is mijn parsetime bijna 10 keer (!!) zo hoog als ik ook maar 1 regeltje html meer heb in een file dat geinclude wordt door de index.

Een voorbeeldje, op de index.php pagina waar weinig gebeurt op een paar querys na is de parsetime zo'n 0.007 seconden (gemiddeld bij 5x refreshen ofzo).
Ga ik echter naar een pagina (andere html code dat wel, maar dat maakt niet uit) met wat meer html code dan krijgen we dit:
Parsetime: 0.0733 seconden

Ook gemiddeld na 5 keer refreshen!!! Is dit een bug van PHP of hoort dit ofzo? Want ik vind dit echt héél vreemd. Op verzoek kan ik wel de geinclude pagina's posten hier. Maar het ene is wat html voor demo nieuwsberichtjes, en de ander is een testpagina in html van mij, om dus te kijken of de parsetime inderdaad 10x zo hoog werd na iets meer HTML code.

Ik hoop dat iemand mij met dit probleem/deze vraag kan helpen! Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • BlackWhizz
  • Registratie: September 2004
  • Laatst online: 08-12-2024
Nou, euhm schokkend?!

PHP bouwt en soort van Cache op. Die ene pagina staat in de cache, de andere niet.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
BlackWhizz schreef op zondag 25 januari 2009 @ 21:32:
Nou, euhm schokkend?!

PHP bouwt en soort van Cache op. Die ene pagina staat in de cache, de andere niet.
Ja, ik vind dit toch wel schokkend hoor. Niet om het een of het ander, maar ik wil mijn server zo min mogelijk belasten. Maargoed, dat heeft verder niks met dit topic te maken :P

Waarom staat de ene pagina wel in de cache, en de ander niet? Want na een aantal x refreshen zou die toch ook gecached moeten worden dan ofzo. Want in de included file is pure statische html. Niks dynamisch ofzo.
In sommige andere pagina's worden wel kleine stukjes php code gebruikt.

Maar het is echt dat soms bij één regel meer de parsetime 10x zo hoog wordt en als die regel weer weg is, dat de parsetime weer normaal is

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21-09 10:43

Matis

Rubber Rocket

BlackWhizz schreef op zondag 25 januari 2009 @ 21:32:
Nou, euhm schokkend?!

PHP bouwt en soort van Cache op. Die ene pagina staat in de cache, de andere niet.
Klopt helemaal, het heeft met zo veel factoren te maken. Met de loopback van de server, de serverload, het kan ook te maken hebben met eventuele gecachte gegevens zoals BlackWhizz schrijft.

Ik zal je er niet druk om maken, tenzij je over een echo 2 minuten doet :P

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Haha oke :P nee maar ik vind het zo vreemd dat één extra regeltje html voor zoveel 'opschudding' kan zorgen?

Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
PHP cached standaard helemaal niets. Of je moet hiervoor een module geinstalleerd hebben zoals APC of zend optimizer.

als er een file geinclude wordt zal het bestand ingelezen moeten worden vanaf het file system. Hierin zit hoogstwaarschijnlijk de extra tijd. Maar dat zou je kunnen testen door de html gewoon plat in hetzelfde bestand te plakken en een include van het bestand te doen en de parsetime van deze operaties te vergelijken.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Volgensmij heeft mijn host wel ZEND Optimizer :P
Maar als ik de html er rechtstreeks in de code plak enzo dan is het 'probleem' er nog steeds.

Echt bizar gewoon :S...

Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Wat nou als je dat stuk code 2 keer erin plakt? Wordt hij dan nog trager?

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Luqq schreef op maandag 26 januari 2009 @ 18:41:
Wat nou als je dat stuk code 2 keer erin plakt? Wordt hij dan nog trager?
Jep, hoe meer html hoe slomer. ook als ik het direct in index.php zet buiten de <?php tags
(<?php code.. ?> die html code <php nog wat php ?>)

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
PHP wacht totdat je browser die ene string ontvangen heeft. Zie ook http://bugs.php.net/bug.php?id=18367

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Dat is niet hetzelfde als mijn probleem denk ik. Ik zet de html niet in een string, maar buiten de php-tags. Ook heeft het voor zover ik heb kunnen testen, geen nut om die html over verschillende files te verdelen en dan apart te includen. Toch bedankt voor je reply :)

Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Saven schreef op maandag 26 januari 2009 @ 19:10:
Dat is niet hetzelfde als mijn probleem denk ik. Ik zet de html niet in een string, maar buiten de php-tags. Ook heeft het voor zover ik heb kunnen testen, geen nut om die html over verschillende files te verdelen en dan apart te includen. Toch bedankt voor je reply :)
Kan je eens een voorbeeld geven van de combinatie van php+HTML die zo 'problematisch' is?

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
gertvdijk schreef op maandag 26 januari 2009 @ 19:13:
[...]

Kan je eens een voorbeeld geven van de combinatie van php+HTML die zo 'problematisch' is?
Oké, komt ie:

stukje index.php:
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
try
{
    //-----------------------------------------
    // Load core and needed classes
    //-----------------------------------------
    require_once(core.'core.php');
    $core = new core( array('sess','user') );
    
    //-----------------------------------------
    // Assign some tpl vars
    //-----------------------------------------
    $core->tpl->assign( array
    (
        'sitename' => sitename,
        'url'      => url,
        'template' => url.'template/',
        
        'logged_in' => $core->user->logged_in,
        'username'  => $core->user->fetch['username'],
        
        'current_time' => nldate(time()),
    ));
    
    //-----------------------------------------
    // Automatically load the controller
    //-----------------------------------------
    $core->load->controller( url() );
    
    //-----------------------------------------
    // Display website
    //-----------------------------------------
    $core->tpl->display('index.php');
}


display functie:
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
    public function display($file, $data=null)
    {
        $file = tpl_dir . $file;
        
        //-----------------------------------------
        // Check if extra vars are added
        //-----------------------------------------
        if( is_array($data) )
        {
            $this->assign($data);
        }
        
        //-----------------------------------------
        // Most important of all, make it work!
        //-----------------------------------------
        if( file_exists($file) )
        {
            //-----------------------------------------
            // Assigned vars to normal vars
            //-----------------------------------------
            extract($this->vars);
            
            //-----------------------------------------
            // Temporary disable notice errors
            //-----------------------------------------
            error_reporting(E_ALL ^ E_NOTICE);
            
            //-----------------------------------------
            // Display the file
            //-----------------------------------------
            include_once($file);
            
            //-----------------------------------------
            // Set error reporting back to normal
            //-----------------------------------------
            error_reporting(E_ALL);
        }
        else
        {
            trigger_error("Template file '".$file."' does not exist", E_USER_ERROR);
        }
    }


Zoals je ziet wordt er alleen maar een file included. En die file bevat dat in mijn test deze code:
HTML:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen

                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>


Bij de bovenstaande code is de parsetime nog maar 0.007 seconden. Als ik ook maar nog een content-top toevoeg:
HTML:
1
2
3
4
5
6
7
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>

Dan wordt de parsetime dus 10x zo hoog.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Html buiten php-tags loopt toch nog steeds langs de php-parser hoor. Het zal imho dus wel met die bug te maken hebben.

Probeer het eens met output buffering aan.


Nu ik je code zie vraag ik me af waarom je pure html wilt gaan includen? Include is voor php code afaik.

Ik gok dat er gewoon intern een buffer is die nu overschreden wordt waardoor er een andere weg gekozen wordt die gewoon trager is.

Ik zou adviseren om gewoon de file in te lezen en dan de contents te echo'en / printen. Op dit moment creeer je een object met alle html code erin.

[ Voor 54% gewijzigd door Gomez12 op 26-01-2009 19:27 ]


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Gomez12 schreef op maandag 26 januari 2009 @ 19:18:
Html buiten php-tags loopt toch nog steeds langs de php-parser hoor. Het zal imho dus wel met die bug te maken hebben.

Probeer het eens met output buffering aan.
Lol,
als ik bovenaan index.php ob_start(); zet, en onderaan index.php ob_end_flush(); dan blijft de parsetime inderdaad heel laag!

Maar is dit wel een goede en nette oplossing? Want ik heb wel eens gehoord dat dat niet de juiste oplossing is voor je problemen ofzo :P
Gomez12 schreef op maandag 26 januari 2009 @ 19:18:
Html buiten php-tags loopt toch nog steeds langs de php-parser hoor. Het zal imho dus wel met die bug te maken hebben.

Probeer het eens met output buffering aan.


Nu ik je code zie vraag ik me af waarom je pure html wilt gaan includen? Include is voor php code afaik.

Ik gok dat er gewoon intern een buffer is die nu overschreden wordt waardoor er een andere weg gekozen wordt die gewoon trager is.

Ik zou adviseren om gewoon de file in te lezen en dan de contents te echo'en / printen. Op dit moment creeer je een object met alle html code erin.
Ja, maar ik werk met templates/views. Waarin ik html gebruik, maar ook veel php variables.

Zoals urls:
PHP:
1
2
3
4
5
6
7
                <div class="content-top-holder">
                    <div class="content-top-left"></div>
                    <div class="content-top">
                        <strong><a href="<?php echo $url; ?>members">Members</a></strong> &rsaquo; Inloggen
                    </div>
                    <div class="content-top-right"></div>
                </div>

[ Voor 51% gewijzigd door Saven op 26-01-2009 19:30 ]


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
- foutje -

[ Voor 81% gewijzigd door Saven op 26-01-2009 19:30 ]


Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Saven schreef op maandag 26 januari 2009 @ 19:24:
Maar is dit wel een goede en nette oplossing? Want ik heb wel eens gehoord dat dat niet de juiste oplossing is voor je problemen ofzo :P
Tja, ligt eraan voor welk doel. Als je het gebruikt als 'oplossing' voor bijvoorbeeld het probleem in '[PHP & MYSQL] Headers already send.' kan je beter het eigenlijke probleem aanpakken, maar als je het bewust en consistent opneemt in je code is er niks op tegen. Het biedt bijvoorbeeld mogelijkheden om nog HTTP-headers te sturen als je al dingen hebt ge-echo'd.

[ Voor 4% gewijzigd door gertvdijk op 26-01-2009 19:32 ]

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
gertvdijk schreef op maandag 26 januari 2009 @ 19:32:
[...]

Tja, ligt eraan voor welk doel. Als je het gebruikt als 'oplossing' voor bijvoorbeeld het probleem in '[PHP & MYSQL] Headers already send.' kan je beter het eigenlijke probleem aanpakken, maar als je het bewust en consistent opneemt in je code is er niks op tegen. Het biedt bijvoorbeeld mogelijkheden om nog HTTP-headers te sturen als je al dingen hebt ge-echo'd.
Maar wat zijn hier de voordelen? Ik betwijfel dat geheugen eerder vrijgegeven wordt, en in de extra execution time (niet parse time) wordt de cpu niet belast.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
In dit geval gebruik ik het dus zodat mijn parsetime normaal blijft. Alleen weet ik niet precies waarom dit nou werkt. Misschien dat iemand kan uitleggen? :$
Maar zoals ik het nu dan heb met ob_start() en ob_end_flush boven en onderaan index.php is het niet ineens 'vieze' code?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Het gebruiken van output buffering zorgt niet per definitie voor slechte code. Wat wel voor slechte code kan zorgen is premature optimization, en hoewel je hier toevallig een relatief aardige winst boekt, ben ik niet echt overtuigd dat jouw script optimalisatietrucs nodig heeft. :)

{signature}


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Voutloos schreef op maandag 26 januari 2009 @ 19:54:
Het gebruiken van output buffering zorgt niet per definitie voor slechte code. Wat wel voor slechte code kan zorgen is premature optimization, en hoewel je hier toevallig een relatief aardige winst boekt, ben ik niet echt overtuigd dat jouw script optimalisatietrucs nodig heeft. :)
Welke winst precies?

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Hm 'voorbarige optimalisatie' kan niet echt kwaad lijkt me toch? :P Maar iig bedankt :)
Alleen zit ik nu met nog één resterende vraag, wellicht een beetje offtopic maar het is toch een navolging op de oplossing.

Ik gebruik voor mijn template engine ook een fetch() functie. Die de output alleen maar returned en niet echo't of include:
Daarvoor gebruik ik ook output buffering:
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
            //-----------------------------------------
            // Assigned vars to normal vars
            //-----------------------------------------
            extract($this->vars);
            
            //-----------------------------------------
            // Temporary disable notice errors
            //-----------------------------------------
            error_reporting(E_ALL ^ E_NOTICE);
            
            //-----------------------------------------
            // Get the files content
            //-----------------------------------------
            ob_start();
                include_once($file);
                $output = ob_get_contents();
            ob_end_clean();
            
            //-----------------------------------------
            // Set error reporting back to normal
            //-----------------------------------------
            error_reporting(E_ALL);
            
            //-----------------------------------------
            // Spit those rhyms!
            //-----------------------------------------
            return $output;


zoals je ziet gebruik ik daar ob_start, get_contents en end_clean.

Maar in de index.php gebruik ik ook al ob_start() en ob_end_flush();

Als ik die fetch methode gebruik (bijvoorbeeld om een email-body layout op te halen) en dus ook nog een keer ergens verderop de display() methode gebruik (de layout moet immers weergegeven worden) geeft dat dan geen problemen?
Ik heb het getest, en het werkt wel. Maar het ziet er niet logisch uit in mijn ogen.
Of is het soms normaal om 2 keer ob_start() te gebruiken en 2 keer de buffer leeg te gooien.
Mij lijkt namelijk dat eenmaal de buffer leeg is, hij niet nog een keer geleegd kan worden ofzo omdat er niks in zit :P

help please? :$
die milliseconden :9

[ Voor 4% gewijzigd door Saven op 26-01-2009 20:05 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Een bepaalde regel code wordt 3ms eerder uitgevoerd. Maar de cpu wordt zwaarder belast door de output caching en ik betwijfel dat er eerder geheugen wordt vrijgemaakt door PHP.
Pagina: 1