LoginSignup
27
15

More than 5 years have passed since last update.

PHP セッションのシリアライズ方式と他言語からの読み取り

Posted at

1. PHP セッションのシリアライズ形式

PHP セッションのシリアライズ形式には、以下のようなものがあり、ini_set() で指定できます。

  • php(デフォルト)
  • php_serialize
  • wddx

1-1. php と php_serialize

phpphp_serialize が紛らわしいのですが、これらは別ものです。

下記のようなコードで、セッションを保存するとその違いが分かります。

<?php
ini_set('session.serialize_handler', 'php');
//ini_set('session.serialize_handler', 'php_serialize');

class Foo
{
  private $name = 'Mike';
}

session_start();

$_SESSION = [
  'int' => 1,
  'float' => 1.23,
  'bool' => true,
  'string' => 'hoge',
  'array' => [1, 2, 3],
  'object' => new Foo(),
];

var_dump($_SESSION);
  • php
int|i:1;float|d:1.23;bool|b:1;string|s:4:"hoge";array|a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}object|O:3:"Foo":1:{s:9:"Fooname";s:4:"Mike";}
  • php_serialize
a:6:{s:3:"int";i:1;s:5:"float";d:1.23;s:4:"bool";b:1;s:6:"string";s:4:"hoge";s:5:"array";a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}s:6:"object";O:3:"Foo":1:{s:9:"Fooname";s:4:"Mike";}}

php_serialize は、serialize 関数の出力と同じになります。
http://php.net/serialize

2. 他言語からの読み取り

PHP 以外の言語から、PHP セッションを読むには、大きく分けて 3 つの方法が考えられます。

2-1. PHP セッションを直接読む

いくつかの言語で、PHP セッションデータを読み書きするライブラリが公開されているので、これらを利用します。ライブラリによって、対応しているシリアライズ形式が異なるので注意する必要があります。

例えば、 golang で、PHP セッションを読み書きする php_session_decoder は、php を前提としています。
https://github.com/yvasiyarov/php_session_decoder
(なお、このリポジトリには serialize 関数形式が読めるコードも含まれています)

一方、node.js で、PHP の serialize 関数形式のデータを読み書きする PHP-Serialize を利用してセッションデータを読むなら、php_serialize を指定する必要があります。
https://github.com/steelbrain/php-serialize

連携する際は、利用するライブラリに応じて、PHP セッションのシリアライズハンドラを変えるか、指定されたシリアライズ形式に対応したライブラリを選択することになります。

2-2. 汎用シリアライズ形式を利用する

汎用のシリアライズ形式であれば、各言語で実装があるので、PHP でもこれを利用する方法です。

PHP で、冒頭に上げた形式以外を利用するには、独自のセッションハンドラを利用するか、専用の PHP 拡張をインストールすることになります。前者は、実装のやり方次第でどうにでもできるので、ここでは、後者について示します。

汎用のシリアライズ形式といえば、JSON が思い浮かびますが、PHP にはセッションシリアライズについては対応する拡張がありません。1

そこで考えられるのは、 MessagePack です。MessagePack であれば、各言語の実装がありますし、圧縮率や処理効率も期待できます。

MessagePack 拡張
https://github.com/msgpack/msgpack-php

2-3. PHP でセッションデータを出力する API を実装

別の方法としては、PHP 側でセッションデータを、例えば JSON に変換して出力する API を実装し、これを別システムから読むという方法もあります。

例えば、セッション ID をパラメータとして受け取り、セッションデータを JSON で出力するイメージですね。

$ curl -X POST -F "session_id=hoge"  http://example.com/api/session2json.php


"json"

直接セッションストレージにアクセスするより、オーバーヘッドはありますが、別システム側からは、単に HTTP で JSON を取得するだけなので、実装も簡単です。

もちろん、この API は外部に公開するものではない(してはいけない)ので、内部だけで利用するように注意しましょう。


  1. 以前あったような気がしますけど、見つけられませんでした... 

27
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
15