WordPressにおけるPHPセッション管理

August 14, 2012 – 11:07 am

このブログのページング機能を実現するため、PHPの「セッション機能」を活用している。この「セッション機能」により、複数の異なるポスト間に変数値を保持・参照することができる。
この機能、ショッピング機能などを実現しようとする際に必須である。これをWordPressのPHPで使用するには、一定の配慮が必要になる。
関連情報をメモしておいた。

セッション機能で値を保持: セッションが有効になっていると、$_SESSIONなるスーパーグローバル変数に保持したい変数値を格納し、これをサーバー上のファイルに保管し、参照することができる。セッションの開始は、PHPのsession_start() 関数により行うことができる。

session_start() 関数について、PHPのマニュアルをみると、次の注意事項が示されている。

クッキーに基づくセッションを使用している場合、ブラウザに何か出力する前に session_start() をコールする必要があります。

この注意事項について考えてみるため、クッキーに基づくセッション確立の手続きについてみてみる(以下は、私の理解で正確さに欠けることがあるので注意が必要):

  1. ユーザー(クライアント)がWebブラウザを使ってWebサーバーにアクセスする。
  2. Webサーバーでは、セッション開始を受けて、セッションIDを発行し、そのIDをラベルしたファイルにユーザーのデータを格納する。
  3. Webサーバーは、セッションIDを記録したクッキーをブラウザ側に戻す。クッキーを戻すために、WebサーバーからWebブラウザへのHTTPヘッダーの一部にset_cookie ヘッダが付加される。Webブラウザは、セッション中、このクッキーを保持する。
  4. ユーザーが再び同じWebサーバーにアクセスするときには、(Webブラウザ上に保持している)クッキーをWebサーバー側に送信する。
  5. クッキーを受け取ったら、そこに記録されているセッションIDを調べ、2.でラベルした(関連づけた)ファイルに格納されているユーザー(クライアント)のデータを取り出す。

ここで、3.でHTTPヘッダーの一部にset_cookieヘッダーを付加するのであるが、これが有効になるためには、サーバー側からブラウザ側に送られるあらゆるデータに先立たなくてはならない。即ち、session_start()によりセッションが開始される以前にデータが出力されていると、この手続きが有効にならない。

WordPress内PHPでセッション機能を有効にする: WordPress内のPHP(ポスト等を出力するためのPHP文)内で、session_start() をコールしても、WordPressの標準的な手続きのもとで、すでにheader文が出力されているなどにより、セッションの手続きが有効にならない。したがって、データ保持のために用いられるスーパーグローバル変数 $_SESSION に対して値を保持することができない。

WordPress内のPHPでセッションを有効にするためには、「あらゆる出力に先立って、session_start() 関数をコール」すればよい。これを実現するために、いろいろな方法が提案されているが、そのうちのふたつは以下のものである。

方法1: wp-config.php に次のcode を加える:

/**
 * Enable sessions
 */
if (!session_id())
    session_start();

方法2: theme 内のfunctions.php に以下を付け加える:

/**
 * init_sessions()
 *
 * @uses session_id()
 * @uses session_start()
 */
function init_sessions() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'init_sessions');

おことわり: この機会に、PHPにおけるセッションの仕組みを理解しよう、と検討をしてみたが、私にとっては、結構、敷居がたかかった。上述したセッションの仕組みについての記述、寸足らずのもので、その正確性も若干疑問が残る。

間違い、関連情報があれば、ご指摘いただければ幸いだ。

参考:
http://www.frank-verhoeven.com/using-session-in-wordpress/


  1. 1 Trackback(s)

  2. Nov 24, 2012: あなたの予想に反して、このページが見えているでしょうか? » Blog Archive » PHPのsessionが引き継がれない

Post a Comment