addictionwhite’s diary

考え中のことを整理と忘備録のために綴ります。ここに書かれている考えは翌日には変わる可能性があります

セッションについての調査

ログイン処理ってフレームワークのものを使ったり、

既にもう誰かが実装してたりすることが多くて、じっくり考えること少なかったのだけど

考える機会きてしまったので、ちょっと調べる。


■ログイン画面(抜粋

session_set_cookie_params(10);//10秒

session_start();

// ログインボタンが押された場合

if (isset($_POST["login"])) {

// 認証成功

if ($_POST["userid"] == "testId" && $_POST["password"] == "testPass") {

// セッションIDを新規に発行する

session_regenerate_id(TRUE);

$_SESSION["USERID"] = $_POST["userid"];

header("Location: main.php");

exit;

}

else {

//ログイン失敗

}

}

■ログイン後画面(抜粋

session_set_cookie_params(10);

session_start();

// ログイン状態のチェック

if (!isset($_SESSION["USERID"])) {

header("Location: logout.php");

exit;

}


session_set_cookie_params(10)//セッションの時間はこれで指定(秒)

ログインパスワードが正しければ

$_SESSION["USERID"]に値突っ込んで、

こいつが存在すればログイン継続している感じ。

session_regenerate_id()はセッションID更新(乗っ取り防止)

//設定した時間過ぎたらセッション破棄(検証用なので10秒)

session_set_cookie_params(10)

ログイン画面の後に1秒ごとに更新し続けても10秒後ログアウトした

■ログイン後画面(抜粋 修正

session_set_cookie_params(10);

session_start();

session_regenerate_id(TRUE);//追加

これを入れると更新し続けた場合ログアウトしなくなった。

10秒放置して更新したらログアウトした。

同じセッションIDだと駄目ってことか。。。

引用


セッションにはもう1つ

設定した時間が過ぎたら、一定確率でサーバ側のセッション削除する設定がある

session.gc_maxlifetime

デフォルト値は1440秒(24分)。この値が過ぎるとサーバ側のセッションファイルが削除されるので実質セッションが切れる。


後者の削除時間設定はphp.iniの『session.gc_maxlifetime』で設定する。

一定確率、というのも、php.ini内の

『session.gc_probability』/『session.gc_divisor』ってなってる。

php.iniの設定がデフォルト

 session.gc_probability = 1

 session.gc_divisor = 100

 session.gc_maxlifetime = 1440


調べると

ini_set('session.gc_maxlifetime', 1000 );

ini_set('session.gc_divisor', 1);

ini_set('session.gc_probability ', 1);

あたりの設定でセッションの設定行ってるページが多い。

ちなみにこの設定はsession_start()すると確実にガーベジコレクションが機能してログアウトする。

引用


gc_probabilityとgc_divisorは、ガベージコレクションを行う割合です。この例では、session_start()が呼び出されるうちの1/1000の割合でガベージコレクションが行われます。これは、session_start()が呼び出される度にガベージコレクションをやっていると負荷がかかるので、それを軽減する目的があるものと思います。


ふーん。。。

引用


同じサーバーでsession.gc_maxlifetimeが短いサイトがあった場合、ドメインが違ったとしても、そのタイミングでセッションは削除されます。

他のサイトやページに影響を受けないようにするには、セッションファイルの保存先session.save_pathを変える必要があります。

セッションはドメインの区別をしていません。


なぜかログアウトしてしまう、って話たびたび聞くけど、関係あるかも知れないな。。

セッションまわり、まだまだわからないことあるけど、

今日はここまで。

//参考、引用サイト

http://se-suganuma.blogspot.jp/2009/05/php.html

http://pentan.info/php/session_gc.html

http://d.hatena.ne.jp/Leila/20080618/1213757481

http://web-tan.forum.impressrd.jp/e/2009/11/05/6810

http://d.hatena.ne.jp/katase_n/20060524

http://inoccu.net/blog/2012/11/21/223145.html