php4的session功能 一、序言 新的php4有一套自己的session处理函数。缺省情况下,每个session存贮在系统临时目录的一个个独立文件中(例如在unix系统中为/tmp)。 这适合或不适合,依你的需求而言。例如:如果你的支持php的web服务器分布在不同的机器上,你不能很容易地共享它们之间的session(当然,你也可以将sessions保存在NFS共享中)。另一个潜在的问题是你机器上的数千或数百万个session文件使你的文件系统变得散乱 。 对我们来说幸运的是,php4的开发者非常有远见(感谢他们),他们为你我这样的用户提供了扩展session处理的接口。 这个文档解释一点session的处理并且提供两个能够工作的怎样扩展session处理的例子。我们的第一个例子将使session处理程序保存 session数据到DBM文件中。我们的第二个例子将保存session数据到MYSQL数据库中。 在你开始之前,请下载ying20000602.zip 并且将它解开放到web文档目录中。(我已经将它带在本文的结尾处了) 任何一个我们写的session处理程序会提供6个基本的函数,它们将被php4的session处理程序调用,所以你不用担心怎样调用它们。 好在这些定制处理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)时。 这个函数检索并返回标识为$key的session数据.(注意:你不用担心怎样序列化和反序列化数据,如果你不知道这是什么意思,不要担心它) 译者注:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。 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语句,我们想要读取所给的$key的session数据,需要指定过期时间信息。 sess_write($key, $val); 写session数据用了一个小把戏。我们首先试图用insert语句保存session数据到数据库中。如果失败(主键约束)则意味着这个key已经写入,然后我们 不得不用一update语句代替。 sess_destroy($key); 删除一个session很容易,我们只需要从数据库中删除这个键值。 sess_gc($maxlifetime); 处理过期session也很容易,我们只需要从数据库中删除过期session(). 作为结束这个小教程,希望你在扩展php4的session处理时有个好感觉。 这个范例只是简单的示范了你怎样做才能扩展它们使其适应你的需要,如果你找到什么bug的话,请让我知道:) faq: 如果你担心session文件在/tmp目录中和别的虚拟机混淆,正好将它们存到别处。 这就是为什么有session.save_path选项的原因。 如果你担心性能的话你可以考虑将session存在共享内存中。你只需要在编译php时加上MM支持(--with-mm)并指定sessio.save_handler 为 mm 在.htaccess中,php.ini中或httpd.conf中。 我觉得只有多台机器要保存session时才会用到数据库。 (最后这句实在不好译,自已看吧)  
 

解决方案 »

  1.   

    狮子兄弟啊,哈哈,你这个贴子,有灌水的嫌疑啊!
    这个贴子,我看过很多次了,
    在就是我觉得现在,好像没有什么好的php站点啊,大家有什么看法吗?
      

  2.   

    我只是应他的要求了.你看过不等于他看过了.他是想了解一下session我只有找一篇了.好的站点如果没有大家可以自己做吗?是不.
    ~!~!~!只作参考~!~!~!
      

  3.   

    其实想真正的了解session就是去自己做.在做的时候去看一些资料这是最好的.
      

  4.   

    可以去旅行的fastboard,网址:http://www.fastboard.org,里面的php讨论版人气很旺的。
      

  5.   

    使用无限生命期Session的方法   
      在PHP4.0中加入了对Session的支持,方便了我们很多程序,比如购物车等等! 
      在很多论坛中,Session也用于处理用户的登陆,记录下用户名和密码,使得用户不必每次都输入自己的用户名和密码!但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢? 
      大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……
      要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分): 
    1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递; 
    2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”; 
    3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用! 
    4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除! 
    还有很多的设置,不过和本文相关的就是这些了,下面开始讲使用永久Session的原理和步骤。 
      前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以…… 
    如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤: 
    1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改; 
    2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别); 
    3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间; 
    设置完毕后,打开编辑器,输入如下的代码: 
    ------------------------------------------------------------------------------------ 
    <? 
    session_start(); 
    session_register("count"); 
    $count++; 
    echo $count; 
    ?> 
    ------------------------------------------------------------------------------------ 
    然后保存为“session_check.php”,用浏览器打开“session_check.php”,看看显示的是不是“1”,再关闭浏览器,然后再打开浏览器访问“session_check.php”,如果显示“2”,那么恭喜了,你已经成功;如果失败的话,请检查你前面的设置。 但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的SessionID设置为给出的值…… 
    只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了! 
    但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息! 
    ------------------------------------------------------------------------------------ 
    <title>PHP相关信息显示</title> 
    <?phpinfo()?> 
    ------------------------------------------------------------------------------------ 
    打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息(如图1所示)。其中有一项“session.name”的参数(图中已经标出),这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。 
    记下了SessionID的名称后,我们就可以实现永久的Session数据储存了! 
    打开编辑器,输入下面的代码: 
    ------------------------------------------------------------------------------------ 
    <? 
    session_start(); // 启动Session 
    session_register("count"); // 注册Session变量Count 
    if(isset($PHPSESSID)) { 
    session_id($PHPSESSID); 
    } // 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID 
    $PHPSESSID = session_id(); // 取得当前的SessionID 
    $count++; // 变量count加1 
    setcookie("PHPSESSID", $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中 
    echo $count; // 显示Session变量count的值 
    ?> 
    ------------------------------------------------------------------------------------ 
    保存之后,利用和刚才拥有服务器权限时候的检测一样的方法,检测是否成功的保存了SessionID。 后记: 
    其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!关于Session的其他应用,可以参见zphp.com的文章。 
    最后,笔者的调试环境:Windows98DigExt(SE)+Apache+PHP 4.04。
     
     
      

  6.   

    不管怎样,大家进来顶一下,谢谢了
    ,我知道这些文章,在php中文用户,
    谢谢了,狮子兄弟,不要见怪,
    我也是smile_killer_sk,开个玩笑啊!
    谢谢大家!