Windows版PHPでLOG_DEBUG定数でハマる
発端はCakeLogクラスのwrite関数。76行目あたりから抜粋。
$levels = array( LOG_WARNING => 'warning', LOG_NOTICE => 'notice', LOG_INFO => 'info', LOG_DEBUG => 'debug', LOG_ERR => 'error', LOG_ERROR => 'error' );
LOG_*定数がちゃんと入っていればこの配列は正しく定義されるんだが、Windowsの場合この定数が怪しい。
d:id:Tetsujin:20070524さんが書かれているように、全然違う定義になっとる。
Windowsで上記の配列はどのように展開されるかというと
array 5 => string 'warning' (length=7) 6 => string 'debug' (length=5) 4 => string 'error' (length=5) 2 => string 'error' (length=5)
なんじゃこりゃ(´・ω・`)
で、何が起こるかというと
- LOG_WARNING : warning.logに出力
- LOG_DEBUG : debug.logに出力
- LOG_INFO : debug.logに出力
- LOG_NOTICE : debug.logに出力
- LOG_ERROR : error.logに出力
- LOG_ERR : error.logに出力
となる。noticeとinfoがすっ飛んだ!
どうすっかなぁ・・・ということで強引にrunkitエクステンションを使ってLOG_INFOとLOG_NOTICE定数を再定義しちゃえばいいんじゃね?俺天才じゃね?
さっそくPHPマニュアルを参照。こんなすばらしい関数が。runkit-constant-redefine
var_dump( runkit-constant-redefine('LOG_NOTICE',5) );
だが無情にもfalseが返る。悪そうなところもないので、もしかしてrunkitバージョンの問題じゃね?ってことでマニュアルを参照
(PECL runkit >= 0.7.0)
うむ。問題なさそうだが。念のためxamppのphpinfo()でrunkitバージョンを確認したところ"1.0.0-dev"。
なんでうごかんの?(´・ω・`)
いやな予感がして英語マニュアルを見る。
(PECL runkit:0.7-0.9)
_, ._ ( ゚ Д゚) ( つ旦O と_)_) _, ._ ( ゚ Д゚) ガシャ ( つ O. __ と_)_) (__()、;.o:。 ゚*・:.。
万事休す。CakeLog書き換えるしかないのか?