スレッド表示 | フラット表示〕 全トピック 923 件中 128 番目 次≫ ≪前

セッション クッキーの保存期間

created: 2007-01-21 00:50 | modified: 2007-04-04 01:37 | reply: 19

[3538] セッションの有効期間の制御

user: ゆうじ | created: 2007-01-23 00:00
こんばんわ。遅くなりました。

セッションの有効期限を制御するには、
session.cookie_lifetime の設定と合わせて
session.gc_maxlifetime も設定が必要です。

session.gc_maxlifetime は、
サーバに保存されているセッションのファイルを
破棄するまでの時間なんですが、
他のユーザと共用してるサーバでは、
全てユーザのセッションのファイルが
(デフォルトで)'/tmp' に保存しているため、
この値を設定するだけでは思うような制御ができません。


対応策としては、ポイントが2つあります。

(1)先ずセッションのファイルを保存するディレクトリを
自分だけが利用できるディレクトリに変更する。

session_save_path('/home/MyHomeDir/tmp');

この '/home/MyHomeDir/tmp' はあらかじめ
ドキュメントルート下ではない場所に任意のディレクトリをつくり、
ウェブサーバの権限で書き込める属性を設定しておきます。


(2)ディレクトリを変更すると
いらなくなったセッションファイルを自動的に破棄してくれなくなるので
これ様のセッションハンドラを書く。

セッションハンドラのコードについては
自分で使ってるコードを簡素化してみましたので使ってみてください。

実際使う際は、
セッションを使う全てのファイルが同じ設定である必要があるので
セッション関連はひとつのファイルにまとめて
使うスクリプトでinludeするのが良いと思います。


セッションハンドラ
file.sessionhandler.php
<?php
/*
* file session handler - for PHP4
*/
class file_sessionhandler
{
var $save_path = '';
var $name = '';
var $gc_maxlifetime = '';
var $gc_divisor = '';
var $gc_probability = '';

function open ( $save_path, $session_name )
{
if (!strlen($this->save_path)) {
$this->save_path = $save_path;
}
if (!strlen($this->name)) {
$this->name = $session_name;
}
$this->gc_execute();
return true;
}

function close ()
{
return true;
}

function read ( $id )
{
$filename = $this->save_path.
DIRECTORY_SEPARATOR. $this->name. '_'. $id;
return (string) @file_get_contents($filename);
}

function write ( $id, $data )
{
$filename = $this->save_path.
DIRECTORY_SEPARATOR. $this->name. '_'. $id;
if ($fp = @fopen($filename, 'w')) {
$return = fwrite($fp, $data);
fclose($fp);
return $return;
} else {
return false;
}
}

function destroy ( $id )
{
$filename = $this->save_path.
DIRECTORY_SEPARATOR. $this->name. '_'. $id;
return @unlink($filename);
}

function gc ( $maxlifetime )
{
if (is_integer($this->gc_maxlifetime)) {
$lifetime = $this->gc_maxlifetime;
} else {
$lifetime = $maxlifetime;
}

$search = $this->save_path.
DIRECTORY_SEPARATOR. $this->name. '_*';
foreach (glob($search) as $filename) {
if (filemtime($filename) + $lifetime < time()) {
@unlink($filename);
}
}
return true;
}

/*
* Protected:
*/
function gc_execute ()
{
$gc_tmp = 'gc.tmp';
$filename = $this->save_path.
DIRECTORY_SEPARATOR. $gc_tmp;
if (!is_readable($filename)) {
if ($fp = @fopen($filename, 'w')) {
fwrite($fp, '0');
fclose($fp);
return true;
} else {
return false;
}
}

$divisor =
(is_integer($this->gc_divisor) && $this->gc_divisor > 0) ?
$this->gc_divisor:
(integer)ini_get('session.gc_divisor');
$probability =
(is_integer($this->gc_probability) && $this->gc_probability > 0) ?
$this->gc_probability:
(integer)ini_get('session.gc_probability');
$count = (integer)trim(file_get_contents($filename));
$max_count = (integer)floor($divisor/$probability);
if ($fp = @fopen($filename, 'w')) {
if ($max_count <= $count) {
$this->gc(ini_get('session.gc_maxlifetime'));
fwrite($fp, '0');
} else {
fwrite($fp, $count+1);
}
fclose($fp);
return true;
} else {
return false;
}
}
}
?>

セッションの設定ファイル
session.conf.php
<?php
/*
* セッションハンドラ設定
*/
require_once 'file.sessionhandler.php';
$_shandler = new file_sessionhandler;
session_set_save_handler(
array(&$_shandler, 'open'),
array(&$_shandler, 'close'),
array(&$_shandler, 'read'),
array(&$_shandler, 'write'),
array(&$_shandler, 'destroy'),
array(&$_shandler, 'gc')
);

/*
* セッションパラメータ設定
*/
ini_set('session.cookie_lifetime', '604800');
ini_set('session.gc_maxlifetime', '604800');
session_save_path('/home/MyHomeDir/tmp');
?>


実行ファイル側
<?php
require_once 'session.conf.php';
session_start();

/*
* 以下は各処理
*/

?>
Parent: 3536  reply: 3539 3642 返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 923 件中 128 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