Quote:
minahito wrotes:
これ、やっちゃうことにしました。
RC がなんだぁ〜(おい
判断を尊重いたします〜
とりあえず、多くのサイト(いずれもX2)にパッチを当てましたが、どれも正常に動いているみたいですよ。
Legacy2.1へのパッチも、今を外すと辛そうですから。
Quote:
static と global で引っ張った変数には直接リファレンスはとれないのですが、 static $t = array() にして $t['foo'] =& ... は OK みたいです。これは直接リファレンスを収録しているのは array() メモリ空間なので...
私もこれはちょっと勘違いしていたみたいです。ただ、ローカルなstaticに別々に保存してあるのは確かなので、各モジュールについて、最大3個ずつのインスタンスってことですね。
Quote:
2.1 系から本家へレポートしたほうがいいバグもすごくたくさんあるんですが(途中で把握しきれなくなった orz 都度やっとけばよかった)、これは忘れずレポートしたほうがよさそうですね。まぁでも PEAK は読まれているから大丈夫だと思いますが...
少なくともこの件は、同じオブジェクトじゃないのは「気持ち悪い」というレベルで、最悪でもパフォーマンスだけですから、あまり重要じゃないかもしれませんね。
sourceforge.net でのやりとりは追ってませんが、(不毛そうなので
)
Quote:
これは初めて知りました。(勉強になります!)
ただこのケースは、staticにリファレンスが保持できるかどうかだけの問題じゃなかったりします。
少なくとも、従前のコードでは、
最初のgetObjects()で1個。
次のget()で1個。
最後にgetByDirname()で1個。
と、1つのモジュール(dirname)につき、3個のモジュールオブジェクトが作成されていたのを確認しました。
これは、Zend Engine 1 側の不具合うんぬんというより、純粋にコーディングミスだと思います。ZE2以上でも、同様に3個のオブジェクトが作られるはずです。
んー、たしかに、staticの使い方がおかしいみたいです
と思ったのですが
Quote:
100%の確証が持てないのが XOOPS2 の恐ろしいところ
鋭い、
どうもphpバージョン違いとかサーバー違いの実動作の検証が必要そうです
というのが、
どこかで聞いたと覚えがあるけどと思い、
過去のトラッカーを探してみました
CVS
http://xoops.cvs.sourceforge.net/xoops/xoops2/kernel/module.php?r1=1.11.2.1&r2=1.11.2.2で
たぶん xoops2.0.9からかな?
「モジュールハンドラのキャシュが効いてない」
のクレームに対して、
static を宣言することで直ったかのように書いているのですが?
なぜ、
もともとが
$this->_cachedModule_mid
で維持しようとした
だけど前はキャシュ動作が出来ていないとバグトラッカーに報告がある
phppp (#1044971)さんと、mithyt2 (#989462)さんですね
ソースを見る限り、今見ると原因は謎に思えます
今のphpマニュアルを見ると
&get
と
&getByDirname
に
でスコープの違う
static
になるので
それぞれに
&get
と
&getByDirname
で、別のものを見ていることになるので
(もしかして、前はスコープは?一つだった?)
staticでないと維持できないという実状があるのなら?
staticに維持するところを、別関数一つに
インスタンスの確認とセットをまとめるとか?
でも
たまたま今日そのあたりphpマニュアル見てたら
http://jp.php.net/manual/ja/language.variables.scope .別の問題ですが
phpマニュアルに
「PHP4を駆動するZend Engine 1では
static変数にリファレンスの値は保持できない」
でサーバーの違いも考慮が必要かと
(これは、いつ追加されたのかな?
Zend Engine 1では意図せぬ動きをするらしいと
書いてるから、んーそうなのでしょう)
むしろ今まで動いていた方が不思議なくらいなので、パッチしちゃっても、大丈夫じゃないかとは思いますが、すでにステージがRCなだけに…