Myページ
ホーム
コミュニティの人々
ソフトウェア
技術紹介
適用分野
Tyzohとは
ご意見お問い合わせ

ワタナベのブログ

PHPのセッションでハマリ

ここで出てきた PHPフレームワークのEthnaで作成したアプリなんですが、一部の携帯で動かないということが発覚。 というよりは私が持っている携帯では動いたのですが、他の人にはダメだったようです。

原因はセッションか維持されていなかったことです。PHPは言語自体がセッション機能を持っているので、session_start() を呼べば特に自分で苦労しなくてもセッション管理ができますが、今回のハマリは、「特に自分で苦労しなくても」に頼りすぎたのが原因でした。

Webアプリにおける一般的なセッション管理は、

  • クライアントからの一連のリクエストに対してユニークなセッションIDを割り当て、それをCookieやURLパラメータなどに埋め込んで持ちまわる
  • クライアントからのリクエストにセッションIDが見つかれば、セッションが開始されているということなので、セッションIDに関連付けられたデータを取り出してトランザクションを再開する

という仕組みになっています。

つまり、今回のようにセッションが維持されていない原因として、セッションIDがうまく持ち回れていないこと考えられます。PHPはセッションIDを持ちまわる方法として

  1. Cookieに入れてクライアントに持たせる
  2. URLのクエリー文字列として付加する

が利用でき、状況に応じて自動的に選択されます。ただし、セキュリティの観点から、php.iniの指定でどちらかしか利用できないようにもできます。

で、ようやく本題なのですが、今回のアプリが載っているホスティングサービスのPHPが 2 の方法をサポートしていなかったのです。これに気づくのに相当な時間を要しました。( phpinfo() にてPHPのコンパイルオプションを確認し、--enable-trans-sid が指定されていなかった )

携帯電話ではCookie が使えないと思っていたので、手元のau端末で動いた時点でOKだと思ってしまいました。いつのころからか EZWebでは Cookieがサポートされていたらしいです。

結果、Vodafone, iモード機では Cookie が使えず、URLへの埋め込みも行われないということで、セッションが維持できないという問題になってしまいました。携帯用のページ内のフォームにセッションIDをhiddenで持たせることで対策としました。

Ethnaではページの作成をテンプレートエンジン Smarty で行っているのでコードとしては, View クラスでセッションIDの名前と値をフォームに登録する

$this->af->setApp('session_name', session_name());
$this->af->setApp('session_id', strip_tag(session_id()));
テンプレート側でフォームから値を取り出す
...

というのを埋め込んでいます。

カテゴリ:プログラミング

ワタナベ (2006-02-17 11:34) | コメント(0)| トラックバック(0)

トラックバック(0)

トラックバックURL:

コメント

コメントを投稿

名前

電子メール

URL

ログイン情報を記憶

コメント (スタイル用のHTMLタグを使うことができます)

プロフィール

ワタナベ

サーバ管理が趣味の渡邉充隆です。

仮想化やネットワーク構成に興味があります。
あとは、ウェブ系の技術(プログラミングからインフラまで)も好きで、特にデータの見せ方などを工夫することで情報の流通や再活用を促進する技術を研究しています。

dev.tyzoh.jp では ssdb の(コアではなく)周辺のコードをいじっています。

tumblr / del.icio.us

RSSフィード

コミュニティの人々 | ソフトウェア | 技術紹介 | 適用分野 | Tyzohとは | ご意見お問い合わせ

Copyright (C) 2004-2008 Nihon Unisys, Ltd. All Rights Reserved.
Powered by Movable Type Open Source