Doctrine でデバッグを効率化する 4 つの方法
Doctrine で実行された実際の SQL を出力する方法
しかし、デバッグやパフォーマンスのチューニングを行う際に、実際に実行される SQL を確認することが重要になる場合があります。
Doctrine では、いくつかの方法で実行された実際の SQL を出力することができます。
getSQL() メソッドを使用する
最も簡単な方法は、getSQL()
メソッドを使用することです。 これは、Doctrine\ORM\Query
オブジェクトで呼び出すことができます。
$em = $entityManager->createQuery('SELECT u FROM AppBundle\Entity\User u');
$sql = $em->getQuery()->getSQL();
echo $sql;
このコードは、次の SQL を出力します。
SELECT u.id AS u0_id, u.username AS u0_username, u.email AS u0_email, u.password AS u0_password, u.isActive AS u0_isActive FROM users u
SQLLogger を使用する
より詳細なログを取得したい場合は、SQLLogger
を使用することができます。 SQLLogger
は、実行されたすべてのクエリと、それらのクエリにかかった時間を記録するインターフェースです。
Doctrine には、デフォルトの SQLLogger
が用意されていますが、独自の SQLLogger
を実装することもできます。
独自の SQLLogger
を実装するには、Doctrine\DBAL\Logging\SQLLogger
インターフェースを実装する必要があります。
このインターフェースには、次の 3 つのメソッドを定義する必要があります。
startQuery()
: クエリが実行される前に呼び出されます。queries()
: 実行されたすべてのクエリの配列を返します。
独自の SQLLogger
を実装したら、Doctrine に設定する必要があります。
これを行うには、次のコードを使用します。
$logger = new MySQLLogger();
$entityManager->getConfiguration()->setSQLLogger($logger);
MySQLLogger
は、独自の SQLLogger
クラスの名前です。
Xdebug を使用する
Xdebug は、PHP のデバッガです。 Xdebug を使用すると、実行されたコードをステップ実行したり、変数の値を調べたりすることができます。
Xdebug を使用して、実行された SQL を確認するには、次の手順を実行します。
- Xdebug をインストールして有効にします。
.xdebug_config
ファイルでdb.record_sql
ディレクティブをtrue
に設定します。- スクリプトを実行します。
Xdebug は、実行されたすべての SQL を db.trace_file
ディレクティブで指定したファイルに記録します。
Doctrine Dev Tools は、Doctrine を使用しているアプリケーションをデバッグするための Web ツールです。 Doctrine Dev Tools を使用すると、実行されたクエリ、キャッシュされたデータ、データベーススキーマなどを確認することができます。
Doctrine Dev Tools を使用するには、次の手順を実行します。
- Web ブラウザで Doctrine Dev Tools を開きます。
Doctrine Dev Tools は、実行されたすべての SQL を SQL
タブに表示します。
Doctrine で実行された実際の SQL を出力するには、いくつかの方法があります。
上記の方法の中で、自分に合った方法を選択してください。
getSQL() メソッドを使用する
<?php
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Query;
$entityManager = $entityManager->createQuery('SELECT u FROM AppBundle\Entity\User u');
$sql = $entityManager->getQuery()->getSQL();
echo $sql;
SELECT u.id AS u0_id, u.username AS u0_username, u.email AS u0_email, u.password AS u0_password, u.isActive AS u0_isActive FROM users u
SQLLogger を使用する
<?php
use Doctrine\DBAL\Logging\SQLLogger;
class MySQLLogger implements SQLLogger
{
public function startQuery(Query $query, ?Connection $connection = null)
{
// Do something here
}
public function stopQuery(Query $query, ?Connection $connection = null, array $parameters = [], ?float $startTime = null, ?float $endTime = null)
{
// Do something here
}
public function queries()
{
// Return an array of queries
}
}
$logger = new MySQLLogger();
$entityManager->getConfiguration()->setSQLLogger($logger);
このクラスは、startQuery()
、stopQuery()
、queries()
の 3 つのメソッドを定義する必要があります。
$logger = new MySQLLogger();
$entityManager->getConfiguration()->setSQLLogger($logger);
上記は、Doctrine で実行された実際の SQL を出力するためのサンプルコードです。
Doctrine で実行された SQL を出力するその他の方法
Doctrine プロファイラーは、Doctrine アプリケーションのパフォーマンスを分析するためのツールです。
Doctrine プロファイラーを使用すると、実行されたクエリ、クエリの実行時間、使用されたメモリ量などを確認することができます。
- アプリケーションで Doctrine プロファイラーを有効にします。
- PhpStorm でプロジェクトを開きます。
Run
メニューをクリックして、Debug
を選択します。
PhpStorm は、実行されたすべての SQL を Database
ウィンドウに表示します。
Chrome 拡張機能には、Doctrine で実行された SQL を確認できるものがあります。
Doctrine で実行された SQL を確認できる Chrome 拡張機能には、次のようなものがあります。
- Doctrine 2 Extension Pack
- Dbal Extension
注意事項
上記で説明した方法は、Doctrine 2.x を対象としています。
Doctrine 1.x を使用している場合は、上記の方法とは異なる方法で実行された SQL を出力する必要がある場合があります。
また、上記の方法を使用する前に、Doctrine のドキュメントを参照することをお勧めします。
php mysql orm