Symfony2 deployment checklist

Üretim sunucunuzun özelleştirilmiş bir gizli anahtar kullandığına emin ol. app/config/parameters.yml dosyasını kontrol edin:

secret:  please_use_a_real_secret_here

Varsayılan anahtar gerçekten gizli değildir, rasgele bir anahtar ile değişmelisiniz.

Varsayılan olarak Composer tam olarak optimize edilmemiş bir autoloader döker. Gerçeği söylemek gerekirse çok fazla sınıfınız varsa autoloader azımsanmayacak kadar çok zaman alır.

Üretim ortamında autoloaderın hızlı olmasını istersiniz. Composer PSR-0 paketlerini sınıf eşlemeye çeviren optimize edilmiş bir autoloader dökebilir, bu da performansı arttırır.

Optimize autoloaderi kullanmak için dump-autoload Composer komutuna --optimize seçeneğini ekleyin:

php composer.phar dump-autoload --optimize

Tabii ki bu yöntem komutu biraz uzatır. Varsayılan olarak bu şekilde olmamasının sebebi budur.

Ziyaretçilerinizin tarayıcısında Symfony logosunun gözükmesini istemezsiniz. Bu yüzden yayınlamadan önce varsayılan faviconu kendi faviconunuz ile değiştirmelisiniz.

Sadece web/favicon.ico dosyasını değiştirin.

Faviconlar yapmak için şunları yapabilirsiniz:

  • favicon.cc gibi online araçlar kullanarak .ico uzantılı dosyalar üretebilirsiniz;
  • PNG ikon kullanın. Bu yöntemde HTML'de link tanımlamanız gerekir: <link rel="icon" type="image/png" href="faviconunuz.png">

Eğer geliştirme ortamındaki hata sayfalarına alıştıysanız, umalım ki üretim ortamındaki sitenizin ziyaretçileri aynı durum ile karşılaşmasın. Bu yüzden farklı hata sayfalarınızı kişiselleştirip, kendi düzeniniz ile entegre hale getirmelisiniz.

Hata sayfalarını kişiselleştirmek gerçekten kolay. View dosyalarıTwigBundle bundle içinde bulunur, bu da size bunları sizinkiler ile ezmenize olanak sunar. Oluşturmanız gereken viewler: Exception/errorXXX.html.twig, buradaki XXX karşılaşılan hatanın numarasıdır. En azından 404 ve 500 hatalarını kişiselleştirmeniz önemle tavsiye edilir.

Kendi viewlerinizi kullanmanız için iki olası yol vardır:

  1. TwigBundle'ı ezen yeni bir bundle oluşturabilir, ve viewlerinizi Resources/views/Exception/errorXXX.html.twig klasörü altına koyarsınız. Bu tekrar kullanılabilir bir bundle olacağı için farklı projelerinizde de kullanılabilmenizi sağlar;
  2. Basitçe viewlerinizi app/Resources/TwigBundle/views/Exception/errorXXX.html.twig altına koyarsınız. Eğer viewleriniz bu projeye özgü ise sadece bu iş için yeni bir bundle oluşturmanıza gerek bırakmaz.

Üretim ortamında Doctrine cache kullanmanız şiddetle önerilir. İki tip cache vardır.

Sorgu ve MetaData Cache

  • Sorgu cache DQL sorgusunun SQL karşılığını kaydetmeyi hedefler. Üretim ortamında istekler değişmeyeceğinden, neden bunları kaydetmeyesiniz.
  • Metadata Cache YAML, XML, Annotation gibi kaynaklardan çözümlenen metadatanın kaydedilmesini hedefler.

Bu verilerin cache edilmesi üretim ayar dosyası config_prod.ymlde birkaç parametre eklenmesi ile yapılır:

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

Sonuç Cache

Sonuç cache, sorgularınızın sonuçlarının, tekrar tekrar veritabanında sorgu çalıştırmamak için, kaydedilmesidir. Bu bir ince ayar olduğu için bunu uygulama çapında parametrize edilemez. Önceden olduğu gibi sadece sürücüyü belirleyebiliriz:

doctrine:
    orm:
        auto_mapping: true
        result_cache_driver: apc

