Ketika mempertimbangkan masalah sesi, saya akhirnya menyerah pada sesi:
1. Sesi asli dikelola menggunakan file. Kualitas sistem file secara langsung mempengaruhi kinerja sesi, terutama ketika ada beberapa K orang yang online pada saat yang bersamaan. Ada dua solusi: database dan file (menggunakan jalur hash).
2. Sesi awal memiliki skalabilitas dan pengendalian yang buruk. Tidak kondusif untuk berintegrasi dengan sistem saya yang ada.
3. Saat memilih database, saya tidak memilih sqlite. Terakhir kali saya menguji efisiensi sqlite di win xp, ternyata tidak sebaik yang diharapkan.
Terakhir, saya memilih tabel heap myql untuk memproses sesi, dan menggabungkan pemrosesan sesi dengan statistik pengguna online.
Kode yang diberikan di bawah ini adalah contoh saya (tidak ada detail lain yang diberikan, penggunaan spesifik harus dimodifikasi)
<?
/**
* Tangani pengguna online dan simulasikan sesi
* BUAT TABEL `webqq_session` (
`sid` char( 32 ) BUKAN NULL ,
`uid` mediumint( 8 ) BUKAN NULL ,
karakter `nama pengguna`( 80 ) BUKAN NULL ,
`ismember` tinyint( 1 ) BUKAN NULL ,
`waktu masuk` int( 10 ) BUKAN NULL ,
`waktu aktif` int( 10 ) BUKAN NULL ,
KUNCI UTAMA (`sid`)
) MESIN = HEAP DEFAULT CHARSET = gb2312
* @penulis:feifengxlq< http://www.phpobject.net > feifengxlq#gmail.com
* @sejak:23-10-2006
* @hak cipta:http://www.phpobject.net
*Catatan: Penggunaan file ini harus digabungkan dengan file lain: seperti pemfilteran cookie, beberapa fungsi dasar, dan kelas operasi database
*/
sesi kelas
{
var $mysql;
var $cookie_id='webqq_sid';
var $sesi=array();
var $max_time=1200;//Waktu maksimum default adalah 20 menit
fungsi__konstruksi()
{
$this->mysql=modul baru(TB_PREX.'_session');//Membutuhkan dukungan eksternal
$ini->mulai();
}
fungsi mulai()
{
if(kosong($_COOKIE[$ini->cookie_id]))
{
//Inisialisasi sesi
$ini->buat();
}kalau tidak{
//Cookie sudah ada, periksa apakah sudah ada di database
$sid=$_COOKIE[$ini->cookie_id];
if($ini->mysql->detail('di mana sid=''.$sid.'''))
{
//Ada di database
$baris['waktu aktif']=waktu();
$ini->mysql->update($baris,'di mana sid=''.$sid.''');
$ini->sesi=$ini->mysql->detail('di mana sid=''.$sid.''');
}kalau tidak{
//Tidak ada di database
$ini->buat();
}
}
//Hapus pengguna yang tidak online di database
$ini->mysql->hapus('di mana waktu aktif+'.$ini->waktu_maks.'<'.waktu());
}
register fungsi($nama,$nilai,$update=false)
{
if(array_key_exists($nama,$ini->sesi)){
$ini->sesi[$nama]=$nilai;
}
if($update)$ini->update();
}
registri fungsi($nama='')
{
if(empty($name)) kembalikan $ini->sesi;
if(array_key_exists($nama,$ini->sesi)){
kembalikan $ini->sesi[$nama];
}
}
//Perbarui informasi sesi dalam database
pembaruan fungsi()
{
$baris['uid']=$ini->sesi['uid'];
$baris['nama pengguna']=$ini->sesi['nama pengguna'];
$baris['ismember']=$ini->sesi['ismember'];
$baris['waktu masuk']=$ini->sesi['waktu masuk'];
$baris['waktu aktif']=$ini->sesi['waktu aktif'];
$ini->mysql->update($baris,'di mana sid=''.$ini->sesi['sid'].''');
}
/*------------------Berikut ini adalah metode pribadi------------------------- --------------------------------**/
fungsi buat()
{
$sekarang=waktu();
$sid=md5('0'.$nowtime.getip());//Fungsi getip() harus ditentukan sebelumnya: dapatkan alamat IP pelanggan
setcookie($ini->cookie_id,$sid,$sekarang+3600*24);//default 24 jam
$baris['sid']=$sid;
$baris['uid']=0;
$baris['nama pengguna']='tamu';
$baris['anggota']=0;
$baris['waktu masuk']=$waktu sekarang;
$baris['waktu aktif']=$waktu sekarang;
$this->mysql->add($row);//Tulis ke database
$ini->sesi=$baris;
}
}
?>