セッションの問題を検討したとき、私は最終的にセッションをあきらめました。
1. 元のセッションはファイルを使用して管理されます。ファイル システムの品質は、特に同時に数千人がオンラインになっている場合、セッションのパフォーマンスに直接影響します。データベースとファイル (ハッシュ パスを使用) の 2 つの解決策があります。
2. 元のセッションは拡張性と制御性が劣ります。既存のシステムとの統合には向きません。
3. データベースを選択するときに、sqlite を選択しませんでした。前回、Win XP で sqlite の効率をテストしたとき、期待したほど良くありませんでした。
最後に、セッションを処理するために myql のヒープ テーブルを選択し、セッション処理とオンライン ユーザー統計を組み合わせました。
以下に示すコードは私の例です (その他の詳細は提供されていません。特定の使用法はそれに応じて変更する必要があります)
<?
/**
* オンライン ユーザーを処理し、セッションをシミュレートします
* CREATE TABLE `webqq_session` (
`sid` char( 32 ) NOT NULL 、
`uid` mediaint( 8 ) NOT NULL 、
`ユーザー名` char( 80 ) NOT NULL 、
`ismember` tinyint( 1 ) NOT NULL 、
`logintime` int( 10 ) NOT NULL 、
`activetime` int( 10 ) NOT NULL 、
主キー (`sid`)
) エンジン = ヒープ デフォルトの文字セット = gb2312
* @author:feifengxlq< http://www.phpobject.net > feifengxlq#gmail.com
* @since:2006-10-23
* @copyright:http://www.phpobject.net
* 注: このファイルを使用するには、Cookie フィルタリング、いくつかの基本関数、データベース操作クラスなどの他のファイルと組み合わせる必要があります。
*/
クラスセッション
{
var $mysql;
var $cookie_id='webqq_sid';
var $session=array();
var $max_time=1200;//デフォルトの最大時間は 20 分です
function__construct()
{
$this->mysql=new module(TB_PREX.'_session');//外部サポートが必要です
$this->start();
}
関数 start()
{
if(空($_COOKIE[$this->cookie_id]))
{
//セッションを初期化する
$this->create();
}それ以外{
//Cookie はすでに存在します。データベースに存在するかどうかを確認してください
$sid=$_COOKIE[$this->cookie_id];
if($this->mysql->detail('where sid=''.$sid.'''))
{
//データベースに存在する
$row['activetime']=time();
$this->mysql->update($row,'where sid=''.$sid.''');
$this->session=$this->mysql->detail('where sid=''.$sid.''');
}それ以外{
//データベースに存在しません
$this->create();
}
}
//データベース内のオンラインでないユーザーを削除します
$this->mysql->delete('where activetime+'.$this->max_time.'<'.time());
}
関数 register($name,$value,$update=false)
{
if(array_key_exists($name,$this->session)){
$this->セッション[$name]=$value;
}
if($update)$this->update();
}
関数レジストリ($name='')
{
if(empty($name)) $this->session を返します。
if(array_key_exists($name,$this->session)){
$this->セッション[$name]を返します;
}
}
//データベース内のセッション情報を更新します
関数更新()
{
$row['uid']=$this->session['uid'];
$row['ユーザー名']=$this->セッション['ユーザー名'];
$row['ismember']=$this->session['ismember'];
$row['ログインタイム']=$this->セッション['ログインタイム'];
$row['activetime']=$this->session['activetime'];
$this->mysql->update($row,'where sid=''.$this->session['sid'].''');
}
/*------------------以下はプライベートメソッドです------------ --------------------------------**/
関数作成()
{
$nowtime=time();
$sid=md5('0'.$nowtime.getip());// getip() 関数は事前定義する必要があります: 顧客の IP アドレスを取得します
setcookie($this->cookie_id,$sid,$nowtime+3600*24);//デフォルトは 24 時間
$row['sid']=$sid;
$row['uid']=0;
$row['ユーザー名']='ゲスト';
$row['ismember']=0;
$row['logintime']=$nowtime;
$row['activetime']=$nowtime;
$this->mysql->add($row);//データベースに書き込みます
$this->session=$row;
}
}
?>