PHPSESSIDの無限ループ

Cookieが無効な環境のために、PHPのセッションID(デフォルトで"PHPSESSID")をURLに(クエリストリングとして)くっつけてリダイレクトする。
ということはモバイル向けサービスで良くあることだと思う。
んで、ローカルでテスト中、件の無限ループが発生した。
apacheのアクセスログを見ると、
hoge.php?foo=var
hoge.php?foo=var&PHPSESSID=(SSID1)
hoge.php?foo=var&PHPSESSID=(SSID1)&PHPSESSID=(SSID2)
...
hoge.php?foo=var&PHPSESSID=(SSID1)&PHPSESSID=(SSID2)&PHPSESSID=(SSID3)&PHPSESSID=(SSID4)&PHPSESSID=(SSID5)&PHPSESSID=(SSID6)
...

すなわち、
hoge.php?foo=var
にアクセスがあって、セッションIDがついてないのでつけましょう。そしてリダイレクト。
hoge.php?foo=var&PHPSESSID=(SSID1)
おやおや、セッションIDがついてないのでつけましょう。そしてリダイレクト。
hoge.php?foo=var&PHPSESSID=(SSID1)&PHPSESSID=(SSID2)
っという具合に、無限に繰り返し、URL長エラーになるまで繰り返してた。っということ。

原因は、"&"であるべきセパレータが"&"になっていること。
"PHPSESSID"のつもりが、"amp;PHPSESSID"になっちゃったわけだ。

さて、誰の仕業だろう?
プログラムで発行しているときにやっちまった?
Net_URLを使ってるから、この子のせい?
PHPが自動で付けたもの?
Apacheが変換した?

とまあ、色々調べてしまったよ。
結論を言うのは簡単だなぁ。。
その結論とは、
PHPの設定がヘンだった。それと、PHPの設定をNet_URLが忠実に読み込んでいたから。

Net_URL::getQueryString()で、クエリストリングのセパレータを、ini_get('arg_separator.output')で取ってきてます。

んで、オイラのWindowsなxampp環境では、php.iniファイルで下記の通り指定していた。
arg_separator.output = "&"


むむむ。なんでこんなことしたんだっけ?
はい。これをコメントアウトして、サービスを再起動すると、…ちゃんと動いた。


以下、苦労した原因を箇条書きしておく。繰り返さないように(´・ω・`)
・デバッグ用にリダイレクトURLをHTML出力してみたわけだが、<textarea>タグ内ならば生のソースが表示されるハズ、と初歩的な勘違い
  → "&"と表示されて、うーん、ここまでは上手く行ってるのに…と誤解。実際は"&amp;"だったのに
・php.iniを書き換えたら即時適用されそうな気がしていた
  → apacheを最起動しないと読まないよ。Windowsの場合サービスの再起動が必要。
・php.iniを変更するなら、なぜそうしたかメモっておこうよ。。
・グーグル先生を過信し過ぎ(←あえて冗長表現してみた)。

PHP

— posted by たか at 03:27 pm   pingTrackBack [0]

 

BroadcastReceiverが勝手に止まってしまう件について

BroadcastReceiverを使って、ほとんどすべてのブロードキャストを受け取ってToastでポップアップ表示する。
という、うっと惜しい(なぜか変換できない)Widgetを作ってみたLink わけだが、いつの間にか勝手に泊まる。いや、止まる。

さて、グーグル先生に相談だ(音符

BroadcastReceiverに寿命があって、寿命が尽きたことを知る手段でもあるのではないかと探したんだけど、うまくいかない。
んで、それは置いておいて、別件でサービスについて調べてたんだけど、
…これは、という情報があった。

こちらに曰く、

Android は、メモリが少なくなってくると...サービスも止められてしまうことがある
...
システムがサービスを停止させた場合、メモリに余裕が出来るとシステムが再度起動してくれる
ああ、そんなこと聞いたことある。聞いたんじゃなくて読んだんだけど。<どうでもいいだろ

システムから起動された時は Service::onStart は呼ばれず、Service::onCreate までしか呼ばれない
これだ(゚∀゚)!
確かに、ServiceのonStartでBroadcastReceiverをregisterReceiverしておった。
onCreateでレジストしてもよかろうもんがじゃ。
これで、止まっても復活してくれるのかなぁ。

やってみるけど、いつ勝手に止まるか、そしていつ再起動するかがわからないから、テストがムズイね┐(´д`)┌

ウィジェット アンドロイド

— posted by たか at 12:15 am   pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
Created in 0.0047 sec.
prev
2011.10
next
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
 
blogBar
Firefox3 Meter