首頁 php教程 php手册 定制php4的session功能

定制php4的session功能

Jun 21, 2016 am 09:02 AM
gt mysql nbsp session

 

这篇文章描述了怎样定制php4session处理。我们提供一个怎样写一个全功能的基于mysql数据库或dbm文件的session处理程序例子。
  
  
一、序言
  
  
新的php4有一套自己的session处理函数。缺省情况下,每个session存贮在系统临时目录的一个个独立文件中(例如在unix系统中为/tmp)
  
这适合或不适合,依你的需求而言。例如:如果你的支持phpweb服务器分布在不同的机器上,你不能很容易地共享它们之间的session(当然,你也可以将sessions保存在NFS共享中)。另一个潜在的问题是你机器上的数千或数百万个session文件使你的文件系统变得散乱
  
对我们来说幸运的是,php4的开发者非常有远见(感谢他们),他们为你我这样的用户提供了扩展session处理的接口。
  
  
这个文档解释一点session的处理并且提供两个能够工作的怎样扩展session处理的例子。我们的第一个例子将使session处理程序保存 session数据到DBM文件中。我们的第二个例子将保存session数据到MYSQL数据库中。
  
在你开始之前,请下载ying20000602.zip 并且将它解开放到web文档目录中。(我已经将它带在本文的结尾处了)
  
任何一个我们写的session处理程序会提供6个基本的函数,它们将被php4session处理程序调用,所以你不用担心怎样调用它们。
  
好在这些定制处理session的函数对你来说是完全透明的。所以你可以改动它们而不会影响你自己的PHP脚本。
  
  
这几个函数是:
  sess_open($sess_path, $session_name);
  
  
这个函数被session处理程序调用来作初始化工作。需要传给它的两个参数是$sess_path,它对应你的php.ini文件中的session.save_path选项;$session_name,它对应php.ini中的session.name选项。它们具体怎样工作,请看下面的例子。
  
  sess_close();
  
  
这个函数在页面结束执行并且session处理程序需要关闭时被调用。(注意,不要和sess_destory混淆了,它是用来结束session)
  
  sess_read($key);
  
  
这个函数在session处理程序读取指定session键值($key)时。
  
这个函数检索并返回标识为$keysession数据.(注意:你不用担心怎样序列化和反序列化数据,如果你不知道这是什么意思,不要担心它)
  
  
译者注:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。
  
  sess_write($key, $val);
  
  
这个函数据在session处理程序需要将数据保存时调用,这种情况经常在你的程序结束时发生。
  
它负责将数据保存在下次能用sess_read($key)函数检索的地方。
  
  sess_destroy($key);
  
  
这个函数在需要消毁session时。它负责删除session并且清除环境。
  
  sess_gc($maxlifetime);
  
这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。
  
  
现在我们已经清楚了我们提供的函数。它们不是非要这样命名,但必须接受这些参数。(不管你需不需要它们)
  
  DBM session
处理程序
  
  
我们的第一个范例是写一个保存session数据到DBM文件中的定制session处理程序。(这是ying20000602.zip中的session_dbm.php文件)
  
  
有很多充足的理由让你要这样做,例如,如果你在isp那儿有一台共享的服务器(译注:相当于我们说的虚拟主机吧)并且你不想让你的session数据
  
  
和别人的混在一起。
  
  
重要注释:
  
在你试验这些程序时你的php4必须有DBM支持。如果不是这样的(译注:如果没有DBM支持)会很难看,真的很难看!
  
