Symfony2 deployment checklist

V produkčním prostředí je doporučeno používat cache pro Doctrine. Existují dva typy cache.

Cache pro dotazy a metadata

  • Cache pro dotazy se zaměřuje na cachování přeměny DQL dotazu na základní SQL. V produkci se dotazy vůbec nemění, tak proč je necachovat.
  • Cache pro metadata se zaměřuje na cachování získaných metadat z různých zdrojů - například YAML, XML, Anotace, atd.

Cachování těchto informací je možné aktivovat pomocí několika parametrů v konfiguračním souboru config_prod.yml:

doctrine:
    orm:
        auto_mapping: true
        query_cache_driver:    apc
        metadata_cache_driver: apc

Cache výsledků

Výsledky dotazů mohou být cachovány, aby nebylo nutné posílat stejné dotazy na databázi. Jelikož se jedná o choulostivější úpravu, nemůžete ji provést jednoduchým nastavením parametru. Začněte nstavením ovladače, jako v předchozím bloku:

doctrine:
    orm:
        auto_mapping: true
        result_cache_driver: apc

Poté musíte zvolit, zda cache použijete nebo nepoužijete pro veškeré hlavní dotazy. Toto provedete nastavením názvu a dobu trvání každého cachovaného dotazu. Další informace: Doctrine Result Cache documentation.

Zajistěte že Doctrine používá APC cache

Nastavili jste APC jako ovladač cache pro Doctrine, to je skvělé. Ale problém je, že kontejner Dependency Injection (DI) je generován pomocí konzoly při sestavení cache. A pokud soubor php.ini na vašem serveru neobsahuje řádek apc.enable_cli = 1, pak DI kontejner použije cache FileCacheReader. A to nechceme.

Pro kontrolu, zda opravdu používáte APC cache, zkontrolujte soubor app/cache/prod/appProdProjectContainer.php. Měl by obsahovat toto:

protected function getDoctrine_Orm_DefaultEntityManagerService()
{
    $a = $this->get('annotation_reader');
    $b = new \Doctrine\Common\Cache\ApcCache();
    $b->setNamespace('sf2orm_default_5cdc3404d84577b226d7772ca9818908');
    $c = new \Doctrine\Common\Cache\ApcCache();
    $c->setNamespace('sf2orm_default_5cdc3404d84577b226d7772ca9818908');

    // ...

    $g = new \Doctrine\ORM\Configuration();
    $g->setMetadataCacheImpl($b);
    $g->setQueryCacheImpl($c);

    // ...
}

Pokud nemůžete najít `\Doctrine\Common\Cache\ApcCache`, pak APC nepoužíváte.

Další informace: Doctrine Cache documentation_ Symfony2 Doctrine configuration reference_ Using APC cache with Doctrine and Symfony? Check again!_

Jistě nechcete, aby se logo Symfony frameworku objevovalo v prohlížeči návštěvníka. Proto musíte nahradit výchozí ikonu před nasazením aplikace.

Jednoduše nahraďte soubor web/favicon.ico.

Pro vytvoření favicony můžete:

  • Použít online nástroje jako favicon.cc pro vytvoření .ico souboru;
  • Použít PNG soubor. V tomto případě musíte nastavit HTML tag link: <link rel="icon" type="image/png" href="yourFavIcon.png">

Možná jste zvyklí na chybové stránky z vývojového prostředí, ale vaši budoucí návštěvníci pravděpodobně nebudou. Proto musíte přizpůsobit chybové stránky pro jejich integraci do vámi použitého vzhledu stránek.

Naštěstí lze chybové stránky přizpůsobit velice snadno. Jejich 'views' jsou umístěny v modulu (bundle) TwigBundle, což vám dává možnost přepsat je vašimi. 'Views' které musíte vytvořit jsou: Exception/errorXXX.html.twig, kde XXX je číselná hodnota chyby. Je doporučeno přizpůsobit alespoň stránky pro chyby 404 a 500.

Pro použití vašich 'views' existují dvě možnosti:

  1. Můžete vytvořit nový modul (bundle), který rozšíří TwigBundle a umístit 'views' do složky Resources/views/Exception/errorXXX.html.twig. To vám umožní znovu použít kód na dalších projektech;
  2. Můžete jednoduše přidat vaše 'views' do složky app/Resources/TwigBundle/views/Exception/errorXXX.html.twig. Pokud jsou určeny pouze pro daný projekt, vyhnete se tím zbytečnému vytváření nového modulu.

Další informace: Customize error pages on Symfony documentation_

