|
定制php4的session功能(2) 有很多充足的理由让你要这样做,例如,如果你在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,
|