我们要做的这些工作将会得到一个所有session数据的DBM文件。(万一你不知道,DBM文件象一个仅保存"/"对的非常简单的数据库.
  
由下面的6个函数据实现:
  
  
  sess_open($sess_path, $session_name);
  
我们将调用dbmopen()打开一个处于读写模式的DBM文件。我们的DBM文件将被命名为/tmp/PHPSESSID,除非你修改了php.ini中的session
  
径和名字设置。
  
  
  sess_close();
  
在这个函数中,我们将简单地调用dbmclose()函数关闭DBM文件。
  
  
  sess_read($key);
  
这儿我们仅仅调用dbmfetch()载入和参数$key相关连的session数据。
  
在载入一个session时,我们需要保证读入的不是一个过期数据,所以我们必须给session配上一个时间标记。
  
  
为什么?因为在它们失效,不管什么原因而没有被删掉时,我们不会意外地读入过期数据。这会是一个很大的禁忌。
  
  
  
我们知道DBM文件只保存 / 对,因此不得不在写session数据时将时间标记同" "一起写入,在读session数据时去掉。
  
  
任何已经过期的session将被忽略。看看这个源程序,它会让你更清楚。
  
  
  
  sess_write($key, $val);
  
写入一个session,我们会使用dbmreplace()函数。注意,从上所述我们要保存过期时间标记在session中,所以我们要将时间标记绑到值上。
  
  sess_destroy($key);
  
消毁一个session很容易,我们只需要调用dbmdelete()函数将它从session文件中删除。
  
  sess_gc($maxlifetime);
  
过期数据收集在这儿有点令人讨厌但却是必需的,为了达到目的我们在循环扫描所有保存在DBM文件中的session并且删掉过期的。这会很慢因
  
为我们循环通过所有保存在这个文件中的所有session数据。
  
  
现在我们已经有了一个DBM session处理程序,太酷了!
  
  
现在,我们让这些session保存到mysql数据库中。
  
  Mysql session
处理程序
  (This
  
我们的下一个范例是写一个将session数据存到mysql数据库的定制session处理程序。(这个在session_mysql.php文件中,见文章尾部)
  
在你有许多支持PHP的服务器并且你需要共享它们之间的session时你会想将session保存在数据库中的。(比如你服务于很多用户并且需要
  
负载平衡时)
  You have a bunch of machines doing web/PHP stuff, a machine serving
  
你有一批机器作支持php的服务器,需要一台机器作你的普通数据库服务器,另外一台运行mysql数据库处理session。仅这样对大多数人来
  
说就具有很大的杀伤力的。:)(译注:可能意思是太酷了吧)
  
  
重要提示:
  
在你试验之前你的php必须支持mysql(译注:这好象已经不成问题了,php现在已经内建mysql支持了)如果不是这样的话,事情会很难看,真的
  
很难看。
  
首先我们在mysql中创建一个session数据库,并且创建一个session表。先运行你的mysql客户端并且运行下面的命令:
  mysql> CREATE DATABASE sessions;
  
  mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
  -> IDENTIFIED BY 'phpsession';
  
  mysql> CREATE TABLE sessions (
  -> sesskey char(32) not null,
  -> expiry int(11) unsigned not null,
  -> value text not null,
  -> PRIMARY KEY (sesskey)
  -> );
  
  
下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置。在你继续之前确信一切看起来良好。
  
  
我们的6个函数会依靠mysql数据库工作:
  
  
  sess_open($sess_path, $session_name);
  
我们需要调用mysql_Pconnect(),然后用mysql_selsect_db()选择session数据库 $sess_path $session_name 参数
  
是无关的但我们不得不保留它们。(译注:原文如此,可能是为了兼容吧)
  
  sess_close();
  
我们要打开一个mysql永久连接因此我们在这个函数中不做任何事。(一个空函数)
  
  
  sess_read($key);
  
这个窍门就是一个简单的select语句,我们想要读取所给的$keysession数据,需要指定过期时间信息。
  
  sess_write($key, $val);
  
session数据用了一个小把戏。我们首先试图用insert语句保存session数据到数据库中。如果失败(主键约束)则意味着这个key已经写入,然后我们
  
不得不用一update语句代替。
  
  sess_destroy($key);
  
删除一个session很容易,我们只需要从数据库中删除这个键值。
  
  sess_gc($maxlifetime);
  
处理过期session也很容易,我们只需要从数据库中删除过期session().
  
  
作为结束这个小教程,希望你在扩展php4session处理时有个好感觉。
  
这个范例只是简单的示范了你怎样做才能扩展它们使其适应你的需要,如果你找到什么bug的话,请让我知道:)
  
  faq:
  
如果你担心session文件在/tmp目录中和别的虚拟机混淆,正好将它们存到别处。
  
这就是为什么有session.save_path选项的原因。
  
如果你担心性能的话你可以考虑将session存在共享内存中。你只需要在编译php时加上MM支持(--with-mm)并指定sessio.save_handler mm
  
.htaccess中,php.ini中或httpd.conf中。
  
  
我觉得只有多台机器要保存session时才会用到数据库。
  (
最后这句实在不好译,自已看吧)
  
  session_dbm.php
  =========================================================================
  
  /* ------------------------------------------------------------------------
  * session_dbm.php
  * ------------------------------------------------------------------------
  * PHP4 DBM Session Handler
  * Version 1.00
  * by Ying Zhang (ying@zippydesign.com)
  * Last Modified: May 21 2000
  *
  * ------------------------------------------------------------------------
  * TERMS OF USAGE:
  * ------------------------------------------------------------------------
  * You are free to use this library in any way you want, no warranties are
  * expressed or implied. This works for me, but I don't guarantee that it
  * works for you, USE AT YOUR OWN RISK.
  *
  * While not required to do so, I would appreciate it if you would retain
  * this header information. If you make any modifications or improvements,
  * please send them via email to Ying Zhang .
  *
  * ------------------------------------------------------------------------
  * DESCRIPTION:
  * ------------------------------------------------------------------------
  * This library tells the PHP4 session handler to write to a DBM file
  * instead of creating individual files for each session.
  *
  * ------------------------------------------------------------------------
  * INSTALLATION:
  * ------------------------------------------------------------------------
  * Make sure you have DBM support compiled into PHP4. Then copy this
  * script to a directory that is accessible by the rest of your PHP
  * scripts.
  *
  * ------------------------------------------------------------------------
  * USAGE:
  * ------------------------------------------------------------------------
  * Include this file in your scripts before you call session_start(), you
  * don't have to do anything special after that.
  */
  
  $SESS_DBM = "";
  $SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
  
  function sess_open($save_path, $session_name) {
  global $SESS_DBM;
  
  $SESS_DBM = dbmopen("$save_path/$session_name", "c");
  return ($SESS_DBM);
  }
  
  function sess_close() {
  global $SESS_DBM;
  
  dbmclose($SESS_DBM);
  return true;
  }
  
  function sess_read($key) {
  global $SESS_DBM, $SESS_LIFE;
  
  $var = "";
  if ($tmp = dbmfetch($SESS_DBM, $key)) {
  $expires_at = substr($tmp, 0, strpos($tmp, "|"));
  
  if ($expires_at > time()) {
  $var = substr($tmp, strpos($tmp, "|") + 1);
  }
  }
  
  return $var;
  }
  
  function sess_write($key, $val) {
  global $SESS_DBM, $SESS_LIFE;
  
  dbmreplace($SESS_DBM, $key, time() + $SESS_LIFE . "|" . $val);
  return true;
  }
  
  function sess_destroy($key) {
  global $SESS_DBM;
  
  dbmdelete($SESS_DBM, $key);
  return true;
  }
  
  function sess_gc($maxlifetime) {
  global $SESS_DBM;
  
  $now = time();
  $key = dbmfirstkey($SESS_DBM);
  while ($key) {
  if ($tmp = dbmfetch($SESS_DBM, $key)) {
  $expires_at = substr($tmp, 0, strpos($tmp, "|"));
  if ($now > $expires_at) {
  sess_destroy($key);
  }
  }
  
  $key = dbmnextkey($SESS_DBM, $key);
  }
  }
  
  session_set_save_handler(
  "sess_open",
  "sess_close",
  "sess_read",
  "sess_write",
  "sess_destroy",
  "sess_gc");
  ?>
  =====================================================================================
  session_mysql.php
  =======================================================================================
  
  /* ------------------------------------------------------------------------
  * session_mysql.php
  * ------------------------------------------------------------------------
  * PHP4 MySQL Session Handler
  * Version 1.00
  * by Ying Zhang (ying@zippydesign.com)
  * Last Modified: May 21 2000
  *
  * ------------------------------------------------------------------------
  * TERMS OF USAGE:
  * ------------------------------------------------------------------------
  * You are free to use this library in any way you want, no warranties are
  * expressed or implied. This works for me, but I don't guarantee that it
  * works for you, USE AT YOUR OWN RISK.
  *
  * While not required to do so, I would appreciate it if you would retain
  * this header information. If you make any modifications or improvements,
  * please send them via email to Ying Zhang .
  *
  * ------------------------------------------------------------------------
  * DESCRIPTION:
  * ------------------------------------------------------------------------
  * This library tells the PHP4 session handler to write to a MySQL database
  * instead of creating individual files for each session.
  *
  * Create a new database in MySQL called "sessions" like so:
  *
  * CREATE TABLE sessions (
  * sesskey char(32) not null,
  * expiry int(11) unsigned not null,
  * value text not null,
  * PRIMARY KEY (sesskey)
  * );
  *
  * ------------------------------------------------------------------------
  * INSTALLATION:
  * ------------------------------------------------------------------------
  * Make sure you have MySQL support compiled into PHP4. Then copy this
  * script to a directory that is accessible by the rest of your PHP
  * scripts.
  *
  * ------------------------------------------------------------------------
  * USAGE:
  * ------------------------------------------------------------------------
  * Include this file in your scripts before you call session_start(), you
  * don't have to do anything special after that.
  */
  
  $SESS_DBHOST = "localhost"; /* database server hostname */
  $SESS_DBNAME = "sessions"; /* database name */
  $SESS_DBUSER = "phpsession"; /* database user */
  $SESS_DBPASS = "phpsession"; /* database password */
  
  $SESS_DBH = "";
  $SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
  
  function sess_open($save_path, $session_name) {
  global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
  
  if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
  echo "

  • Can't connect to $SESS_DBHOST as $SESS_DBUSER";
      echo "
  • MySQL Error: ", mysql_error();
      die;
      }
      
      if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
      echo "
  • Unable to select database $SESS_DBNAME";
      die;
      }
      
      return true;
      }
      
      function sess_close() {
      return true;
      }
      
      function sess_read($key) {
      global $SESS_DBH, $SESS_LIFE;
      
      $qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time();
      $qid = mysql_query($qry, $SESS_DBH);
      
      if (list($value) = mysql_fetch_row($qid)) {
      return $value;
      }
      
      return false;
      }
      
      function sess_write($key, $val) {
      global $SESS_DBH, $SESS_LIFE;
      
      $expiry = time() + $SESS_LIFE;
      $value = addslashes($val);
      
      $qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";
      $qid = mysql_query($qry, $SESS_DBH);
      
      if (! $qid) {
      $qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();
      $qid = mysql_query($qry, $SESS_DBH);
      }
      
      return $qid;
      }
      
      function sess_destroy($key) {
      global $SESS_DBH;
      
      $qry = "DELETE FROM sessions WHERE sesskey = '$key'";
      $qid = mysql_query($qry, $SESS_DBH);
      
      return $qid;
      }
      
      function sess_gc($maxlifetime) {
      global $SESS_DBH;
      
      $qry = "DELETE FROM sessions WHERE expiry   $qid = mysql_query($qry, $SESS_DBH);
      
      return mysql_affected_rows($SESS_DBH);
      }
      
      session_set_save_handler(
      "sess_open",
      "sess_close",
      "sess_read",
      "sess_write",
      "sess_destroy",
      "sess_gc");
      ?>
      =========================================================================
      test.php
      ==========================================================================
      
      /* ------------------------------------------------------------------------
      * test.php
      * ------------------------------------------------------------------------
      * PHP4 Customer Session Handler Test Script
      * Version 1.00
      * by Ying Zhang (ying@zippydesign.com)
      * Last Modified: May 21 2000
      */
      
      /* default to DBM handler */
      if (! isset($handler)) {
      $handler = "dbm";
      }
      
      /* default action is increment */
      if (! isset($action)) {
      $action = "increment";
      }
      
      /* load up the appropriate session handling script, depending on the handler */
      if ($handler == "dbm") {
      include("session_dbm.php");
      
      } elseif ($handler == "mysql") {
      include("session_mysql.php");
      
      } else {
      echo "
  • Unrecognized handler ($handler)";
      die;
      }
      
      /* start the session and register a simple counter */
      session_start();
      session_register("count");
      
      /* figure out what we should do, depending on the action */
      switch ($action) {
      case "increment" :
      $count = isset($count) ? $count + 1 : 0;
      break;
      
      case "destroy" :
      session_destroy();
      break;
      
      case "gc" :
      $maxlife = get_cfg_var("session.gc_maxlifetime");
      sess_gc($maxlife);
      break;
      
      default:
      echo "
  • Unknown action ($action)";
      break;
  • 本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱門文章

    <🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系統,解釋
    4 週前 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Java教學
    1669
    14
    CakePHP 教程
    1428
    52
    Laravel 教程
    1329
    25
    PHP教程
    1273
    29
    C# 教程
    1256
    24
    laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

    Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

    MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

    MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

    MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

    MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

    laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

    文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

    在MySQL中解釋外鍵的目的。 在MySQL中解釋外鍵的目的。 Apr 25, 2025 am 12:17 AM

    在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

    比較和對比Mysql和Mariadb。 比較和對比Mysql和Mariadb。 Apr 26, 2025 am 12:08 AM

    MySQL和MariaDB的主要區別在於性能、功能和許可證:1.MySQL由Oracle開發,MariaDB是其分支。 2.MariaDB在高負載環境中性能可能更好。 3.MariaDB提供了更多的存儲引擎和功能。 4.MySQL採用雙重許可證,MariaDB完全開源。選擇時應考慮現有基礎設施、性能需求、功能需求和許可證成本。

    yi框架用什麼軟件比較好 yi框架使用軟件推薦 yi框架用什麼軟件比較好 yi框架使用軟件推薦 Apr 18, 2025 pm 11:03 PM

    文章首段摘要:在選擇開發 Yi 框架應用程序的軟件時,需要考慮多個因素。雖然原生移動應用程序開發工具(如 XCode 和 Android Studio)可以提供強大的控制和靈活性,但跨平台框架(如 React Native 和 Flutter)憑藉其編寫一次,即可部署到多個平台的優點而越來越受歡迎。對於剛接觸移動開發的開發者,低代碼或無代碼平台(如 AppSheet 和 Glide)可以快速輕鬆地構建應用程序。另外,雲服務提供商(如 AWS Amplify 和 Firebase)提供了全面的工具

    SQL與MySQL:澄清兩者之間的關係 SQL與MySQL:澄清兩者之間的關係 Apr 24, 2025 am 12:02 AM

    SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。

    See all articles