Komponenta generující logy vaší aplikace je nezbytná pro údržbu vaší aplikace. Symfony2 používá komponentu Monolog určenou pro tento úkol.

Výchozí konfigurace je dobrá pro vývojové prostředí, ale nestačí pro produkční. Je dobré zaměřit se na dvě změny:

  • Odesílat chyby administrátorovi webu emailem (logy stupně "error");
  • Zaznamenávat veškeré autentizace. Jelikož jsou tyto záznamy stupně "info", nejsou ve výchozím nastavení zapisovány.

Konfigurace Monologu v souboru config_prod.yml:

monolog:
    handlers:
        main:
            type:               fingers_crossed
            action_level:       error
            handler:            grouped
        grouped:
            type:               group
            members:            [streamed, swift]
        streamed:
            type:               stream
            path:               "%kernel.logs_dir%/%kernel.environment%.log"
            level:              debug
        swift:
            type:               swift_mailer
            from_email:         FQN@foo.com
            to_email:           webmaster@company.com
            subject:            "OOps"
            level:              debug
        login:
            type:               stream
            path:               "%kernel.logs_dir%/auth.log"
            level:              info
            channels:           security

Hotovo"

Další informace: Symfony2 Monolog documentation_

Symfony2 je flexibilní a robustní framework... což končí pomalým načítáním aplikace. Samozřejmě, produkční prostředí je o hodně rychlejší než to vývojové, ale to pořád nestačí.

Pro zrychlení vaší aplikace v produkčním prostředí je doporučeno nainstalovat PHP akcelerátor, například APC.

Na dedikovaném serveru

Na Linuxu

Pro instalaci APC na debian-based systému použijte příkaz: apt-get install php-apc

Nezapomeňte příkaz přizpůsobit vaší distribuci.

Na Windows

Odkomentujte daný řádek v souboru php.ini:

extension=php_apc.dll

Na všech systémech

Po instalaci musíte provést aktivaci daného rozšíření. To můžete učinit přidáním těchto řádků na konec souboru php.ini:

[APC]
apc.enabled=1

Na sdíleném hostingu

Pokud provozujete aplikaci na sdíleném hostingu, nemusíte mít možnost připojit se přes SSH. V tomto případě kontaktujte administrátora hostingu a požádejte jej o instalaci APC.

Další informace: APC on the PHP doc

Zajistěte, že produkční serveru používá vhodně zvolený secret token. Kontrolu můžete provést v souboru app/config/parameters.yml:

secret:  please_use_a_real_secret_here

Výchozí token NENÍ bezpečný, proto jej MUSÍTE nahradit náhodným.

Před nasazením vaší aplikace zkontrolujte, že server je schopný ji spustit.

Pro otestování serveru můžete zvolit jednu ze tří možností:

  1. Spusťte příkaz php app/check.php a zkontrolujte jeho výstup
  2. Otevřete soubor config.php (umístěný ve složce web) ve vašem prohlížeči
  3. Pokud ještě nemáte přístup k produkčnímu serveru (například ještě plánujete jeho zakoupení), pořád můžete porovnat parametry serveru s dokumentací

Ve výchozím stavu používá Composer autoloader, který není plně optimalizován. Pokud používáte velké množství PHP tříd, autoloader může spotřebovat mnoho času při načítání aplikace...

V produkčním prostředí potřebujete, aby byl autoloader rychlý. Composer může použít optimalizovaný autoloader, který převede balíčky typu PSR-0 na classmap, což zlepší výkon.

Pro použití optimalizovaného autoloaderu jednoduše přidejte možnost --optimize k příkazu dump-autoload:

php composer.phar dump-autoload --optimize

Samozřejmě tato možnost příkaz prodlouží. To je důvod, proč není používána ve výchozím nastavení.

Další informace: Composer dump-autoload documentation_

Symfony2 komponenta 'Form' automaticky vkládá a kontroluje tokeny CSRF.

Nezapomeňte zvolit tajný klíč (secret token) v souboru app/config/parameters.yml:

secret:  please_use_a_real_secret_here

Dále můžete nastavit klíč pro každý formulář, což je ještě lepší řešení. To můžete provést definováním možnosti intention ve vašem formuláři:

namespace Acme\DemoBundle\Form;

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TaskType extends AbstractType
{
    // ...

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            // unikátní klíč který pomůže vygenerovat secret token
            'intention'  => 'task_form',
        ));
    }

    // ...
}

Další informace: Symfony2 Form CSRF protection documentation_ CSRF on wikipedia_