セッションの実装を記述して、ストリッピング前にデッドセッションを処理します。

私の最初のhabratopik、私は最後ではないことを願っています。



状況を想像してください。サイトに買い物かごがあり、買い物かごに追加されると、いわゆる製品を置きます。 購入可能な商品のリストから除外します。 顧客が商品をバスケットから取り出すと、ロックが解除されます。 しかし、ユーザーがブラウザを閉じた場合はどうなりますか? この場合、セッションはガベージコレクターによって削除され、ロックは保持されます。



そのような状況に出くわしたとき、私に最初に生じたのは、ロックとデータベースへのアクセス日を保存し、定期的に冠を引くことでした。 しかし、この決定の松葉杖は明らかです。 そして、主題について決定するときに私が出会った別のナンセンスがあります:セッションのシリアル化と非シリアル化には、シリアル化関数と非シリアル化関数以外の関数と形式が使用されます。 シリアル化セッションのために自転車を作成する必要があります。



身近に:問題の解決方法...

ここでは、そのような解決策のアイデアが厳格な habrauserによって提示され、カンファレンスphp@conference.jabber.ruのセイバーに近い問題の解決に役立ったということを述べる必要があります。



PHPでは、セッションを処理するための関数を定義できます。 session_set_save_handler関数がこれを担当します。 パラメータとして、セッションを操作するために呼び出される関数のリストを受け入れます。 マニュアルには、セッションを操作するための標準メカニズムを実装する例さえあります。 ガベージコレクションに関与するgc関数のみを変更します。 デッドセッションファイルの削除。



gc関数の例:



/* */

function gc($maxlifetime)

{

global $sess_save_path; /* , */

foreach (glob( "$sess_save_path/sess_*" ) as $filename)

{

/* */

if (filemtime($filename) + $maxlifetime < time())

{

$tmp_sess=unserializesession(file_get_contents($filename)); /* $tmp_sess $_SESSION */

/* , */

@unlink($filename); /* */

}

}

return true ;

}




* This source code was highlighted with Source Code Highlighter .








インターネット上のどこかから取られたunserializesession関数のコード(おそらくPHPマニュアルの関数に関するコメントから):



function unserializesession($data) {

$vars=preg_split( '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|/' ,

$data,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

for ($i=0; $vars[$i]; $i++) $result[$vars[$i++]]=unserialize($vars[$i]);

return $result;

}




* This source code was highlighted with Source Code Highlighter .








これをプロジェクトに接続します。



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

/* session_start() 30%, - session_start() */

ini_set( "session.gc_probability" , 30); /* 100%, */

ini_set( "session.gc_divisor" , 100);

ini_set( "session.gc_maxlifetime" , 1800); /* ( , gc) */

session_start();




* This source code was highlighted with Source Code Highlighter .








ただし、1つだけあります。Debian/ Ubuntuには、クラウンによって実行される独自のセッションクリーニングメカニズムがありますが、PHPにはセッションファイルを削除する機能がありません。 好きじゃなかった PHPの機能を破壊し、セッションのガベージコレクターに置き換えます。 セッションファイル用に独自のディレクトリを指定し、.htaccessで閉じることで問題を解決できます(document_rootにある場合)。



PS正直なところ、PHPブログに直接投稿できるかどうかはわかりません。 私はHabrのアクティブユーザーではなく、現地の注文を知りません。 誓わないでください。



All Articles