Saya telah menulis dua artikel sebelumnya, "Menyesuaikan SESSION (2) - Penghematan Database" dan "Mengapa Saya Tidak Menggunakan Sesi"
Namun belakangan diketahui ada masalah. Pemrosesan sebelumnya hampir tidak berguna dalam praktiknya, dan daur ulang sesi harus ditangani secara terpisah. Yang terakhir ini sering mengoperasikan database, menyebabkan masalah kinerja yang besar.
Setelah mempertimbangkan secara matang dalam dua hari terakhir, diberikan rencana kasar, namun belum ada pengujian yang spesifik dan detail.
1. Gabungkan pemrosesan sesi dan statistik. Pengunjung juga dicatat.
2. Gunakan database dan cookie sepenuhnya untuk mensimulasikan fungsi sesi.
3. Operasi pengguna pada sesi tersebut harus diselesaikan dalam satu pernyataan SQL sebanyak mungkin. Ketika sesi tidak diperlukan, sama sekali tidak ada lebih dari satu permintaan.
4. Demi efisiensi, daur ulang sesi tidak terintegrasi, namun antarmuka disediakan dan dapat dipanggil untuk mengimplementasikannya.
Kode tersebut diberikan sementara tanpa penjelasan detail.
sql
BUAT TABEL `*****_sesi` (
`sid` karakter(32) BUKAN BATAL,
`uid` int(10) BUKAN BATAL,
`nama pengguna` karakter(32) BUKAN NULL,
`tipe pengguna` tinyint(1) BUKAN NULL,
`waktu aktif` int(10) BUKAN NULL,
`kedaluwarsa` int(10) BUKAN NULL,
`ip` karakter(15) BUKAN BATAL,
`url` karakter(80) BUKAN BATAL,
`nilai` karakter(255) BUKAN NULL,
KUNCI UTAMA (`sid`)
) MESIN=CHARSET DEFAULT MEMORI=utf8;
kode php
<?
sesi kelas{
pribadi $_sessionPrex= '';//awalan sesi
pribadi $_time = '';//waktu saat ini
pribadi $_model = null; //Model operasi basis data
private $_expiry = 1200;//waktu validitas sesi
pribadi $_domain = '';//ruang lingkup sesi
protected $isNew = 0;//tentukan tindakan operasi 0 pembaruan 1 peningkatan
dilindungi $session = array();//catatan sesi yang sesuai
fungsi publik __konstruksi($opsi){
$ini->_setOptions($pilihan);
if(kosong($ini->_waktu))$ini->_waktu = waktu();
$ini->sesi['waktu aktif'] = $ini->_waktu;
}
fungsi publik mulai(){
$ini->_getSid();
}
kumpulan fungsi publik($kunci,$nilai){
if(in_array($key,array('uid','nama pengguna','tipe pengguna','url','kedaluwarsa'))){
if($kunci == 'kedaluwarsa'){
$ini->_setCookie($ini->_sessionPrex.'_sid',$ini->sesi['sid'],$nilai);
$ini->_setCookie($ini->_sessionPrex.'_uid',$ini->sesi['uid'],$nilai);
}
$ini->sesi[$kunci] = $nilai;
}kalau tidak{
$lainnya = $ini->sesi['nilai'];
$lainnya[$kunci] = $nilai;
$ini->sesi['nilai'] = $lainnya;
}
}
fungsi publik dapatkan($kunci){
if(in_array($key,array('uid','nama pengguna','tipe pengguna','url','kedaluwarsa'))){
kembalikan $ini->sesi[$kunci];
}kalau tidak{
if(isset($ini->sesi['nilai'][$kunci])){
kembalikan $ini->sesi['nilai'][$kunci];
}
kembalikan nol;
}
}
fungsi publik gc($file,$waktu = 1200){
$terakhir kali = file_get_contents($file);
if($waktu terakhir + $waktu<$ini->_waktu){
file_put_contents($file,$ini->_waktu);
return $this->_model->delete('waktu aktif+kedaluwarsa<'.$ini->_waktu);
}
}
fungsi publik menghancurkan(){
$ini->sesi['uid'] = 0;
$ini->sesi['nama pengguna'] = '';
$ini->sesi['tipe pengguna'] = -1;
$ini->sesi['kedaluwarsa'] = $ini->_kedaluwarsa;
$ini->sesi['nilai'] = array();
$ini->_setCookie($ini->_sessionPrex.'_sid',$ini->sesi['sid'],$ini->_kedaluwarsa);
$ini->_setCookie($ini->_sessionPrex.'_uid',$ini->sesi['uid'],$ini->_kedaluwarsa);
}
fungsi publik __destruct(){
$ini->_simpan();
}
fungsi pribadi _simpan(){
$dbSession = $ini->sesi;
$dbSession['value'] = serialisasi($dbSession['value']);
if(strlen($dbSession['value'])>255)$this->_error('session->value terlalu panjang!');
if($ini->isBaru == 1){
//Meningkatkan
$ini->_model->masukkan($dbSession);
}kalau tidak{
//memperbarui
$sid = $dbSesi['sid'];
$ini->_model->perbarui(array_slice($dbSession,1),'sid=''.$sid.''');
}
}
fungsi pribadi _getSession($sid){
$dbSession = $ini->_model->detail('sid = ''.$sid.''');
if(!$dbSession)mengembalikan salah;
$dbSession['value'] = unserialize($dbSession['value']);
$ini->sesi = array_merge($dbSession,$ini->sesi);
kembali benar;
}
fungsi pribadi _getSid(){
$sid = strip_tags($_COOKIE[$ini->_sessionPrex.'_sid']);
if(strlen($sid)==32){
if($ini->_getSession($sid)){
kembali benar;
}
}kalau tidak{
$sid = md5(waktu().mt_rand(1000,10000));
$ini->_setCookie($ini->_sessionPrex.'_sid',$sid);
}
$ini->_setCookie($ini->_sessionPrex.'_uid',0);
$ini->sesi = array(
'uid' => 0,
'nama pengguna' => '',
'tipe pengguna' => -1,
'waktu aktif' => $ini->_waktu,
'ip' => $ini->_getip(),
'url' => strip_tags($_SERVER['REQUEST_URI']),
'kedaluwarsa' =>$ini->_kedaluwarsa,
'nilai' => larik()
);
$ini->isBaru = 1;
$ini->sesi['sid'] = $sid;
}
fungsi pribadi _setCookie($nama,$nilai,$kedaluwarsa=0){
if(kosong($kedaluwarsa))$kedaluwarsa = $ini->_kedaluwarsa;
if(kosong($ini->_domain)){
setcookie($nama,$nilai,$ini->_waktu + $kedaluwarsa,'/');
}kalau tidak{
setcookie($nama,$nilai,$ini->_waktu + $kedaluwarsa,'/',$ini->_domain);
}
}
fungsi pribadi _getip(){
kembali getip();
}
fungsi pribadi _setOptions($options){
foreach ($pilihan sebagai $kunci=>$nilai){
if(in_array($key,array('sessionPrex','time','model','expiry','domain'))){
$kunci = '_'.$kunci;
$ini->$kunci = $nilai;
}
}
}
fungsi pribadi _error($msg){
melempar Phpbean_Exception($msg);
}
}
?>
(Perhatikan bahwa kode ini tidak dapat digunakan secara langsung, artikel ini terutama memberikan gambaran)