Jedna řádka v konfiguraci zrychlí vaši Nette aplikaci. Jak je to možné?

před 5 dny od David Grudl  

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

  1. Rychlejší start aplikace – vytváří se jen ty služby, které skutečně potřebujete
  2. Nižší spotřeba paměti – nepoužité služby nezabírají místo
  3. 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.