[Perl] CGI::Session で bad file descriptor が出た
こんばんは。
今日も定時のおじいさんです。定時ということで、なかなか時間配分が大変です。疲れます。
それはともかく、ちょっと見つけた「こりゃわからんだろ」という話。
適当に携帯用Webページを作っていたわけですが、その際にCGI::Sessionを使っていたわけですよ。
で、なぜか実機からアクセスすると、
が出て、セッションが切れてしまう。
なんでじゃろなあ?と思っているとデスね、原因は$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も付いていない。
なぜだー??
色々モジュール内を検索してみました。
すると、とあるモジュールで一カ所、
嵌ったorz
これが原因だ。
ごらんのように $CGI::Session::IP_MATCH はグローバルですので、どこかに一カ所あるだけで、影響を受けます。
でもしかし、モジュールのオプションって結構こういう構造してますので、嵌りやすいんじゃないかと。
そういう時は、localを使ってブロック内だけオプションを有効にしましょうね。
今日は、こんなところで。
今日も定時のおじいさんです。定時ということで、なかなか時間配分が大変です。疲れます。
それはともかく、ちょっと見つけた「こりゃわからんだろ」という話。
適当に携帯用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を使ってブロック内だけオプションを有効にしましょうね。
今日は、こんなところで。
この記事へのコメント