web-dev-qa-db-ja.com

Symfony2の初期化時間が遅い

Ubuntu Server 12.04(64-bit)VM(VirtualBox)でSymfony2を実行しています。ホストはMacBookプロです。何らかの理由で、開発モード(app_dev .php)。開発モードでは速度が遅いことはわかっていますが、リクエストごとに5〜7秒(場合によってはさらに遅い)話します。Macでは、開発モードで200ミリ秒程度の要求時間が得られます。

Symfony2プロファイラーでタイムラインを見た後、リクエスト時間の〜95%が「初期化時間」であることに気付きました。これは何ですか?非常に遅い理由は何ですか?

この問題は、開発モードのSymfony2にのみ適用され、VMで実行している他のサイトには適用されず、実稼働モードのSymfony2にも適用されません。

私はこれを見ました(http://stackoverflow.com/questions/11162429/whats-included-in-the-initialization-time-in-the-symfony2-web-profiler)が、質問に答えていないようです。

53
orourkedd

問題の原因を見つけました(Symfony2ではありません)。 ubuntu VMの何らかの理由で、特定のファイルの修正時間が間違っています(つまり、将来など)。 symfony2は、レジストリに対してfilemtime()を使用してこれらの時間をチェックするときに、キャッシュがもはや新鮮で​​はないと判断し、全体を再構築します。なぜそれを行っているのか、まだ理解できていません。

15
orourkedd

デフォルトではSymfony2から5〜30秒の応答がありました。 今では、開発環境では〜500msです。

次に、php.iniで次のことを変更しました。

  • set realpath_cache_size = 4M(またはそれ以上)
  • XDebugを完全に無効化(phpinfoでテスト)
  • realpath_cache_ttl = 7200
  • 有効にし、OPcache(またはAPC)を正しく設定します
  • php.iniをリロードするためにApacheを再起動しました

そして、ボイラー、応答は開発モードで2秒未満でした!それが役に立てば幸い。

前:6779 ms enter image description here

後:1587 ms

enter image description here

Symfony2は数千のファイルからクラスを読み取りますが、これは遅いプロセスです。小さなPHP realpathキャッシュを使用する場合、PHPのrealpathキャッシュにない場合、dev環境で新しいリクエストが行われるたびにファイルパスを1つずつ解決する必要があります。realpathキャッシュはSymfony2のデフォルトでは小さすぎますが、これはもちろん問題ではありません。

キャッシュメタデータ:

メタデータのキャッシュ(マッピングなど)も、パフォーマンスをさらに向上させるために非常に重要です。

doctrine:
    orm:
        entity_managers:
            default:
                metadata_cache_driver: apc
                query_cache_driver: apc
                result_cache_driver: apc

これにはAPCuを有効にする必要があります。 APCはすでにオペコードキャッシングを行っているため、バイトコードキャッシュなしのOPCacheです。 OPCacheは、PHP 5.5。

----After:467 ms ----

(prod環境では、同じ応答は〜80ミリ秒です)

enter image description here

このプロジェクトは30以上のバンドルを使用し、数万行のコード、ほぼ100の独自のサービスがあるため、ローカルのWindows環境では、いくつかの簡単な最適化を使用するだけで0.5sは非常に優れています。

123
Denes Papp

同じ問題があります。ここでは、リクエストごとに10秒以上があります。 bootstrap.php.cacheの次の行を削除すると、常に通常の状態(298ミリ秒)で返されます。

foreach ($meta as $resource) { 
if (!$resource->isFresh($time)) {
return false;
}
}

変更時刻が間違っている可能性がありますが、修正方法がわかりません。誰かが解決策を知っていますか?

4
cleaversdev

MacbookでApache2の最大タイムアウトロードをデバッグするには、xdebug (v2.2.21)を無効にする必要もありました。 macportsを使用してインストールされました。

Sudo port install php54-xdebug.

Xdebugを有効にすると、すべてのページが最大ロード時間を使い果たし、ディスパッチされる最大タイムアウトメッセージを超える致命的なエラーが発生します。無効にすると、すべてが妥当な予想時間内に正常にロードされます。 MAMPを使用してこれに到達しました。デフォルトではxdebugは有効になっておらず、Apache2は通常どおり高速に動作します。 xdebugは以前は正常に動作していたため、別のデバッガーに変更する場合があります。

構成:

  • MacOSX 10.6.8
  • macports 2.1.3
  • Apache 2.2.24
  • pHP 5.4
4
Joseph Tran

https://stackoverflow.com/a/12967229/610884 で述べたように、そのような動作の理由はUbuntu VM settings。日付と時刻を同期する必要があります。 https://superuser.com/questions/463106/virtualbox-how-to-sync-Host-and-guest-time で説明されているホストOSとゲストOSの間。

FTP経由でVMにファイルをアップロードすると、ファイルの変更日がホストの値に変更されます。そのため、filemtime()は誤った値を返します。

2
kna

APP/var/cacheв/dev/shm/YourAppName/var/cacheを移動できます。ただし、IDEオートコンプリートとコード検証のために、ローカルファイルにもコンテナを構築することは良いことです。app/AppKernel.php

public function getCacheDir()
{
    return $this->getVarOrShmDir('cache/' . $this->getEnvironment());
}

public function getLogDir()
{
    return $this->getVarOrShmDir('logs');
}

private function getVarOrShmDir($dir)
{
    $result = dirname(__DIR__) . '/var/' . $dir;

    if (
        in_array($this->environment, ['dev', 'test'], true) &&
        empty($_GET['warmup']) && // to force using real directory add ?warmup=1 to URL
        is_dir($result) && // first time create real directory, later use shm
        file_exists('/bin/mount') && Shell_exec('mount | grep vboxsf') // only for VirtualBox
    ) {
        $result = '/dev/shm/' . 'YourAppName' . '/' . $dir . '/' . $this->getEnvironment();
    }

    return $result;
}
2
luchaninov

Xdebugを無効にすると、読み込み時間が17秒(はい)から0.5秒に短縮されました。

1
Dhofca

開発中のページの読み込みが遅いという問題もありました。CSSなどを微調整していると非常にイライラする可能性があります。

少し掘り下げた後、私にとっては、ページの読み込みごとにすべてのアセットを再コンパイルするAsseticが問題の原因であることがわかりました。

http://symfony.com/doc/current/cookbook/assetic/asset_management.html#dumping-asset-files-in-the-dev-environment

Asseticコントローラーの使用を無効にすることで、ページの負荷を大幅に増やすことができました。ただし、上記のリンクが示すように、資産に変更を加える(または資産に監視を設定する)たびに資産を再生成するというコストがかかります。

1
Luke