Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[PHP5] Autoload klassestructuur en cachen klassen serverside

Pagina: 1
Acties:

  • webinn
  • Registratie: Oktober 2002
  • Laatst online: 06-06 12:44
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
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...official&client=firefox-a) halen niet veel uit.


Iemand die mij op weg kan helpen? Vooral wat betreft de keywords waarop ik moet zoeken?
Thanks.

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

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

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

[ Voor 68% gewijzigd door Brakkie op 06-07-2008 13:40 ]

Systeem | Strava


  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

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

  • BarthezZ
  • Registratie: Juli 2004
  • Niet online

BarthezZ

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 :) )

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

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/ ;)

Sole survivor of the Chicxulub asteroid impact.


  • robbert
  • Registratie: April 2002
  • Laatst online: 07:58
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.

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

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 | Strava


  • webinn
  • Registratie: Oktober 2002
  • Laatst online: 06-06 12:44
bedankt voor alle replies tot nu toe, ik zal ze verder onderzoeken de komende dagen :)

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 05-11 19:33
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.

Noushka's Magnificent Dream | Unity


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 05-11 19:33
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.)

Noushka's Magnificent Dream | Unity

Pagina: 1