session_set_save_handler

(PHP 4, PHP 5)

session_set_save_handler --  ユーザ定義のセッション保存関数を設定する

説明

bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )

session_set_save_handler() は、セッションに 関連するデータを保存および取得するために使用されるユーザ定義の セッション保存関数を設定します。この関数は、セッションデータを ローカルデータベースに保存する場合のように PHP セッションにより 提供されるもの以外の保存方法を使用したい場合に有用です。 成功した場合に TRUE を、失敗した場合に FALSE を返します。

注意: セッションが何も情報を含んでいない場合には write ハンドラは実行されません。 空のセッション変数が登録されている場合でも同様です。 この動作はデフォルトのファイルベースセッションハンドラとは異なるものです。 デフォルトのファイルベースセッションハンドラは空のセッションファイルを 生成します。

以下の例では、デフォルトの保存 files に似た ファイルベースのセッション保存を行います。この例は、PHP がサポート する任意のデータベースエンジンを用いてデータベースへの保存を行う ように容易に拡張可能です。

save ハンドラが期待通りに動作するように read 関数は常に文字列を返す 必要があります。データがない場合には、空の文字列を返してください。 他のハンドラからの返り値は、論理式、すなわち成功した場合に TRUE、 失敗した場合に FALSE を返します。

警告

PHP 5.0.5 以降、Write ハンドラおよび Close ハンドラはオブジェクトが 破棄されたあとにコールされます。そのため、セッション内でデストラクタを 使用可能ですが、ハンドラ内ではオブジェクトを使用できません。 以前のバージョンでは、これらのコールされる順序が逆でした。 この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close() を コールすることが可能です。

例 1. session_set_save_handler() の例

<?php
function open($save_path, $session_name)
{
  global
$sess_save_path, $sess_session_name;

  
$sess_save_path = $save_path;
  
$sess_session_name = $session_name;
  return(
true);
}

function
close()
{
  return(
true);
}

function
read($id)
{
  global
$sess_save_path, $sess_session_name;

  
$sess_file = "$sess_save_path/sess_$id";
  if (
$fp = @fopen($sess_file, "r")) {
    
$sess_data = fread($fp, filesize($sess_file));
    return(
$sess_data);
  } else {
    return(
""); // ここで "" を返す必要があります。
  
}

}

function
write($id, $sess_data)
{
  global
$sess_save_path, $sess_session_name;

  
$sess_file = "$sess_save_path/sess_$id";
  if (
$fp = @fopen($sess_file, "w")) {
    return(
fwrite($fp, $sess_data));
  } else {
    return(
false);
  }

}

function
destroy($id)
{
  global
$sess_save_path, $sess_session_name;

  
$sess_file = "$sess_save_path/sess_$id";
  return(@
unlink($sess_file));
}

/*********************************************
* 警告 - ここで何らかのガベージコレクション *
* ルーチンを実装する必要があるでしょう。    *
*********************************************/
function gc($maxlifetime)
{
  return
true;
}

session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

session_start();

// セッションを通常通り使用します。

?>

session.save_handler 設定ディレクティブも参照してください。