デフォルトは3それぞれ数値を指定するか、-1にすると無制限で表示されるようになります。php.iniで設定する他に、ini_set()や.htaccessのphp_valueでも設定可能です。Xdebugが有効だとエラー発生時に次のようにスタックトレースを表示してくれたり・・・トレースログやプロファイリングデータの出力なんかも可能ですし、IDEと連動してリモートデバッグもできたりします。debug()CakePHPを使っていると利用可能になるdebug()関数は、グローバル関数なのでどこでも使えます。Xdebugのように別途ライブラリをインストールする必要もありません。Mode)の場合のみ表示されます。'd');debug($str);debug($array);debug(is_array($str));こんな感じで、var_dump()するよりも若干見やすく整形して、どのファイルの何行目で呼び出されているかも合わせて表示してくれます。第二引数にfalseを指定すると、スタイルが適用されずに単なるテキストとして表示されます。false);~第三引数もあり、ここにfalseを指定するとどのファイルの何行目で呼び出されたか、の表示を非表示にする事ができます。false);~このように、Xdebug/debug()を利用する事で見やすく出力できるようになりました。階層が深い配列やオブジェクトなんかは無加工のままvar_dump()すると追うのが大変なので、こういう見やすくしてくれる手段が存在するのは非常に有り難いです。これでデバッグがより快適に行えるようになりましたが、var_dump()やdebug()のような「画面に出力する」系を使うと出力する場所によってはレイアウトが崩れてしまう場合が十分にあります。設定や場面によっては画面に表示できないという場合もあるので、その場合は確認するためにわざわざ設定を調整する・・・という作業も必要になります。ログに出力すれば良いのですが、フレームワークを利用していない場合はわざわざログ生成回りのロジックを用意しなければならないので、少し億劫な時もあります。Loggerを使って、画面に影響を与えずにデバッグを行えるようにします。ToolsにあるConsoleパネルから見られるようにしてくれる、ちょっと変わり種のツールです。上記サイトにある対応している言語一覧を見ると、PHPの他にもRubyやPython、さらにはGoにも対応しています。ライブラリが置いてあるので、「ChromePhp.php」をダウンロードしてincludeする、もしくはComposerで導入これだけです。使ってみるプログラム側は、出力したいタイミングでChromePhp::log()を使用して、引数にテキストを渡すだけです。他にも、ChromePhp::warn()やChromePhp::error()で出力するログの種類を変えられたり、ChromePhp::group()でそれ以降の出力をグループ化する事もできます。Loggerのボタンが表示されているので、ここを1回クリックしてOnの状態(アイコンが黒から青くなります)にしておく事で受信できるようになります。上の画像の一番右のボタンです。この状態でOnになっています。実行してみるとこんな感じで出力されます。'ChromePhp.php';ChromePhp::log('log');ChromePhp::warn('warning');ChromePhp::error('error');ChromePhp::group('group');ChromePhp::log('log');ChromePhp::warn('warning');ChromePhp::error('error');仕組みその仕組みは結構簡単です。Specを眺めていると分かりますが、「X-ChromeLogger-Data」というヘッダにbase64化したjsonデータを紛れ込ませて送信しているだけです。ライブラリの394行目を見ると、値をエンコードしてheader()で送信しています。DeveloperConsoleを見ても、確かにヘッダに含まれています。informationが表示されます。標準関数やフレームワークでの関数とは違い、そのままですと環境を問わず出力してしまうという所にも注意が必要です。Loggerのコードが公開環境でも残ったままですと、本当は人に見られたくないようなデバッグ出力が第三者に受け取られてしまうかもしれません。そのため、確認時のみincludeして使用する、という運用が最適かと思われます。ChromeLoggerを使う事で、画面に影響を与えずにデバッグ用の情報を出力できるようになりました。var_dump()などで画面に出力できない部分(Ajaxを利用したAPIでのやりとりなど)のデバッグログ出力も行えるようになるので、そういった場面ではChromeLoggerで確認する事が多いです。これである程度の動きは難なく追えるようになりましたが、毎回デバッグの出力文を書く必要は変わらずあります。自分で制御している部分はある程度仕方ないのですが、フレームワークで制御されている部分ほど頻繁に確認するのがほとんどなので、その度に画面毎にデバッグ文を書いて・・・というのは手間な場合がほとんどです。そこで、フレームワークにはデバッグツールが付いてきている場合があるのでそれを使ってみるというのも一つの手です。使っている環境によって様々ですが、CakePHPではDebugKitを使用します。DebugKitDebugKitをご存じない方に向けてどんなものか簡単に説明しますと、CakePHP向けに提供されているデバッグツールです。フレームワーク内で処理された送受信データやSQLクエリのログや実行時間が確認でき、更に、フレームワーク内部の処理時間やメモリの使用量も確認できます。そのため、デバッグツールとしてだけではなく、簡易的なプロファイラーとしても利用しています。導入して利用可能にすると下記のようなツールバーが表示されます。各パネルをクリックすると詳細情報が表示され、それぞれ次の内容が確認できます。DebugKitが有効な状態で送信した今までのリクエストが確認できます。現在のセッションに格納されている情報を確認できます。GETやPOSTで飛んできたリクエストやルーティング、Cookieの情報などリクエスト送受信回りのデータが確認できます。発行したSQLのクエリログを確認できます。ここからExplainできたり、時間がかかっているログには印が付いたりするので、SQL回りの問題の原因は比較的見つけやすいです。各処理にかかった時間や消費したメモリの量を確認できます。ログに書き出す処理($this->log())を実行した時に出力されたログの内容を確認できます。コントローラーからビューに設定($this->set())した内容や、$this->request->dataの中身、ページャーで利用したデータの中身が確認できます。PHPやCakePHPで使用できる環境変数を確認できます。Includeプラグインをロードしてコンポーネントとして読み込ませる(DebugKit.Toolbar)だけなので使い始めも非常に楽です。Mode)の場合のみ表示されるため、本番環境でちゃんとLevelを切り替えていれば間違って表示される事もありません。ちなみに、FuelPHPにもプロファイリングという同じようなものがあります。見た目はこっちの方が豪華ですね・・・。補助ツールを使う事により、頻繁に確認するデータについてはコードに変更を加えなくとも確認できるようになり、実行時間やSQLクエリログも確認できるようになりました。フレームワーク様々です。簡易的なものなので、もう少しロジックの流れを深く追ったりボトルネックを追いたいという場合は本格的なプロファイラーで計測する必要があります。Xdebugにもプロファイリング機能は付いているのですが・・・今回はブラウザベースで視覚的に解析結果を追えるBlackfireを使ってみます。BlackfireBlackfireは、Symfonyの開発元のSensioLabsが開発した、PHP向けプロファイラーです。ChromeのExtension(以下Companion)の他にもPHPのExtension(以下Probe)やサーバ側に計測用デーモン(以下Agent)を入れなければならなかったりと、導入までのハードルは高いのですが、その分精度が高かったり細かい所まで計測してくれるので、ボトルネックを簡単に見つける事ができます。Startedに詳しく書いてあるので、基本的にはそれに沿って進めれば良いかと思われます。ちなみに、会員登録が必要(GitHubかGoogleがあればOK)です。次の環境下でないと動作しないため注意が必要です。5.3~5.6までCompanionはChromeのみ結果表示はIE以外で動作Debian系やRHEL系であればリポジトリを追加してそこからAgentやProbeを導入できますし、マニュアルでのインストールも可能です。Macの場合はHomebrewから。環境により若干変わってきますが、基本的には以下のような流れです。ついてビルドされていると使用不可」「XdebugやXHProfと共存不可、Probe有効時にこの辺入っていた場合は自動で無効化」という条件付きのようです。Xdebugとの共存は環境を変えるなり手動で切り替えれば良いのですが、それが大変という場合はどちらかを選ばなければなりません。ここまで無事に導入できたら、CompanionをChromeに導入します。Blackfireにログイン済みであれば、Companionにも自動でログインされます。使ってみる今回はWebページのプロファイリングを試しにやってみます。他にも、blackfireコマンドを経由する事でCLIのスクリプトやAPI/Webサービスの呼び出しなんかもプロファイリングできます。Companionのアイコンをクリックすると、こんなポップアップが表示されます。(Empty)」になっているスロットを選んで「Profile!」をクリックすると計測が始まります。計測が完了すると簡単な計測結果が表示されます。右から総実行時間、I/O、CPU、メモリ使用量、ネットワーク使用量の順です。Profile」をクリックすると、プロファイリング結果のページが表示されます。上の計測結果のバーは大体同じですが、カーソルを載せると詳細が表示されます。タイトルの部分に載せると、リクエスト結果やサーバ側に導入されているBackfireコンポーネントのバージョンが確認できます。メインの画面に視線を移すと、2ベインの構成になっています。右側が関数やメソッドのリストで、左側がコールグラフです。コールグラフで赤い枠で覆われていたり背景が赤い部分は、そのアプリケーションのボトルネックとなっている部分です。色が濃ければ濃いほどよりボトルネックとなっている部分ですので、そこを確認して解消するようにします。グラフをクリックすると、関数リストの該当部分を表示してくれます。関数名の横にある虫眼鏡マークをクリックすると、コールグラフ上で呼び出され/呼び出しの詳細な相関図が確認できます。リストでは、実行時間(Excl.が排他時間、Incl.が統括時間)や呼ばれた順に並び替えが可能です。ちなみに、プロファイル結果は共有する事も可能です。試しに今回の結果を共有してみましたので、どんな感じで動作するか確認できます。まとめ普段デバッグやプロファイリングで使っているツールをいくつかご紹介しました。Loggerは色んな所で使えるのではないかと思います。開発時はかなりお世話になる部分なので、おさえておいて損は無いはずです。プロファイリングはかなり多種多様でした。BlackfireはSymfonyの開発元が作っているだけあって、解析や調査がかなりやりやすいです。サーバの管理者権限が必要だったり、PHP拡張やデーモンも入れなければならなかったりとハードルは高めですが・・・Vagrantなどの仮想環境でも使えるので、手元の環境で試してみて、どんな感じか感覚を掴んでみて頂ければと思います。使ってみれば分かる、はずです。他にも、良いツールがあれば是非共有して頂ければな、と思います。navigationWebスクレイピングのノウハウを公開しますマイナー?なSSHクライアント6選を使って比べてみた株式会社リスペクトという、仙台・東京に拠点を持つ会社のシステム部門のブログです。プログラミングやシステム運用のノウハウなどを公開していきます。