<?php
/**
* デフォルトのセッションハンドラ実装
*
* PHP version 5
*
* @package    components.db
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class DefaultSessionHandler implements ISessionHandler
{
	static $save_path;

	/*
	 *	コンストラクタ
	 */
	public function __construct()
	{
	}

	/**
	 * セッションハンドラ名
	 */
	public function getSessionHandlerName()
	{
		return "Default Session Handler";
	}

	/**
	 * セッションハンドラを初期化する
	 */
	public function init( Config $config )
	{
		$session_name  = $config->getString( 'session_name' );
		$save_path     = $config->getString( 'save_path' );
		$lifetime      = $config->getInteger( 'lifetime' );
		$valid_path    = $config->getString( 'valid_path' );
		$valid_domain  = $config->getString( 'valid_domain' );
		$ssl_only      = $config->getBoolean( 'ssl_only' );

		// デフォルトのセッション保存先
		if ( !$save_path || !is_file($save_path) ){
			$save_path = ResourceLocator::getWebAppPath( 'sessions' );
		}

		// セッション初期化処理
		session_set_cookie_params( $lifetime, "$valid_path", "$valid_domain", $ssl_only );
		session_save_path( $save_path );
		session_name( $session_name ? $session_name : APPLICATION );
		//session_regenerate_id( TRUE );

		// メンバーに保存
		self::$save_path = $save_path;
	}

	/**
	 * セッションファイルパスを取得
	 */
	public static function getSessionFile( $id )
	{
		return self::$save_path . "/sess_$id";
	}

	/**
	 * コールバック関数：オープン
	 */
	public static function open( $save_path, $session_name )
	{
		return true;
	}

	/**
	 * コールバック関数：クローズ
	 */
	public static function close()
	{
		return true;
	}

	/**
	 * コールバック関数：読み取り
	 */
	public static function read( $id )
	{
		$file = self::getSessionFile( $id );

		return (string) @file_get_contents( $file );
	}

	/**
	 * コールバック関数：書き込み
	 */
	public static function write( $id, $sess_data )
	{
		$file = self::getSessionFile( $id );

		$fp = @fopen($file,'w');
		if ( !$fp ){
			return false;
		}
		$write = fwrite($fp, $sess_data);
		fclose($fp);

		return $write;
	}

	/**
	 * コールバック関数：破棄
	 */
	public static function destroy( $id )
	{
		$file = self::getSessionFile( $id );

		return @unlink($file);
	}

	/**
	 * コールバック関数：ガベージコレクション
	 */
	public static function gc( $max_lifetime )
	{
		$find_path = self::getSessionFile( '*' );

		foreach( glob($find_path) as $file ){
			if ( filemtime($file) + $max_lifetime < time() ){
				@unlink( $file );
			}
		}
		return true;
	}

}
