PSR-3 Logger Interface
のご紹介
第67回PHP勉強会@東京
@Hiraku
目次
• 最近のPHPフレームワーク界のトレンド
– 何故PHP-FIGが生まれたか
• PSR-0,1,2について
– おさらい
• ログは大事
– 本題!
• PSR-3によってもたらされる世界
自己紹介
• Hiraku (中野 拓)
• 某ポータルサイトのWeb
プログラマ
• ライブラリアン(サービス
作るのはあまり興味ない)
• そろそろPHP歴5年ぐらい
• PHP-FIGはROM専です
https://twitter.com/Hiraku
https://github.com/hirak
http://blog.tojiru.net/
このスライドの主張は多分に
個人の見解が混じっています
おことわり
• 最近のPHPフレームワーク界のトレンド
– 何故PHP-FIGが生まれたか
• PSR-0,1,2について
– おさらい
• ログは大事
– 本題!
• PSR-3によってもたらされる世界
最近のPHP界のトレンド?
• フルスタック指向 • コンポーネント指向
最近のPHP界のトレンド?
• フレームワークの一部だけ使ったり
• 組み合わせたり
• マイクロフレームワークの増加
• Composer/Packagistの盛り上がり
キメラ錬成
• 色々組み合わせて「ぼくの考えた最強の
怪物フレームワーク」を作れる
脱・フルスタック
• フレームワークにない機能も外から
持ってこれる
• やるかやらないかは別
• 基本的に選択肢が増えるのはいいこと
だがちょっと待ってほしい
フレームワークの組み合わせ
なんて可能なのか?
フレームワーク間にそびえ立つ壁
• 命名規則
• コーディング規約
• ディレクトリ構造
• 例外の使い方
• インターフェースがバラバラ
…etc
そこでPHP-FIGですよ
• フレームワークの相互運用性について議
論するグループ
http://www.php-fig.org/
大御所いっぱい参加
余談
• FuelPHPやCodeIgniterが入ってません
• 仲悪いのかな?
話を戻すと
• PHP-FIGで決まったことを元に、
フレームワーク同士の相互運用性を高め
ていこう!という雰囲気
• 究極的には、ありとあらゆるフレーム
ワークやライブラリが組み合わせて使え
る世界を目指している
PHP-FIGが決定したもの:
PSR(Propersed Standards
Recommendation)
• 最近のPHPフレームワーク界のトレンド
– 何故PHP-FIGが生まれたか
• PSR-0,1,2について
– おさらい
• ログは大事
– 本題!
• PSR-3によってもたらされる世界
PSR-0
Autoloading Standard
PSR-0
• 要約:
– クラス名は被らないようにしろ
– クラス名とファイルパスは合わせろ
• 名前空間先頭はvendor prefix
– Symfony¥Foo
– Zend¥Foo
– Acme¥Foo
• Autoloaderが共通化できる
PSR-1
Basic Coding Standard
PSR-1
• 要約:変な作りにするな
– PSR-0に従え
– ソースコードはUTF-8(without BOM)で書け
– 副作用(Side Effect) はクラス定義と分割しろ
• 読み込んだだけで勝手にechoすんじゃねえ
• php.iniの設定を勝手に変えるな
• スクリプトのロードも勝手にするな
– 定数はSUPER_CASE、メソッドは
camelCaseとか
PSR-2
Coding Style Guide
PSR-2
• ほぼコーディング規約っぽい何かです
– 詳細は省略
• PHP_CodeSnifferでチェックできます
– http://pear.php.net/package/PHP_CodeSniffer/
• CS Fixerもあるよ
– http://cs.sensiolabs.org/
• PSR-2準拠を謳うライブラリ増加中
-ここまで前置き-
長くなりましたが
• 最近のPHPフレームワーク界のトレンド
– 何故PHP-FIGが生まれたか
• PSR-0,1,2について
– おさらい
• ログは大事
– 本題!
• PSR-3によってもたらされる世界
PSR-3
PSR-3 Logger Interface
• 2013-01-05にacceptedになった
• 読んで字のごとくロガーのインター
フェース規約
• https://github.com/php-fig/fig-
standards/blob/master/accepted/PSR-3-logger-interface.md
• 今までのPSR-0,1,2と雰囲気が違う
– 「PSR-2に従え」って書いてない
– コーディング規約っぽくない
PSR-3の基本
• ロガーはPsr/Log/LoggerInterfaceを
実装したクラス。
• psr/logに一式揃っている
– https://packagist.org/packages/psr/log
• インスタンス化して利用する
• ログレベル定義はsyslog(RFC5424)に
準じる
– emergency, alert, critical, error,
warning, notice, info, debug
PSR-3準拠のロガーイメージ
<?php
require 'vendor/autoload.php';
class JsonLogger extends Psr¥Log¥AbstractLogger
{
function log($level, $message, array $context=array())
{
error_log(json_encode(
compact('level', 'message') + $context
));
}
}
$log = new JsonLogger; //このインスタンスを色々な場所で使いまわす
$log->emergency('oh my god!');
…正直なところ
• PSR-3自体はそんなに大したことは書い
てない
• 読んでも「ふーん」で終わる
• ここからはロガーがPSR化されたこと
の意義を考察する
デバッグについて
ちょっと話をそらしますが
質問
• デバッグってどうやってますか?
• デバッガ使ってる?
• var_dump()?
割とどうでもいい(個人の見解)
• デバッガはデプロイ後には役に立たない
– ユーザーが体験した「不具合」を再現できれ
ば使えるけど…
– ユーザーのデータがレアケースだったり再現
性がない不具合だったり…
ログの力
• デプロイ後の不具合究明に役立つのが
アプリケーションログ
– 不具合が起きたら問題をロギングする
– Web APIなどはきちんと叩けたこともロギン
グしておくとよい
• アリバイとして役に立つ
• ログを見れば犯人がわかる状態が理想
参考:表明(assertion)
• assert()でtrueになるはずの条件をコード
中に列挙しておく
– assert($param instanceof DateTime)とか
– 小さなユニットテストが常に実行される状態
を作る
– もしassert()がfalseを受けたらエラーを吐く
• デバッグログと似た概念
• PHPのassert()は関数なので、ロガーで代
替しても性能はあまり変わらない
オレが思う重要度
1. アプリケーションログの設計
2. 例外とスタックトレース
=====越えられない壁======
3. var_dump()デバッグ
4. デバッガの使い方
要するに
ログは重要
• 最近のPHPフレームワーク界のトレンド
– 何故PHP-FIGが生まれたか
• PSR-0,1,2について
– おさらい
• ログは大事
– 本題!
• PSR-3によってもたらされる世界
ログは重要なので
• あちこちのフレームワーク内で再実装さ
れている
• 車輪の再発明されまくり
monolog
PEAR_Log
Zend¥Log
この状態でキメラ錬成すると
• 「10個ライブラリを組み合わせたよ」
– 10個ともオレオレロガーを内包している
• 「ログレベルをデバッグに切り替えて」
• 「ログの出力先をDBに切り替えて」
– 10か所設定を変えないと駄目
つらい!!
どうする?
• 1つのロガーだけを使うようにして、
自前実装を禁じよう
– まちがい!
• ロガーのインターフェースを揃えて、
差し替え可能にしよう
– せいかい!
PSR-3にみんな準拠したら
• ロガーは差し替えて統一できる!
• 組み合わせこわくない
CakePHP Symfony Zend
Framework
PSR準拠
ロガー
PSR準拠
ロガー
PSR準拠
ロガー
monolog
PHP-FIGの目指すもの
• 究極的には、ありとあらゆるフレーム
ワークやライブラリが組み合わせて使え
る世界を目指している(再掲)
• PSRはただのコーディング規約じゃない、
その先を見ている
まとめ
• ログは大事
• PSRに定められるほど大事
• ロガーがPSRになったことの意義は大きい
• 今後のPSR-nは似たような取り決めが増
えるかもしれない
– HTTPクライアントとか議論されてた
補足:普及度
• PSR-3準拠のロガーはまだまだ少ない
• monolog ぐらい?
http://github.com/Seldaek/monolog
• Zend¥Logとかも対応してない
PSR-3の理想のために
• 例えばZend¥Logを使うにしても、一度
PSR-3のインターフェースにラッピング
してから使うようにする
– 面倒くさいけどな!
– PSR-3に従っておいた方が他のロガーとの交
換性が高くなるはず…

PSR-3 Logger Interfaceの紹介