2016-11-08

phpのセッション管理あれこれ

PHPのセッションの管理方法に関する備忘録。

ブラウザのCookie内のセッションID(デフォルトはPHPSESSID)はサーバーサイドでもそのまま利用され、ハッシュ化等の加工はされません。

また、session.save_handlerが"files"の場合は、session.save_path以下にファイルが保存されます。セッションファイルからデコードする場合は以下のコードを実行すればOKです。

<?php

$file = '/var/lib/php/session/sess_{SESSION_ID}';
$contents = file_get_contents($file);
session_start();
session_decode($contents);
echo json_encode($_SESSION);

以下のコードでセッションデータを格納してセッションファイルの形式を見てみます。

<?php

session_start();
$_SESSION["hoge"] = "123";
$_SESSION["fuga"] = 5678;
$_SESSION["foo"] = true;
$_SESSION["bar"] = 123.456;
$_SESSION["null"] = NULL;
$ less /var/lib/php/session/sess_{SESSION_ID}
hoge|s:3:"123";fuga|i:5678;foo|b:1;bar|d:123.456;null|N;

文字列はs、数値はi、浮動小数点数はd、論理値はb、NULLはNとなっておりセミコロン区切りで定義されているのがわかります。デフォルトだとこの形式で処理されます。

$ od -Ax -tx1z /var/lib/php5/sess_dg5e11g694m2qk73ilti5jokf1
000000 04 68 6f 67 65 73 3a 33 3a 22 31 32 33 22 3b 04  >.hoges:3:"123";.<
000010 66 75 67 61 69 3a 35 36 37 38 3b 03 66 6f 6f 62  >fugai:5678;.foob<
000020 3a 31 3b 03 62 61 72 64 3a 31 32 33 2e 34 35 36  >:1;.bard:123.456<
000030 3b 04 6e 75 6c 6c 4e 3b                          >;.nullN;<

0x04 (EOT)や0x03 (ETX)がキーバリュー間に挟み込まれています。それ以外は"php"とほぼ同じ。

$ less /var/lib/php/session/sess_{SESSION_ID}
a:5:{s:4:"hoge";s:3:"123";s:4:"fuga";i:5678;s:3:"foo";b:1;
s:3:"bar";d:123.456;s:4:"null";N;}

"php"と似ていますが、キーに関しても属性値(データ型、バイト数)を記載しているのが特徴です。

$ cat /var/lib/php5/sess_{SESSION_ID} | xmllint --format --encode utf-8 -
<?xml version="1.0" encoding="utf-8"?>
<wddxPacket version="1.0">
  <header/>
  <data>
    <struct>
      <var name="hoge">
        <string>123</string>
      </var>
      <var name="fuga">
        <number>5678</number>
      </var>
      <var name="foo">
        <boolean value="true"/>
      </var>
      <var name="bar">
        <number>123.456</number>
      </var>
      <var name="null">
        <null/>
      </var>
    </struct>
  </data>
</wddxPacket>

XML形式でのシリアライズになります。

参考URL

このエントリーをはてなブックマークに追加