Autor Zpráva
BuGeR
Profil
Zdravím,

mám web, založený na architektuře MVC.
Pokud zavolám nějakou třídu (říkejme jí třeba nazevtridy), tak se mi spustí funkce autoloader, která provede toto:
- Podívá se do složky /cache, zda v ní neexistuje soubor nazevtridy.tmp, pokud existuje, tak ho otevře, načte a zpracuje data (jsou ve formátu JSON), z načtených dat získá adresu souboru, kde je uložena třída, pokud soubor se třídou neexistuje, soubor nazevtridy.tmp smaže; pokud existuje tak soubor includuje a vrátí return true; (tudíž už funkce nejede dál)
- Pokud soubor nazevtridy.tmp vůbec neexistuje, tak si načte php soubory z určité složky (a jejich podsložek) a v každém souboru hledá, zda v něm neexistuje třída nazevtridy (zjišťuje to pomocí token_get_all()). Pokud v něm třída existuje tak načítání souboru zastaví, includuje soubor a vytvoří cache - cache/nazevtridy.tmp, která obsahuje požadovanou adresu souboru a po té funkci zastaví (return true;)

Pokud tedy načítám třeba 10 tříd, tak se toto provede 10x - pokud je načítám poprvé, tak se budou muset 10x projet všechny soubory a hledat v nich požadovanou třídu; pokud nenačítám poprvé, tak se jen otevře cache (nazevtridy.tmp) a zjisti se adresa souboru kde je uložena třída, a soubor includuje.

A má otázka: Je toto automatické načítání tříd efektivní? Zpomaluje to hodně server (jak moc zpomaluje procházení všech souborů - pokud ještě neexistuje cache? jak moc zpomaluje otevření cache a načtení adresy?)
Vím, že záleží také na výkonu serveru.

Popřípadě, pokud používáte jiné řešení, můžete uvést jaké?

Vím, že na podobném principu toto funguje i v Nette.

Poznámka: Soubory tmp vytvářím a načítám pomocí file_get_contents() a file_put_contents()

Děkuji
tiso
Profil
BuGeR: Efektívnejšia je mapa súborov - v podstate pole ClassName => /full/path/to/filename.php, toto pole si načíta autoloader a potom vie ktorý súbor pre ktorú triedu má vložiť. Mapu potom stačí raz vygenerovať (prejsť súbory, hľadať v nich názvy tried) a uložiť.
BuGeR
Profil
tiso:
Super, díky moc. Pokud se tedy ale nepletu, tak mapu není nutné ukládat do jakési souborové cache, ale jen do proměnné?
tiso
Profil
BuGeR: práveže ju musíš uložiť do súboru, aby si ju nemusel generovať pri každom requeste. To generovanie je náročná operácia.
BuGeR
Profil
tiso:
Ok. jak ale teda zjistím, zda nepřibyl/nezmizel nějaký soubor?
ShiraNai7
Profil
BuGeR:

Doporučil bych spíš používat jmenné prostory, sofistikovanější autoloader a organizovat umístění tříd nějak "standartně" (např. PSR-0).

Tvé řešení mi příjde jako kanón na mouchu. Jde to řešit jednoduše, bez nějakých cache, parsování PHP a tak dále.
BuGeR
Profil
ShiraNai7:
Díky za tip.
Přesto bych se chtěl ale namespace vyhnout...
ShiraNai7
Profil
BuGeR:
Nemusíš používat namespace. Adresáře lze oddělovat podtržítky (tak je to v PSR-0).
Můžeš se inspirovat ukázkovým autoloaderem, který je na odkazované stránce. Svou implementaci autoloaderu tu odkazovat nebudu - ta je pro tvé účely zbytečně složitá, když ti stačí jednoduchá funkce.
Alphard
Profil
BuGeR [#5]:
Na testovací mašině v debug módu prostě přegenerovat, nebo si ukládat i data poslední změny.
Na reálném webu lze aplikovat i styl, že když se nahrají nové soubory, smaže se cache.

ShiraNai7 [#8]:
Snad tím nechceš doporučit Zendovské podtržítkové půlřádkové názvy...
ShiraNai7
Profil
Alphard:
Snad tím nechceš doporučit Zendovské podtržítkové půlřádkové názvy...

To ne, ale když se chce vyhnout jmenným prostorům (i když nevím proč) tak není moc dalších možností. I půlřádkové názvy jsou lepší než to dělat takhle složitě.
BuGeR
Profil
ShiraNai7:
Děkuji, ale nějak se mi to nelíbí..
Jmenné prostory nemám rád z důvodu toho, že u volání tříd musím uvádět vždy adresu toho namespace (např. new FW/Components/Form/Render) - a určitě si některé adresy pamatovat nebudu. Vím o Use, ale prostě se chci namespace vyhnout

Alphard, (tiso):
Jasný - napadá mě hodně možností jak porovnávat aktualitu cache (např. ta poslední změna, celkový počet souborů ve složce apod.)
Ale nebudou tyto kontroly trvat déle, než vygenerování celé mapy znovu?
tiso
Profil
BuGeR: „Ale nebudou tyto kontroly trvat déle, než vygenerování celé mapy znovu?
Zmyslom je sa týmto kontrolám vyhnúť. Pri pridávaní/mazaní? súborov s triedami musíš aktualizovať mapu.
BuGeR
Profil
tiso:
Ano - ale jak zjistim, zda jsem přidal nebo smazal soubor?
Nechci pokaždé mapu aktualizovat ručně..
ShiraNai7
Profil
BuGeR:
Nejefektivnější řešení je aktualizaci vyvolávat "ručně", ne při každém požadavku. Moc by mě zajímala adresářová struktura a důvod, proč se tak bráníš nějakému intuitivnímu autoloadingu (ať už podle namespace, podtržítek či prefixů).
tiso
Profil
BuGeR: Možností je viac:
1) hook po update webu, alebo spúšťanie skriptu na vygenerovanie mapy pri automatickom deploy procese
2) môžeš si nastaviť CRON, ktorý pregeneruje mapu
3) spraviť kontrolu v autoladeri: ak chce natiahnuť triedu, ktorá v mape neexistuje, tak aktualizovať mapu
BuGeR
Profil
ShiraNai7:
No.. Prostě se mi nelíbí zápis new Slozka1/Slozka2/Slozka3/Trida


tiso:
Super, nejlepší řešení mi přijde asi v bodě 3. :)
Děkuji moc.
ShiraNai7
Profil
BuGeR:
Však to není jediná možnost :)

Můžeš to mít třeba na základě prefixu:

SysNeco --> tridy/system/SysNeco.php
SysBlaBla --> tridy/system/SysBlaBla.php
MojeTest --> moje/tridy/MojeTest.php

a podobně.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0