php::session

25
PHP::Session Tatsuhiko Miyagawa <miyagwa @ bulknews .net > Livin’ On The EDGE, Co.,Ltd. 2003/01/31 Shibuya.pm Technical Talks

Upload: griffith-smith

Post on 03-Jan-2016

84 views

Category:

Documents


4 download

DESCRIPTION

PHP::Session. Tatsuhiko Miyagawa < [email protected] > Livin ’ On The EDGE, Co.,Ltd. 2003/01/31 Shibuya.pm Technical Talks. もくじ. PHP::Session とは なぜ必要なのか PHP のセッション管理 PHP::Session の実装 活用事例 今後の展開. PHP::Session とは. DESCRIPTION - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: PHP::Session

PHP::Session

Tatsuhiko Miyagawa<[email protected]>Livin’ On The EDGE, Co.,Ltd.

2003/01/31 Shibuya.pm Technical Talks

Page 2: PHP::Session

もくじ PHP::Session とは なぜ必要なのか PHP のセッション管理 PHP::Session の実装 活用事例 今後の展開

Page 3: PHP::Session

PHP::Session とは

DESCRIPTION

PHP::Session provides a way to read / write PHP4 session files, with which you can make your Perl Application session shared with PHP4.

PHP::Session は PHP4 のセッションファイルの読み書きができ、これを利用することで、 Perl アプリケーションのセッションを PHP4 と共有することができる。

Page 4: PHP::Session

なぜ必要なのか

基本的には必要ない(えー

Page 5: PHP::Session

必要になるケース 他社の製作した PHP コードに機能追加 PHP で書きたくない セッションの情報が必要

Perl から PHP セッションを操作 !

Page 6: PHP::Session

PHP のセッション管理 PHP3 では、 PHPLIB というライブラ

リを使用する PHP4 では、ファイルベースのセッショ

ン管理がデフォルト (PHPLIB も使用可能 )

現在では PHP4 が主流

Page 7: PHP::Session

PHP4 のセッション管理実装 /tmp/sess_${SESSION_ID} という

ファイルに書き出される ( セキュアなのか ?)

排他処理は flock を使用 謎のエンコードフォーマット

baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}}!foo|

Page 8: PHP::Session

エンコードフォーマット

baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}}!foo|

変数名 バイト数Object

クラス名

Page 9: PHP::Session

エンコードフォーマット (cont.)

baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}}!foo|

string 長さ 値 string 長さ 値key value

Page 10: PHP::Session

エンコードフォーマット (cont.)

baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}}!foo|

変数名 array int

添字

Page 11: PHP::Session

エンコードフォーマット (cont.)

baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}}!foo|

undef

Page 12: PHP::Session

注意すること PHP には配列とハッシュの区別がない

$a[1] = "foo";

$a[2] = new baz;

$a[3] = "bar";

$a[4] = -1.2;

$data['hi'] = 'foo';

$data['foo'] = "bar";

Page 13: PHP::Session

エンコードパーサの実装 基本はシンプル

正規表現でイケる!

my $var_re = '(\w+)\|';

my $str_re = 's:\d+:"(.*?)";';

my $int_re = 'i:(-?\d+);';

my $dbl_re = 'd:(-?\d+(?:\.\d+)?);';

my $arr_re = 'a:(\d+):';

my $obj_re = 'O:\d+:"(.*?)":\d+:';

my $nul_re = '(N);';

my $bool_re = 'b:([01]);';

Page 14: PHP::Session

エンコードパーサの実装(cont.) ハッシュの実装は再帰的

正規表現だけでは無理 (5.6 以上なら ?) PHP のソースは 1 文字ずつガリガリ

• Perl っぽくない Parse::RecDescent

• 重い (Parse::FastDescent?) • よくわからない

< 宣伝 > 「 Perl データマンジング」に詳しい </ 宣伝 >

Page 15: PHP::Session

エンコードパーサの実装 (cont.) Text::Balanced を採用

Damian Conway 作 Parse::RecDescent の軽量版 対応するカッコを見つけてくれる

• これを再帰的に実行すれば OK

my $bracket = extract_bracketed($data, '{}');

Page 16: PHP::Session

PHP::Session の実装 Serializer を Pluggable な実装にした

PHP では WDDX 方式もある (PHP::Session では未実装だが、 WDDX.pm を使用すれば容易 )

Strategy Pattern sess_* ファイルがない場合は error

create => 1 オプションで生成

Page 17: PHP::Session

APIuse PHP::Session;

my $session = PHP::Session->new($id);

# session id

my $id = $session->id;

# get/set session data

my $foo = $session->get('foo');

$session->set(bar => $bar);

# remove session data

$session->unregister('foo');

Page 18: PHP::Session

API (cont.)# remove all session data

$session->unset;

# check if data is registered

$session->is_registered('bar');

# save session data

$session->save;

# destroy session

$session->destroy;

Page 19: PHP::Session

PHP の実装 PHP の配列は Perl のハッシュ

Perl( 配列 ) > PHP ( 配列 ) > Perl( ハッシュ ) PHP のオブジェクトは

PHP::Session::Object クラスに bless _class キーに PHP 側のクラス名を保持

Page 20: PHP::Session

Apache::Session::PHP Apache::Session

セッション管理フレームワーク Store, Lock, Generate, Serialize

Serialize と Store だけつくればよい Serialize: PHP::Session のモノ Store: ファイル名規則を PHP とあわせる

(sess_${SESSION_ID})

tie %session, ‘Apache::Session::PHP’ …;

Page 21: PHP::Session

活用事例 使ってる人はいるのか?

Bug Report や Patch はいっぱいくる Y! inc で採用 (?)

PHP をテンプレートエンジンとして使う セッションで変数の受け渡しを行う

PHP の Web アプリケーションユニットテスト セッションをシミュレート

Page 22: PHP::Session

テンプレートエンジンuse Apache::Cookie;

use Apache::Request;

use Digest::MD5 qw(md5_hex);

use PHP::Session;

my $r = Apache::Request->new(Apache->request);

my $sid = get_sid() || gen_sid();

my $sess = PHP::Session->new($sid, { create => 1 });

$sess->set(name => 'miyagawa');

$sess->set(email => '[email protected]');

$sess->save();

Page 23: PHP::Session

テンプレートエンジン (cont.)my $cookie = Apache::Cookie->new($r,

-name => 'PHPSESSID',

-value => $sid, -path => '/',

);

$cookie->bake;

$r->internal_redirect("/php-session/index.php");

sub get_sid {

my %cookies = Apache::Cookie->fetch;

return ? $cookies{PHPSESSID} ?

$cookies{PHPSESSID}->value : undef;

}

Page 24: PHP::Session

テンプレートエンジン (cont.)<?php

session_start();

?>

Name: <?= $name ?><br>

Email: <?= $email ?><br>

SID: <?= $PHPSESSID ?>

Page 25: PHP::Session

今後の展開 PHP::Session::MySQL

ストレージを MySQL にしただけ

WDDX サポート Test::PHP Inline::PHP Tomcat::Session