Bundan sonra kendiniz her ana sorgunuzda ayrıca kullanır ya da kullanmayabilirsiniz. Bu her sorgu cache'in isim ve yaşam süresi belirlenerek yapılır. Bkz. Doctrine Sonuç Cache dokümantasyonu.

Doctrine'in APC cache'inizi gerçekten kullandığına emin olun

APC'yi Doctrine'in cache sürücüsü olarak ayarladınız, güzel. Ama problem cache oradan oluşturulurken, Dependency Injection Containerın Komut Satırı Arayüzü aracılığı ile oluşturulmuş olması. Eğer php.inide apc.enable_cli = 1 yoksa, DIC FileCacheReaderı kullanılır. Bu istemeyeceğimiz birşey.

Gerçekten APC cache kullandığınızı kontrol etmek için, app/cache/prod/appProdProjectContainer.php dosyasına göz atın. Şunu görmelisiniz:

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);

    // ...
}

Eğer \Doctrine\Common\Cache\ApcCache kısmını bulamazsanız, APC kullanmıyorsunuz demektir.

Web platformunuzun yönetimindeki ana bileşenlerden biri uygulamanızın loglarını oluşturan bileşendir. Symfony2 bu görevi yerine getirmek üzere Monolog ile gelir.

Varsayılan ayarlar geliştirme ortamı için yeterli olmasına rağmen üretim için yeterli değildir. Yapılan değişikliklerin iki amacı vardır:

  • Hataları website yöneticisine mail ile gönder ("hata" seviyesindeki loglar);
  • "Bilgi" seviyesinde loglar olduğu için varsayılan olarak kaydedilmeyen tüm kimlik doğrulamaları kaydet.

config_prod.yml dosyasını kullanarak ayarları yapalım:

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

Bu kadar!

Symfony2 Form bileşeni sizin için otomatik olarak CSRF token (bilet) gömer ve doğrular.

app/config/parameters.yml dosyanızda bulunan gizli anahtarınızı kişiselleştirdiğinize emin olun, bu anahtar token üretilmesinde kullanılır:

secret:  please_use_a_real_secret_here

Ayrıca anahtar formdan forma da kişiselleştirilebilir, ki bu daha iyidir. Bunu formlarınızda intention seçeneği ile yapabilirsiniz:

namespace Acme\DemoBundle\Form;

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TaskType extends AbstractType
{
    // ...

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            // gizli token üretilmesine yardımcı bir tekil anahtar
            'intention'  => 'task_form',
        ));
    }

    // ...
}

Symfony2 esnek ve güçlü bir çatıdır... bu oldukça yavaş bağlantı sürelerine sebep olur. Tabii ki üretim ortamı geliştirme ortamına göre çok daha hızlıdır, ama bu yeterli değil.

Uygulamanızı üretim ortamında hızlandırmak için, APC gibi bir PHP Hızlandırıcı kurmanız şiddetle tavsiye edilir.

Özel sunuculara

Linuxte

APC'yi Debian türevi dağıtımlara kurmak için, basitçe şu komutu çalıştırın:

apt-get install php-apc

Komutu dağıtımınıza göre adapte edin.

Windowsta

php.inideki ilgili satırı yorumdan çıkarın:

extension=php_apc.dll

Tüm durumlarda

Kurulum sonrasında eklentiyi aktive etmeniz gerekir. Bu php.ini sonuna şu satırı ekleyerek yapılır:

[APC]
apc.enabled=1

Paylaşımlı hostinglerde

Paylaşımlı hostinglerde kurulum için ssh erişimi gereklidir. Bu durumda en iyisi yönetici ile irtibata geçmektir. Ona PHP hızlandırıcı yüklemenin serverlar için iyi olduğunu söyleyin.

Uygulamayı yayına almadan önce, üretim sunucunuzun uygulamayı çalıştırmaya hazır olduğunu test edin.

Sunucuyu test etmek için şu 3 yöntemden birini seçersiniz:

  1. php app/check.php komutunu elle çalıştırmak ve çözülmesi gerekenleri görmek;
  2. web klasörü içerisinde bulunan config.php dosyasına tarayıcıdan erişmek;
  3. Eğer henüz sunucuya erişiminiz yoksa (almayı planlıyorsanız) yine de dokümantasyon referans sayfasına bakabilirsiniz