[Perl] CGI::Session で bad file descriptor が出た

こんばんは。
今日も定時のおじいさんです。定時ということで、なかなか時間配分が大変です。疲れます。
それはともかく、ちょっと見つけた「こりゃわからんだろ」という話。

適当に携帯用Webページを作っていたわけですが、その際にCGI::Sessionを使っていたわけですよ。
で、なぜか実機からアクセスすると、

bad file descriptor

が出て、セッションが切れてしまう。
なんでじゃろなあ?と思っているとデスね、原因は$CGI::Session::IP_MATCHという変数でした。
これが1の時には、remote_addrを確認して一致していなければならない。
元を識別するのには有効な手段です。

しかし、携帯の実機の場合、アクセスが携帯網→ゲートウェイ→インターネットとくるんですが、ゲートウェイが複数台あり、アクセスごとに切り替わります。このため、remote_addrもアクセスごとに切り替わるんですね。
すると、CGI::Sessionのオブジェクトにアクセスした際にremote_addrが違うからって、セッションファイルを削除しちゃう。それを気づかずに、$session->param('hogehoge')なんざしてしまうと、bad file descriptorが出る訳なんですよ。

なので、$CGI::Session::IP_MATCHは0にしておきましょう。

と思ったら、use CGI::Session;で、-ip_matchも付いていない。
なぜだー??

色々モジュール内を検索してみました。
すると、とあるモジュールで一カ所、

use CGI::Session qw( -ip_match );

嵌ったorz
これが原因だ。
ごらんのように $CGI::Session::IP_MATCH はグローバルですので、どこかに一カ所あるだけで、影響を受けます。


でもしかし、モジュールのオプションって結構こういう構造してますので、嵌りやすいんじゃないかと。
そういう時は、localを使ってブロック内だけオプションを有効にしましょうね。


今日は、こんなところで。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 3

なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)

この記事へのコメント

この記事へのトラックバック