Symfony2高速化メモ

一人プロジェクトでSymfony2使ってたらこれから部署でもSymfony2使っていくような流れになってきたので自分用にメモを残していってみる。
とりあえずまずは高速化に関連する話題。

APCを有効化する

Symfony2使うならAPCはほぼ必須。

ApcUniversalClassLoaderに置き換えてみる

デフォルトではUniversalClassLoaderが有効になっているが、これはfile_existsを何度も呼ぶため遅い。
クラスの位置をAPCにキャッシュするApcUniversalClassLoaderが同梱されているため、こちらに入れ替える。
ただし、名前空間をいじったりしたときにキャッシュをクリアしないと問題が起きたりするので、開発中はUniversalClassLoaderでいいかも。
app/autoload.phpの上部を以下の様に編集。

&lt?php
//require __DIR__.'/../vendor/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
require __DIR__.'/../vendor/symfony/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
use Symfony\Component\ClassLoader\UniversalClassLoader;
use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;

$loader = new UniversalClassLoader();
//$loader = new ApcUniversalClassLoader('some prefix');
//...

パフォーマンス | Symfony2日本語ドキュメント#キャッシュ Autoloader (ApcUniversalClassLoader など)の利用

DoctrineのCaching Driversを使う

クエリキャッシュ、メタデータキャッシュ、結果キャッシュを使う設定ができるので、これを有効にする。
それぞれarray,apc,xcache,memcacheのいずれかを選択可能。

doctrine:
    orm:
        auto_mapping: true
        metadata_cache_driver: apc
        query_cache_driver: xcache
        result_cache_driver:
            type: memcache
            host: localhost
            port: 11211
            instance_class: Memcache

Configuration Reference (current) - Symfony#Caching Drivers

クエリキャッシュを使うときはこんな感じ(多分)。

<php
//...
$em = $this->get('doctrine.orm.entity_manager');
$q = $em->('SELECT i FROM Foo:BarBundle:Item i);
$q->useResultCache(true, 3600, 'somecache_id');
$result = $q->getResult();
//...

Native SQL

Doctrine使ってると、プロファイラを見てると、たまにすさまじいSQLが発行されてるときもある。
そんなときに最後の手段として、SQLを直接書いてEntity Classにマッピングする方法。
15. Native SQL — Doctrine 2 ORM 2.1 documentation

マッピングすらしたくなければ、Entity Managerからコネクション取ってそれを使って直接Query投げてしまえばいい。

Assetic管理

AssetにYUI_compressorやClosure Compilerを適用して圧縮したりしたい場合app/config.ymlに以下のような感じで記述。CoffeeScript使いたいときとかもここに設定する。

assetic:
    debug:          %kernel.debug%
    use_controller: false
    filters:
         closure:
            jar: %kernel.root_dir%/java/compiler.jar
         yui_css:
            jar: %kernel.root_dir%/java/yuicompressor.jar
         yui_js:
            jar: %kernel.root_dir%/java/yuicompressor.jar

Varnish

使ったことないけどとりあえずメモ。
Varnish を使ってウェブサイトを高速化する方法 | Symfony2日本語ドキュメント