読者です 読者をやめる 読者になる 読者になる

OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

本番環境でもSymfony2のデバッグツールバー(Profiler)が見たい

PHP Symfony2

ども。フジロックでは battles がベストアクトだと思っている @kalibora です。小ネタです。

Symfony2の開発時に下に出てくるアレ。すごい便利ですよね。

クリックすると↓こんな感じの画面になって

f:id:kalibora:20160920214502p:plain

DBへのクエリも確認できますし、簡易的にボトルネックがどこかも調べたりできます。

そんな便利なツールバー、本番環境でも見たいなーって時たまにありませんか?

基本的には開発環境だけで事足りるはずですけど、本番と開発環境でのデータ量の差だったりが影響して 本番環境でDBへのクエリがどうなってるのか確認したいとかとか。

とはいえ、本番環境でツールバーを表示するわけにはいきません。(セキュリティの問題とパフォーマンスの問題)

じゃあどうするか?それ用の環境を作ってしまいましょう。

幸い公式ドキュメントにそのようなときにぴったりな解説ページがあります。

これ → How to Master and Create new Environments (current)

でもですね、この通りにやってもツールバーが出ないのでちょっとだけ足してやる必要があります。

diffにすると以下のようになります。

diff --git a/app/AppKernel.php b/app/AppKernel.php
index 823d7a2..082e6fb 100644
--- a/app/AppKernel.php
+++ b/app/AppKernel.php
@@ -26,6 +26,10 @@ class AppKernel extends Kernel
             $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
         }

+        if (in_array($this->getEnvironment(), ['benchmark'], true)) {
+            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
+        }
+
         return $bundles;
     }

diff --git a/app/config/config_benchmark.yml b/app/config/config_benchmark.yml
new file mode 100644
index 0000000..3a6892d
--- /dev/null
+++ b/app/config/config_benchmark.yml
@@ -0,0 +1,10 @@
+imports:
+    - { resource: config_prod.yml }
+
+framework:
+    profiler: { only_exceptions: false }
+    router:
+        resource: "%kernel.root_dir%/config/routing_benchmark.yml"
+
+web_profiler:
+    toolbar: true
diff --git a/app/config/routing_benchmark.yml b/app/config/routing_benchmark.yml
new file mode 100644
index 0000000..172205b
--- /dev/null
+++ b/app/config/routing_benchmark.yml
@@ -0,0 +1,10 @@
+_wdt:
+    resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
+    prefix:   /_wdt
+
+_profiler:
+    resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
+    prefix:   /_profiler
+
+_main:
+    resource: routing.yml
diff --git a/web/app_benchmark.php b/web/app_benchmark.php
new file mode 100644
index 0000000..8852777
--- /dev/null
+++ b/web/app_benchmark.php
@@ -0,0 +1,20 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * @var Composer\Autoload\ClassLoader
+ */
+$loader = require __DIR__.'/../app/autoload.php';
+include_once __DIR__.'/../var/bootstrap.php.cache';
+
+$kernel = new AppKernel('benchmark', false);
+$kernel->loadClassCache();
+//$kernel = new AppCache($kernel);
+
+// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
+//Request::enableHttpMethodParameterOverride();
+$request = Request::createFromGlobals();
+$response = $kernel->handle($request);
+$response->send();
+$kernel->terminate($request, $response);

これで app_benchmark.php にアクセスすればツールバーが表示されます。

さぁ、っとここまでできたところでこれを実際に本番環境にデプロイして公開してしまってはセキュリティ的に問題なので、そこはお気をつけください。

きっと社内からしかアクセスできないようなステージング環境をみなさま用意していると思いますので、 そういうところだけにデプロイして使えば、 当初の目的だった本番環境(に限りなく近い環境)でデバッグツールバーが見れます。

それではみなさまごきげんよう。