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)が、質問に答えていないようです。
問題の原因を見つけました(Symfony2ではありません)。 ubuntu VMの何らかの理由で、特定のファイルの修正時間が間違っています(つまり、将来など)。 symfony2は、レジストリに対してfilemtime()を使用してこれらの時間をチェックするときに、キャッシュがもはや新鮮ではないと判断し、全体を再構築します。なぜそれを行っているのか、まだ理解できていません。
デフォルトではSymfony2から5〜30秒の応答がありました。 今では、開発環境では〜500msです。
次に、php.ini
で次のことを変更しました。
realpath_cache_size = 4M
(またはそれ以上)XDebug
を完全に無効化(phpinfo
でテスト)OPcache
(またはAPC)を正しく設定しますそして、ボイラー、応答は開発モードで2秒未満でした!それが役に立てば幸い。
前:6779 ms
後:1587 ms
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。
(prod環境では、同じ応答は〜80ミリ秒です)
このプロジェクトは30以上のバンドルを使用し、数万行のコード、ほぼ100の独自のサービスがあるため、ローカルのWindows環境では、いくつかの簡単な最適化を使用するだけで0.5sは非常に優れています。
同じ問題があります。ここでは、リクエストごとに10秒以上があります。 bootstrap.php.cacheの次の行を削除すると、常に通常の状態(298ミリ秒)で返されます。
foreach ($meta as $resource) {
if (!$resource->isFresh($time)) {
return false;
}
}
変更時刻が間違っている可能性がありますが、修正方法がわかりません。誰かが解決策を知っていますか?
MacbookでApache2の最大タイムアウトロードをデバッグするには、xdebug (v2.2.21)
を無効にする必要もありました。 macportsを使用してインストールされました。
Sudo port install php54-xdebug.
Xdebugを有効にすると、すべてのページが最大ロード時間を使い果たし、ディスパッチされる最大タイムアウトメッセージを超える致命的なエラーが発生します。無効にすると、すべてが妥当な予想時間内に正常にロードされます。 MAMPを使用してこれに到達しました。デフォルトではxdebugは有効になっておらず、Apache2は通常どおり高速に動作します。 xdebugは以前は正常に動作していたため、別のデバッガーに変更する場合があります。
構成:
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()は誤った値を返します。
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;
}
Xdebugを無効にすると、読み込み時間が17秒(はい)から0.5秒に短縮されました。
開発中のページの読み込みが遅いという問題もありました。CSSなどを微調整していると非常にイライラする可能性があります。
少し掘り下げた後、私にとっては、ページの読み込みごとにすべてのアセットを再コンパイルするAsseticが問題の原因であることがわかりました。
Asseticコントローラーの使用を無効にすることで、ページの負荷を大幅に増やすことができました。ただし、上記のリンクが示すように、資産に変更を加える(または資産に監視を設定する)たびに資産を再生成するというコストがかかります。