php.ini の設定

  • セッション(sesssion)に関係するphp.iniファイルの設定
  • PHPおぼえがき PHP.INI の設定 セッション編

    名前デフォルト値説明
    session.auto_start0(無効)リクエスト開始時に セッションモジュールがセッションを自動的に開始するかどうかを指定。これを1にして有効にすると、セッション使用時に「session_start()」関数を宣言しなくても使用できるようになる。
    session.cache_limiternocacheセッションページにおけるキャッシュ制御の方法の指定 (none/nocache/private/private_no_expire/public)
    session.cache_expire180キャッシュされたセッションページの有効期間を分単位で指定
    session.cookie_lifetime0(ブラウザを閉じるまで)ブラウザに送信するクッキーの有効期間を秒単位で指定
    session.cookie_path/session_cokkieで設定するパスを指定
    session.cookie_domain空文字クッキーを有効にするドメイン。デフォルトはセットされていないため、同じサーバに対してしかクッキーを送ってきません。もし、abc.com と指定すると、www.abc.com, private.abc.com などにクッキーを送るようになる(session.cookie_path で指定したパスにも一致すれば)。
    session.cookie_secureoffセキュアな接続を通じてのみCookieを送信できるかどうかを指定
    session.entropy_file空文字セッションIDを作成する際の別のエントロピソースとして使用する外部リソースへのパスを指定。例としては、多くのUNIXで利用可能な/dev/randomまたは/dev/urandomがあげられます。
    session.entropy_length0session.entropy_fileのファイルから 読みこむバイト数を指定
    session.gc_probability1ガーベジコレクションの見込み値の設定です。リクエスト毎あるいは、毎回のセッション初期化時に gc (ガーベジコレクション)関数を開始します。ガーベジコレクションの見込み値をパーセントで指定します。
    session.gc_divisor100session.gc_divisorと session.gc_probabilityの組み合わせですべてのセッションの初期化過程でgc(ガーベッジコネクション)プロセスも始動する確率を制御します。確率はgc_probability/gc_divisorで計算されます。例えば、1/100は各リクエスト毎に1%の確率でGCプロセスが 始動します。
    session.gc_maxlifetime1440データが「ごみ」とみなされ、消去されるまでの秒数を指定します。
    session.hash_function0ハッシュ生成関数の指定(0:MD5/1:SHA)
    session.hash_bits_per_character41文字毎のハッシュビット数 (4/5/6)
    session.namePHPSESSIDセッション名を指定し、クッキー名として使用されます。アルファベット文字のみで指定する必要があります。
    session.referer_check空文字HTTP Referer において確認を行う文字列を指定します。Refererがクライアントにより送信されており、かつ、指定した文字列が見付からない場合、埋め込まれたセッションIDは無効となります。
    session.save_handlerfilesセッションに関連するデータの保存および取得に使用されるハンドル名の定義
    session.save_path/tmpセッションに格納した情報を保存するファイルが作成される場所のパス。1ドメインで複数のWebサーバで運用する際に、共通にアクセスできるフォルダを指定すると、それだけでセッションの共有ができる。
    session.serialize_handlerphpシリアル化またはシリアル化データを復元するために使用されるハンドラの名前を定義
    session.use_cookies1(有効)クライアント側にセッ ションIDを保存する際にクッキーを使用するかどうかを指定
    session.use_only_cookies0(無効)このモジュールがクライアント側へのセッションIDの保存にCookieのみを使用することを指定
    session.use_trans_sid0(無効)セッションの一時的なセッションID(SID)をしようするかどうかを指定
    session.bug_compat
    session.bug_compat_42

セッションIDの受け渡し

  • Cookie使用(標準)
  • URLのパラメタとしてGETメソッドでセッションIDを受け渡し
  • URLの一部にセッションIDを埋め込む
    • mod_rewriteのようなURL書き換えの仕組みが必要

セッション管理

独自セッション管理の注意点

DB, memcached 等を使ってセッション管理を行う場合は、以下の点に注意する。

  • php.ini の session.auto_start の値が 0 になっていないと正常に機能しない。
  • session.save_hander の値を user にする必要がある。php.ini で設定したくない場合は ini_set() で設定する。
  • PHP5.0.5以降の場合は session_start() を呼ぶ前に下記を実行する。
    register_shutdown_function('session_write_close'); 

共有フォルダを使ったセッション管理

  • 複数のフォルダからアクセスできる共有フォルダがあるのであれば、これが一番楽
  • php.ini 内の session.save_path を共有フォルダにする、これだけ

MySQLを使ったセッション管理

セッション管理用のテーブルを作成し、独自セッションハンドラを定義する。

■ テーブル sessions

