Autor | Zpráva | ||
---|---|---|---|
BuGeR Profil |
#1 · Zasláno: 22. 1. 2013, 11:27:56
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 |
#2 · Zasláno: 22. 1. 2013, 12:59:31
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 |
#3 · Zasláno: 22. 1. 2013, 13:29:22
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 |
#4 · Zasláno: 22. 1. 2013, 13:34:43
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 |
#5 · Zasláno: 22. 1. 2013, 13:38:11
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 |
#7 · Zasláno: 22. 1. 2013, 13:45:17
ShiraNai7:
Díky za tip. Přesto bych se chtěl ale namespace vyhnout... |
||
ShiraNai7 Profil |
#8 · Zasláno: 22. 1. 2013, 13:50:30
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 |
#9 · Zasláno: 22. 1. 2013, 13:51:54
|
||
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 |
#12 · Zasláno: 22. 1. 2013, 14:18:15
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 |
#13 · Zasláno: 22. 1. 2013, 14:19:55
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 |
#16 · Zasláno: 22. 1. 2013, 14:38:56
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 |
#17 · Zasláno: 22. 1. 2013, 14:42:19
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ě. |
||
Časová prodleva: 11 let
|
0