😀

PHPのPDOをpdo-debugを使ってSQLロギングしてみる

2022/11/28に公開

最近のフレームワークなどではSQLロギングなんて当たり前だと思いますが、古いシステムなどではまだPDO直で書いてます!!!だったり、パフォーマンスのためPDO直で書いてます!!!とかそういう環境もあるとおもいます。
そんな直PDOをロギングするときに便利なpdo-debugを使ったときのメモ

環境

* PHP 5.6

参考にしたサイト

composer経由でインストールする

panique/pdo-debugのREADMEをそのままやればいいです。

"require-dev": {
    "panique/pdo-debug": "0.2"
}

でインストール

composer install

使い方

READMEそのまんまでOKかと

$parameters = array(
    'param1' => 'hello',
    'param2' => 123,
    'param3' => null
);
$sql = "INSERT INTO test (col1, col2, col3) VALUES (:param1, :param2, :param3)";
$query = $database_connection->prepare($sql);
$query->execute($parameters);
# プレースホルダの中身がパースされてSQLが出力される
echo PdoDebugger::show($sql, $parameters);

これに加えて実行時間でも足したらクエリの発行時間とかわかっていいのかと

$parameters = array(
    'param1' => 'hello',
    'param2' => 123,
    'param3' => null
);
$sql = "INSERT INTO test (col1, col2, col3) VALUES (:param1, :param2, :param3)";
# 計測スタート
$time_start = microtime(true);
$query = $database_connection->prepare($sql);
$query->execute($parameters);
# 計測 終了
$time_end = microtime(true);

# プレースホルダの中身がパースされてSQLが出力される
$debug = array(
	'time' => $time_end - $time_start,
	'sql'  => PdoDebugger::show($sql, $parameters)
);
# ログでも吐いてみたらいかがでしょう
error_log(json_encode($debug), 3, "/var/tmp/my-errors.log");

jsonでログを吐けばjqで綺麗に整形してくれるので便利

tail -f /var/tmp/my-errors.log | jq .

簡単なSQLプロファイラの出来上がりです。

Discussion