CREATE TABLE `sessions` (
  `id` varchar(32) NOT NULL default '',
  `access` int(10) unsigned default NULL,
  `data` text,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

■ session_mysql.ini

<?php

define("SESSION_DB_HOST", "localhost");
define("SESSION_DB_USER", "test");
define("SESSION_DB_PASS", "test");
define("SESSION_DB_DB", "test");

?>

■ session_mysql.php

<?php

require_once("session_mysql.ini");

// ユーザ定義のセッションハンドラを使用
ini_set("session.save_handler", "user") or die("ini_set(session.save_handler) failed.");
// セッションハンドラ関数を設定
session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean');
// PHP5.0.5 以降は session_start() を呼ぶ前に必ずこれを実行
register_shutdown_function('session_write_close'); 
 
function _open()
{
    global $_sess_db;
 
    $db_host = SESSION_DB_HOST;
    $db_user = SESSION_DB_USER;
    $db_pass = SESSION_DB_PASS;
    $db_db = SESSION_DB_DB;
    
    if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass))
    {
        return mysql_select_db($db_db, $_sess_db);
    }
    
    return FALSE;
}

function _close()
{
    global $_sess_db;
    
    return mysql_close($_sess_db);
}

function _read($id)
{
    global $_sess_db;

    $id = mysql_real_escape_string($id);

    $sql = "SELECT data FROM sessions WHERE id = '$id'";

    if ($result = mysql_query($sql, $_sess_db))
    {
        if (mysql_num_rows($result))
        {
            $record = mysql_fetch_assoc($result);

            return $record['data'];
        }
    }

    return '';
}

function _write($id, $data)
{   
    global $_sess_db;

    $access = time();

    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);

    $sql = "REPLACE INTO sessions VALUES ('$id', '$access', '$data')";

    return mysql_query($sql, $_sess_db);
}

function _destroy($id)
{
    global $_sess_db;
    
    $id = mysql_real_escape_string($id);

    $sql = "DELETE FROM sessions WHERE id = '$id'";

    return mysql_query($sql, $_sess_db);
}

function _clean($max)
{
    global $_sess_db;
    
    $old = time() - $max;
    $old = mysql_real_escape_string($old);

    $sql = "DELETE FROM sessions WHERE access < '$old'";

    return mysql_query($sql, $_sess_db);
}

?>

■ test.php

<?php

require_once("session_mysql.php");

  // Initialize a session. This call either creates 
  // a new session or re-establishes an existing one.
  session_start();
 
  // If this is a new session, then the variable
  // $count will not be registered
  if (!session_is_registered("count")) 
  {
    session_register("count");
    session_register("start");
 
    $count = 0;
    $start = time();
  } 
  else 
  {
    $count = $_SESSION['count'];
    $start = $_SESSION['start'];

    $count++;
  }
 
  $sessionId = session_id();
 
  $_SESSION['count'] = $count;
  $_SESSION['start'] = $start;
?>

<!DOCTYPE HTML PUBLIC 
   "-//W3C//DTD HTML 4.0 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd" >
<html>
  <head><title>Sessions</title></head>
  <body>
    <p>This page points at a session 
        (<%= $sessionId %>)
    <br>count = <%= $count %>.
    <br>start = <%= $start %>.
    <p>This session has lasted 
      <?php 
        $duration = time() - $start; 
        echo "$duration"; 
      ?> 
      seconds.

    <p><a href="destroy_session.php">destroy session</a>
  </body>
</html>

TokyoTyrant? によるセッション管理

Repcached によるセッション管理

  • RepcachedはKLab開発
  • 高速(memcachedと遜色ない)
  • レプリケーション可能(1台が落ちてもデータが失われない)
  • memcachedのクライアントが使える(設定を変更する必要がない)

memcached によるセッション管理

memcached はサーバのメモリ上にデータを格納しておく機構を提供するツール。リアルタイムなデータである必要がないデータとかを格納して、有効期限なんかを設定できるらしい。

Memcache関数, Memcacheクラスが使えるようにする

  • php.ini の extension_dir が存在するディレクトリを指定しているのを確認。"./" はダメ。
    extension_dir = "/usr/local/lib/php/extensions"
  • 以下を実行するとビルドされて、extension_dir に共有ライブラリがインストールされる
    $ pecl install memcache
  • php.ini に以下を追加
    extension=no-debug-non-zts-20060613/memcache.so
  • Apache を再起動

sharedance によるセッション管理

Mac OS X 上ではライブラリ等の関係でうまくビルドできなかったため未検証。あしからず。

「ページの有効期限切れ」問題

参考URL


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-04-09 (日) 21:28:04 (2571d)