Upload
-
View
6.783
Download
0
Embed Size (px)
Citation preview
var_dump を使わない WordPress 開発フロー
エンジニア 田島 優也
本日お話すること
PHP を開発コア言語とする Web アプリケーション開発において、 var_dump を使わずに開発を行うという意味と手法についてお話します。
田島 優也プライム・ストラテジー株式会社チーフエンジニア、第二グループリーダー
システム開発はもちろん、ディレクション、セールスなど枠にとらわれることなく日々社内外の課題解決に従事しています
講演実績:『必ず押さえておきたい今すぐできるセキュリティ対策』
(WordCamp Tokyo 2014)『案件で使えるプラグイン特集』 (WordBench 東京 ) など
執筆実績 : 『詳解 WordPress 』 ( 株式会社オライリー・ジャパン )『本格ビジネスサイトを作りながら学ぶ WordPress の教科書 2 』
(SB クリエイティブ株式会社 )
自己紹介
Twitter : @tajima_tasofacebook: demontajima
PHP ファイルを編集している時、こんな経験ありませんか?
変数 $wp_query の中身を知りたい(WordPress のグローバル変数 )
single.php
single.php
うんざりするくらいの見づらさ…
var_dump の嫌なところ
・変数の中身によっては著しく見た目を損ない、デバッグの効率が悪い。
・クライアントが確認できるような環境で作業している場合、見た目が崩れていることによって、意図しないクレームにつながる。
・見た目を崩したままデバッグしていると、フロント側 (JavaScript 、 CSS など ) で何か問題が起こっていることに気づかない可能性がある。
・ Ajax など非同期の通信の場合、単純に var_dumpするだけではデバッグできない。
本来の var_dump の機能は?
var_dump 変数に関する情報をダンプする
この関数は、指定した式に関してその型や値を含む構造化された情報を返します。配列の場合、その構造を表示するために各値について再帰的に 探索されます。
下記『 PHP マニュアル』より引用http://php.net/manual/ja/function.var-dump.php
変数に関する情報をダンプするという役割
情報がどういう状況で、どこに出力されるかは、 var_dump から切り離すことが可能。
今回の場合は、アプリケーションの最終的な表示領域を var_dump の出力先としていたことが問題なのでそこについて検討する。
クライアント サーバーブラウザ
コンテンツ
デバッグ
コンテンツ
デバッグ
こうなっているのを…
クライアント サーバーブラウザ コンテンツ
デバッグ
コンテンツ
デバッグ
こうしたい
ブラウザ以外の何か
クライアント サーバーブラウザ コンテンツ
デバッグ
コンテンツ
デバッグ
この赤枠内は閉じられていて、いかなる影響も受けないようにしたい
ブラウザ以外の何か
var_dump の問題点 ( と思っていたもの ) の整理
問題点・クライアント確認の効率を悪くする。・フロント側の開発効率を悪くする。・バックエンド側のデバッグ効率が良いとは言えない。・デバッグできないケースがある。などなど…
色々な問題があるが、それらの問題を全て解決するには
ブラウザではない何かにvar_dump の結果を出力すれば良いだけ。
var_dump の出力先を変更する。
コマンドラインベースで OS を操作したことがある方には馴染み深いリダイレクト ( ファイルディスクリプタの上書
き ) のような処理を PHP スクリプトで実装する。
cat test.txt > new_test.txt # new_text.txt に結果が出力される。# ブラウザではなくファイルに書き込まれるイメージ。
cat test.txt # 端末の画面に結果が出力される。# ブラウザに表示されるイメージ
デバッグのフロー
・ var_dump で出力されるデフォルトの出力バッファへの書き込みを抑制する。
・出力バッファ領域を新たに確保して、そこに出力をためておく。
・ためておいた内容をログファイルに書き出す。
・ファイルの更新を監視させ、ファイルに書き込まれるたびに端末上に追記情報を流しつづけることによって、デバッグしたい情報をリアルタイムで確認。
具体的な実装とフロー・ var_dump で出力されるデフォルトの出力バッファへの書き込みを抑制する。・出力バッファ領域を新たに確保して、そこに出力をためておく。ob_start(); var_dump( $dump ); $out = ob_get_contents();ob_end_clean();
・ファイルの更新を監視させ、端末上に結果を流しつづける。tail –f /var/log/test/log
・ためておいた出力結果をファイルに書き出す。file_put_contents( ‘/var/tmp/test.log’, $out, FILE_APPEND | LOCK_EX );
WordPress での実装方法・ var_dump で出力されるデフォルトの出力バッファへの書き込みを抑制する。・出力バッファ領域を新たに確保して、そこに出力をためておく。ob_start(); var_dump( $dump ); $out = ob_get_contents();ob_end_clean();
・ためておいた出力結果をファイルに書き出す。file_put_contents( ‘/var/tmp/test.log’, $out, FILE_APPEND | LOCK_EX );
関数化した上記の処理を記述した php ファイルをmu-plugins フォルダへ置く。
WordPress での実装方法
・ためておいた出力結果をファイルに書き出す。file_put_contents( ‘/var/tmp/test.log’, $out, FILE_APPEND | LOCK_EX );
CUI を使っている場合は、 touch /var/tmp/test.log ; chmod 666 /var/tmp/test.logなどの操作をしてファイルを作成しておき、 Web サーバからも書き込める状態にしておく。 GUI の場合は書き込めるテキストファイルを作成しておき同じく Web サーバから書き込める状態にしておく。※ただし、 PHP を CLI として使っている場合は実行しているユーザーが書
き込めることができれば良い。
WordPress での実装方法
・ファイルの更新を監視させ、端末上に結果を流しつづける。tail –f /var/tmp/test.log
端末エミュレータを起動し、下記のコマンドを入力する。 ( 必要に応じてバックグラウンドで )
single.php
ブラウザリロード時変化なし
ターミナルなどの画面に、情報がリアルタイムで更新され続ける。もちろん、あとからテキストファイルを開いて、ゆっくり確認することも可能。
console_log 関数の詳細
https://github.com/yuya-tajima/console_log
今回使用した console_log 関数は単純に var_dump をテキストファイルに出力するだけでなく、色々な追加情報を表示するような実装になっています。
まだまだ開発中ですが、下記のリポジトリで定期的に改修しているので、改善案、要望案などございましたらご連絡頂けると嬉しいです。
まとめ・プログラミング言語のビルトイン関数は必要最低限
の機能が多く、それぞれの状況に応じて変更したいというケースがあるので、独自にラッパー関数をつくるか、ライブラリで提供しているラッパー関数を使って開発効率をあげる。
・新たな問題に直面した時は、既存のソリューションを組み合わせて新たなソリューションを創りだせないか考えてみる。
ご清聴ありがとうございました!