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書き換えるしかないのか?