Jedna řádka v konfiguraci zrychlí vaši Nette aplikaci. Jak je to možné?
Představte si, že máte velkou aplikaci s desítkami služeb – databáze, logger, mailer, cache a mnoho dalších. Při každém HTTP požadavku se všechny tyto služby vytvoří, i když je třeba vůbec nepoužijete. To zbytečně zpomaluje běh aplikace. Nová verze PHP 8.4 a Nette přináší elegantní řešení tohoto problému pomocí tzv. lazy objektů.
Co jsou lazy objekty?
Lazy objekt je speciální typ objektu, který z pohledu vašeho kódu
vypadá a chová se naprosto stejně jako skutečná služba, ale ve
skutečnosti odkládá svou inicializaci až do chvíle, kdy je skutečně
potřeba. Když si z DI kontejneru vyžádáme například službu pro práci
s databází, dostaneme objekt, který navenek vypadá jako běžná instance
Database
, ale ve skutečnosti ještě nemá vytvořené připojení
k databázi. K tomu dojde až ve chvíli, kdy službu poprvé skutečně
použijeme.
Příklad:
// Dostaneme objekt, který vypadá jako Database, ale ještě nemá vytvořené připojení
$database = $container->getByType(Database::class);
// Připojení k databázi se vytvoří AŽ ZDE, při prvním skutečném použití
$database->query('SELECT * FROM users');
Jak to zapnout?
V nové verzi Nette DI 3.2.4 stačí jediný řádek v konfiguraci:
di:
lazy: true
To je vše! Od této chvíle budou všechny služby v DI kontejneru vytvářeny „líně“.
Lazy vytváření můžeme nastavit i pro jednotlivé služby:
services:
newsletter:
create: Newsletter
lazy: false # tato služba se vytvoří hned, i když je lazy globálně zapnuté
database:
create: Database
lazy: true # tato služba bude lazy, i když je lazy globálně vypnuté
Výhody v praxi
- Rychlejší start aplikace – vytváří se jen ty služby, které skutečně potřebujete
- Nižší spotřeba paměti – nepoužité služby nezabírají místo
- Jednoduchá implementace – stačí jeden řádek v konfiguraci
Je důležité počítat s tím, že lazy objekty logicky mění způsob, jak se projevují chyby v konfiguraci služeb. Například špatné přihlašovací údaje k databázi se neprojeví hned při startu aplikace, ale až při prvním skutečném připojení k databázi.
Omezení a doporučení
- Lazy objekty fungují jen pro vaše vlastní třídy
- Nelze je použít pro interní PHP třídy
- Vyžadují PHP 8.4 nebo vyšší
Lazy objekty představují významný krok vpřed v optimalizaci PHP aplikací. Díky nim mohou být vaše Nette aplikace rychlejší a efektivnější, aniž byste museli měnit jediný řádek svého kódu.
Chcete-li odeslat komentář, přihlaste se