国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

使用MySQL開始PHP會話

2024-07-24 12:57:09
字體:
來源:轉載
供稿:網友

  默認情況下,php會話(session)是通過文件來保存的。這樣做有以下幾個缺點:

  會話文件一般都很小,但文件數卻很多,在文件系統中保存許多這樣的小文件非常浪費空間,且效率不高。

  分布式的站點難以利用會話文件來共享會話。

  會話文件方式不利于統計在線用戶的會話信息。

  為解決以上問題,我們可以考慮用數據庫來保存會話信息。

  對于 php 開發來說,保存會話用 mysql 是一個非常不錯的選擇。mysql 提供一種建立在內存中的表類型 heap,如果每條會話數據量很小的話,可以考慮用這種類型的表來進一步優化性能。但是 heap 類型的表有許多限制,例如它不支持 text 類型的字段,因此如果在無法預測會話數據記錄長度的情況下,選擇 myisam 是比較合適的,這種類型的表沒有事物處理開銷,對于基于磁盤的表可以得到最優性能。

  下面是 sessions 表的結構:

drop table if exists `sessions`;
create table `sessions` (
 `session_id` varchar(32) not null default '',
 `user_id` int(10) unsigned not null default '0',
 `data_value` text not null,
 `last_visit` timestamp(14) not null,
 primary key (`session_id`),
 key `user_id` (`user_id`)
) type=myisam;

  php 支持用戶會話模塊,可以通過 session_set_save_handler 來設置自定義的會話處理函數。因為默認的處理模塊是 files,因此要在用 session_set_save_handler 設置會話處理函數之前,先用 session_module_name(’user’) 來告訴 php 使用用戶會話模塊, 而session_set_save_handler 必須要在 session_start 之前執行。

|||

  用戶會話數據在會話處理函數中都是序列化之后的,要取出其中的某個會話變量,可以對其進行反序列化,默認是 php 序列化方式,可以用 session::unserialize 函數來反序列化。

  下面的代碼定義了一個用 mysql 來處理 php 會話的類,其中所使用的 class_mysql.php 請參見 《超級簡單但超級實用的 php 的 mysql 類》 。

<?php
/**
* @author 馬秉堯
* @copyright (c) 2005 coolcode.cn
*/
require_once("class_mysql.php");
class session {
  var $db;
  function session(&$db) {
    $this->db = &$db;
    session_module_name('user');
    session_set_save_handler(
      array(&$this, 'open'),
      array(&$this, 'close'),
      array(&$this, 'read'),
      array(&$this, 'write'),
      array(&$this, 'destroy'),
      array(&$this, 'gc')
    );
    session_start();
  }
  function unserialize($data_value) {
    $vars = preg_split(
      '/([a-za-z_x7f-xff][a-za-z0-9_x7f-xff]*)|/',
      $data_value, -1, preg_split_no_empty |        
      preg_split_delim_capture
    );
    for ($i = 0; $vars[$i]; $i++) {
      $result[$vars[$i++]] = unserialize($vars[$i]);  
    }
    return $result;
  }
  function open($path, $name) {
    return true;
  }
  function close() {
    return true;
  }
  function read($session_id) {
    $session_id = $this->db->escape_string($session_id);
    if ($row = $this->db->query("select * from `sessions` where `session_id` = '$session_id' limit 1")) {
      return $row['data_value'];
    }
    else {
      $this->db->query("insert into `sessions` set `session_id` = '$session_id'");
      return "";
    }
  }
  function write($session_id, $data_value) {
    $data = $this->unserialize($data_value);
    $session_id = $this->db->escape_string($session_id);
    $data_value = $this->db->escape_string($data_value);
    $this->db->query("update `sessions` set " 
                . "`user_id` = '{$data['user_id']}', "
                . "`data_value` = '$data_value', "
                . "`last_visit` = null "
                . "where `session_id` = '$session_id'");
    return true;
  }
  function destroy($session_id) {
    $session_id = $this->db->escape_string($session_id);
    $this->db->query("delete from `sessions` where `session_id` = '$session_id'");
    return true;
  }
  function gc($lifetime) {
    $this->db->query("delete from `sessions` where unix_timestamp(now()) - unix_timestamp(`last_visit`) > $lifetime");
    return true;
  }
  // get sessions by user_id
  function get($user_id) {
    $user_id = $this->db->escape_string($user_id);
    return $this->db->query("select * from `sessions` where `user_id` = '$user_id'");
  }
  // get sessions list
  function lists($page, $rows) {
    if ($page == 0) {
      return $this->db->query("select * from `sessions` order by `user_id`");
    }
    else {
      $start = ($page - 1) * $rows;
      return $this->db->query("select * from `sessions` order by `user_id` limit $start, $rows");
    }
  }
}
?>

  這個類的使用很簡單,在原來使用 session_start 的地方,替換成 $session = new session($db) 就可以了。$db 表示 sessions 表所在的數據庫。

  另外可以用 get 方法來獲取某個用戶的所有會話信息,通過 lists 方法來得到所有用戶會話列表。這樣就可以方便的管理用戶會話了。

,歡迎訪問網頁設計愛好者web開發。
上一篇:使用 PHP + MySQL 處理負載過重的數據庫問題思考和總結

下一篇:UNIX設置MySql數據同步 實現復制功能

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片
猜你喜歡的新聞
猜你喜歡的關注

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 大竹县| 弥渡县| 万源市| 濮阳市| 盐边县| 留坝县| 宁明县| 武山县| 攀枝花市| 雷山县| 台南市| 永城市| 万州区| 吴川市| 蒙山县| 松阳县| 牡丹江市| 四会市| 房产| 石河子市| 贡山| 桓台县| 潞西市| 宝鸡市| 广灵县| 临澧县| 大荔县| 宝兴县| 霞浦县| 吉安县| 东阿县| 永新县| 岳普湖县| 濮阳县| 历史| 天台县| 安岳县| 阿拉善右旗| 江阴市| 宁都县| 云霄县|