PHP5.2.10とAPC3.0.19の組み合わせでsession_set_save_handler()を使うと不具合が生じる。

PHP5.2.10とAPC3.0.19の組み合わせでsession_set_save_handler()を使うと不具合が生じる。

 PHP5.2.9なら問題ないので、5.2.9から5.2.10への変更で何かあったんだろうと推測。

 PHP5.2.11(あるいはAPC3.1.x)で問題ないかは未確認。

 ……相変わらずイヤになるなぁ。

追記

 バグレポ発見。bogus扱いされてるけどたぶんコレだな。


追記(2)

 どうやらセッションのwrite処理の時にクラス名のシンボルテーブルか何かがざっくりなくなってる印象。

 スコープ定義演算子を使うものはNG*1

 既に存在するインスタンスのメソッド呼び出しなどは問題なく動く。

追記(3)

 どうやら

  1. セッションの終了処理
  2. APCの終了処理(ここでシンボルの破棄)

――だったのが、

  1. APCの終了処理(ここでシンボルの破棄)
  2. セッションの終了処理

――に変わったのではないか? と職場の同僚のお話。

 ChangeLogには特になかった気もするけど、PHPは互換性を気にせず平気でいろいろ変更したりするからありそうな気はする。

 PHPの内部の話はどこで相談するのがええんじゃろ。

追記(2009-11-05

 上記の理由から「ひょっとして、register_shutdown_function() で session_write_close を登録したら動くんじゃね?」と思ってやってみたら、ちゃんと動くようになった。

 これで副作用がなければいいのだけれど。。。

追記(ラスト)

 どうもextensionの終了処理の順番が変わったせいらしい。

(5.2.9と5.2.10で変わってた)

 で、終了処理はRSHUTDOWNとpost-RSHUTDOWNの2種類あるっぽいので、APCは現在RSHUTDOWNでやってる処理をpost-RSHUTDOWNでやるように修正すべきっぽい。

*1:たとえば、PEAR::isError()。