CakePHP2から5に乗り換えた話 〜DebugKitが動かない〜

デバッグは虫を取り除くみたいな意味

この記事を三行にまとめると

トップレベルドメインを追加する
forceEnableをtrueにする
Debugkitの接続設定を追加する
CakePHP2の頃はビューの中でsql_dumpというエレメントを呼び出すとSQLのログを見ることができましたが、CakePHP3以降はDebugkitというツールを使ってログを見るようになりました。個人的にはDebugkitの方が圧倒的に見やすいんでありがたい機能なんですが、僕のCakePHP5の環境ではこのDebugkitがどうしても上手く動いてくれなかったんですよ。

僕の環境ではずっとこんなエラーが出てました。

There are configuration problems present which need to be fixed:
Try adding your current top level domain to the DebugKit.safeTld config and reload.

現在のトップレベルドメインの設定がまずいぜよって感じのエラーです。どうやらDebugkitはlocalhostなどのテスト環境でのみ動作するように気を配ってくれるみたいで、本番環境で使用するドメインなどではデフォルトでは動かないような設定になっているみたいなんですね。

なので例えばこのサイトのドメインである「norm-nois.com」とかで動かすには設定を変更しないといけない。

設定を変更するにはbootstrap.phpに以下の内容を追加します。

if(Configure::read('debug')) {
  Configure::write('DebugKit.safeTld', ['com', 'jp']);
}

Debugkitを有効にしたいドメインを追加するってことですね。追加するのはトップレベルドメインの部分だけで良いのでcomとかnetとかjpを追加します。



これで自分のサイトでも出るようになる……はずなんですが、僕の場合は上記の設定を書いても動きませんでした。

なので特定のドメインでだけ動くとかではなく強制的にDebugkitを有効にする設定に変えました。

if(Configure::read('debug')) {
  Configure::write('DebugKit.forceEnable', true);
}

これで常時有効な状態になります。ただしこの場合は本番環境でDebugがオフになるようにしておかないと世界中の人に丸見えになっちゃうので気をつけてください。



これならsafeTldがどうとか関係なく出るようになる……はずなんですが、僕の場合はこれでも動きませんでした。上記のエラーは出なくなったんですが、代わりに新しいエラーがでるようになってしまいました。

SQLSTATE[HY000]: General error: 1 near "(": syntax error

何かのSQLエラーですね。Debugkitはログをデータベースに書き込む仕様になっており、デフォルトだとtmpフォルダの中にあるdebug_kit.sqliteというファイルに書き込みます。ここへの書き込み時に何かしらのエラーが出ているんじゃないかと思うのですが、どうすれば正常に書き込まれるようになるのかってのが分からなくて解決できませんでした。

じゃあどうすれば良いかって話なんですが、書き込み先のデータベースを変えることで回避するという選択肢があります。

app.phpやapp_local.phpにデータベースの接続設定を書くところがありますが、ここにDebugkitの接続設定を追加します。

'Datasources' => [
  'default' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'ホスト名',
    'username' => 'ユーザー名',
    'password' => 'パスワード',
    'database' => 'データベース名',
    'encoding' => 'utf8',
  ],

  'debug_kit' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'ホスト名',
    'username' => 'ユーザー名',
    'password' => 'パスワード',
    'database' => 'データベース名',
    'encoding' => 'utf8',
  ],  

debug_kitの接続先をdefaultと同じところにすると書き込み先がtmpのdebug_kit.sqliteからサーバーのデータベースに変わります。僕の場合はこれでエラーが出なくなりました。

サーバーの方に切り替えるとpanelsとrequestsというテーブルが新規に作成され、そこにログが書き込まれます。放っておいても問題はないんですが、わりとガンガンログがたまっていく上に基本的には取っておく必要のないデータだと思うので、一応自動で削除される仕組みになってる感じもあるんですが(rand関数で1/100を引き当てれば消えるみたいな仕組みになってるっぽい)、気になる場合は自分で定期的に削除した方が良いかもしれません。特にpanelsの方はバイナリデータを保存するみたいで、溜め続けていると結構なデータ量になります。

その他のCakePHP5に乗り換えた話はこちら
ようやくのぼりはじめたはてしなく遠い開発坂
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください