首页 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

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热门文章

    <🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
    4 周前 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教程
    1676
    14
    CakePHP 教程
    1429
    52
    Laravel 教程
    1333
    25
    PHP教程
    1278
    29
    C# 教程
    1257
    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完全开源。选择时应考虑现有基础设施、性能需求、功能需求和许可证成本。

    SQL与MySQL:澄清两者之间的关系 SQL与MySQL:澄清两者之间的关系 Apr 24, 2025 am 12:02 AM

    SQL是一种用于管理关系数据库的标准语言,而MySQL是一个使用SQL的数据库管理系统。SQL定义了与数据库交互的方式,包括CRUD操作,而MySQL实现了SQL标准并提供了额外的功能,如存储过程和触发器。

    MySQL:数据库,PHPMYADMIN:管理接口 MySQL:数据库,PHPMYADMIN:管理接口 Apr 29, 2025 am 12:44 AM

    MySQL和phpMyAdmin可以通过以下步骤进行有效管理:1.创建和删除数据库:在phpMyAdmin中点击几下即可完成。2.管理表:可以创建表、修改结构、添加索引。3.数据操作:支持插入、更新、删除数据和执行SQL查询。4.导入导出数据:支持SQL、CSV、XML等格式。5.优化和监控:使用OPTIMIZETABLE命令优化表,并利用查询分析器和监控工具解决性能问题。

    See all articles