phpでのsessionについて

PHP

今回はphpでsessionに関する内容を紹介します。

sessionについて

session開始

session_start();

session値設定

$_SESSION[‘name’]=’test’;
$_SESSION[‘age’]=20;

sessionのID取得

session_id();

php.iniにsessionに関する設定

;session情報の保存方法(デフォルトはファイルに保存する)
session.save_handler = files

;ファイルの保存パス
session.save_path = /tmp

;デフォルトはsession無効
session.auto_start = 0

;sessionの有効期限:1440秒
session.gc_maxlifetime = 1440

session.name = PHPSESSID
;cookie有効期限(0の場合、ブラウザを閉じらない、ずっと有効)
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =

セッションク破棄

セッションに登録されたデータを全て破棄する

session_destroy();

セッションデータの GC

PHPは、デフォルトで確率ベースのセッション GC を行います。

php.iniに以下の設定値により、1000回のアクセスの中に1回のGCを実施します。
GC対象は「session.gc_maxlifetime = 1440」を超えった対象となります。
session.gc_probability = 1
session.gc_divisor = 1000
 
session.gc_probability を 0 に設定して、 確率ベースのGCを無効にする。cronで定期的に GC を実行することをお勧めします。

ブラウザcookie無効設定の対応

sessionはデフォルトでcookieを利用していますが、ブラウザではcookie無効を設定すると、利用できない。
以下の設定により、get,postにsessionidを自動に設定する。
session.use_only_cookies = 0  ; sessionはcookie以外で利用できる(デフォルト:1)
session.use_trans_sid = 1       :session_idはcookie以外の方法で(デフォルト:0)

session情報をテーブルに保存

session情報はデフォルトでファイルに保存しますが、ファイルをアクセスするとき、時間がかかります。
session情報をDBに保存する変更を紹介します。

sessionテーブル作成

create table session (
    session_id varchar(50) primary key,
    session_value text
    session_time int unsigned not null
)engine=innodb charset=utf8;
create table session (
    session_id varchar(50) primary key,
    session_value varchar(500),
    session_time int unsigned not null
)engine=memory charset=utf8;
–memoryの場合、textを利用できない。

session情報をテーブルに登録

function open() {
    global $link;
    $link = mysqli_connect(‘host’,’username’,’password’,’dbname’,’port’);
    mysqli_set_charset($link,’utf8′);
    return true;
}
function close(){
    return true;
}
function read(string $sessionId){
    global $link;
    $sql=”select session_value from session where session_id='”.$sessionId.”‘”;
    $rs=mysqli_query($link,$sql);
    $rows=mysqli_fetch_row($rs);
    return (string)$rows[0];
}
function write(string $sessionId, string $data){
    global $link;
    $sql=”insert into session values(‘{$sessionId}’,'{$data}’,unix_timestamp())”;
    return mysqli_query($link,$sql);
}
function destroy(string $sessionId){
    global $link;
    echo “destroy”;
    return true;
}
function gc(int $lifetime){
    global $link;
    echo “gc”;
    return true;
}
function create_sid() {
    echo “create_sid”;
    return uniqid(”, true);
}
function validate_sid(string $key){
    echo “validate_sid”;
    return true;
}
function update_timestamp(string $key, string $val){
    global $link;
    echo “update_timestamp”;
    return true;
}

session_set_save_handler(‘open’, ‘close’,’read’, ‘write’, ‘destroy’, ‘gc’, ‘create_sid’, ‘validate_sid’, ‘update_timestamp’);
session_start();
$_SESSION[‘name’]=’ggosss’;
echo $_SESSION[‘name’];
タイトルとURLをコピーしました