Hoofdcategorieën
Topicacties

[PHP5] Autoload klassestructuur en cachen klassen serverside

Pagina: 1

Reageer Nieuw Topic
Berichten: 327
Reg. datum: 16 oktober 2002

Hallo,

Ik zit met volgend probleempje: ik heb een webapplicatie die bestaat uit een zeer uitgebreide klassenstructuur met zowel abstracte klassen als heel wat overerving. Alle klassen zitten in 1 folder en voor de makkelijkheid heb ik alle klassen die bij elkaar horen in subfolders gestoken (of dat een goed idee is weet ik niet, maar ik heb meer dan 50 klassen, dus handig is het in elk geval wel.

Neem nu volgend voorbeeld: ik heb een klasse (compleet fictief voorbeeld) Hond die overerft van Dier. Hond zit bij mij in /root/hond/Hond.class.php, dier zit in /root/Dier.class.php. Bovenaan elke pagina van de site wordt volgende code uitgevoerd:
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
<?php
define("CLASS_DIR"$_SERVER["DOCUMENT_ROOT"]."/blaat");

/**
 * autoload classes (no need to include them one by one)
 *
 * @uses classFolder()
 * @param $className string
 */

function __autoload($className) {
    $folder = classFolder($className);

    if($folder)
        require_once($folder.$className.".class.php");
}

/**
 * search for folders and subfolders with classes
 *
 * @param $className string
 * @param $sub string[optional]
 * @return string
 */

function classFolder($className$sub = "/") {
    $dir = dir(CLASS_DIR.$sub);
   
    if(file_exists(CLASS_DIR.$sub.$className.".class.php"))
        return CLASS_DIR.$sub;

    while(false !== ($folder = $dir->read())) {
        if($folder != "." && $folder != "..") {
            if(is_dir(CLASS_DIR.$sub.$folder)) {
                $subFolder = classFolder($className$sub.$folder."/");
               
                if($subFolder)
                    return $subFolder;
            }
        }
    }
    $dir->close();
    return false;
}
?>

Stel ik heb in een scriptje Hond nodig, dan doe ik new Hond();. Dit scriptje zal dan Hond zoeken en inladen.

Tot hier alles perfect, ik werk al een tijdje zo en dat gaat goed.

Wat ik nu wil is dat ik alle klassen kan cachen op mijn server, zodat ik ze niet moet inladen. Op die manier hoop ik de laadtijden van mijn pagina's te verbeteren.

De eerste vraag is: kan dit eigenlijk wel?
De tweede vraag is: hoe ;)

Ik ben dus aan het zoeken naar een caching systeem dat al die klassen eigenlijk altijd "voorhanden" houdt.

Ik heb al heel wat rondgesnuffeld in het Zend framework (Zend.Cache), maar voorzover ik weet is dit enkel om pagina's te cachen en niet zozeer classes (http://framework.zend.com/manual/en/zend.cache.html). Andere google probeersels (zoals http://www.google.be/sear...cial&client=firefox-a) halen niet veel uit.


Iemand die mij op weg kan helpen? Vooral wat betreft de keywords waarop ik moet zoeken?
Thanks.
 
blaat
Berichten: 2.214
Reg. datum: 12 maart 2001

Zend optimizer doet dat volgens mij. Of APC of php accelerator.

http://www.google.nl/sear...a=&btnG=Google+zoeken

Brakkie wijzigde dit bericht 06-07-2008 13:40 (68%)

Systeem | Als het leven geen zin heeft dan maakt het maar zin!

Berichten: 610
Reg. datum: 08 augustus 2005

Je kunt beter kijken naar een ander soort naamgeving. Geef je classes een naam die te herleiden is naar het path. In Zend Framework wordt dit gedaan met underscores. Je hoeft dan geen recursieve dir functie te gebruiken.

class mail_smtp : /mail/smtp.class.php
class user_profile_attachments : user/profile/attachments.php

Met Google Maps coole applicaties / websites bouwen? Kom werken bij SWIS!

anti voetbal en slechte djs!

Ik denk dat het best enorm inefficient is om bij elke request een directory door te zoeken voor files die (in principe) toch bijna nooit veranderen in de praktijk. Ik denk dat je heel de classFolder functie kan vervangen als je gewoon alle classes in 1 map gooit. Als je class namen en dergelijke gewoon logisch zijn dan is dat helemaal geen probleem. Of je nou 10,20,50 of 100 classes heb staan.

Wat ik zou doen als ik jou was is met een tooltje (sorry ben even de naam kwijt) je script laten runnen en daarin controleren welk deel van je script het langst duurt qua uitvoeren. Als je dat niet gedaan heb dan kan je eigenlijk bijna niet weten waarop die moet wachten.

(Er valt trouwens al redelijk wat te vinden over optimalisatie als je even de search gebruikt :) )
 
I O+ Code

quote:
BarthezZ schreef op zondag 06 juli 2008 @ 13:42:
Wat ik zou doen als ik jou was is met een tooltje (sorry ben even de naam kwijt) je script laten runnen en daarin controleren welk deel van je script het langst duurt qua uitvoeren. )
http://xdebug.org/ ;)
Berichten: 2.074
Reg. datum: 02 april 2002

Je zou al je klassen in folders op kunnen delen, en een losse folder maken met symlinks naar al deze klassen. autoload hoeft dan slechts in die folder met symlinks te kijken.

Met behulp van een shell scriptje kun je die folder met symlinks gemakkelijk laten updaten.

Workstation: Intel Q6600, 4GB, raptor 136GB, 8800GTS, Eizo 21" tft, Iiyama 19" crt, Ubuntu Hardy
Server: Intel Q6600, 4GB, 2.6TB, Debian Testing
Hifi/HT: B&W DM602s3, LCR60s3, DM603s1; Denon 2805; Sanyo Z5

blaat
Berichten: 2.214
Reg. datum: 12 maart 2001

PHP doctrine (een ORM framework) zet volgens mij al z'n klassen in 1 file bij de eerste aanroep. Helpt ook aardig in performance. (mits je een code cache gebruikt)

Systeem | Als het leven geen zin heeft dan maakt het maar zin!

Berichten: 327
Reg. datum: 16 oktober 2002

bedankt voor alle replies tot nu toe, ik zal ze verder onderzoeken de komende dagen :)
 
Berichten: 4.777
Reg. datum: 10 juli 2002

Ik heb een script dat automatisch de directories doorzoekt waarin classes kunnen zitten. Op basis daarvan leg ik dan per class- of interfacenaam het bijbehorende pad vast en genereer een PHP file waarin dit staat. Dat bestand include ik dan, zodat altijd kan worden opgezocht in welk bestand welke class staat, die informatie wordt dan in de __autoload gebruikt. Werkt erg goed is mijn ervaring tot nu toe.

Music is an expression of pure emotion

Berichten: 4.777
Reg. datum: 10 juli 2002

Ik las trouwens dat in PHP 5.3 namespaces komen, dan kun je het al een stuk netter oplossen. Toch zou ik dan nog mijn eigen oplossing voornamelijk gebruiken, aangezien ik meestal graag meerdere klassen en interfaces in 1 bestand wil hebben, en niet altijd de naam van het bestand wil relateren aan de inhoud. (Met dat laatste bedoel ik vooral dat ik niet altijd de naam van de class als naam van het bestand wil gebruiken. Zeker als er meerdere classes in zitten kan dat bijvoorbeeld al niet.)

Music is an expression of pure emotion

Pagina: 1



VNU Media logo Powered by True

© 1998 - 2008 Tweakers.net - Alle rechten voorbehouden

Uitgever van: