Hello,初涉web,问题请教。环境Linpus/Apache/PHP/Mysql,session存储在mysql中.我的理解是:用户每次点击页面后,都要删除过期的session,同时更新该用户对应session的过期时间和value。不知道是这样吗?问题1:用session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc')设置session处理函数后,用户点击页面时,php会自动调用_sess_write更新过期时间和value吗?问题2:如果不会自动更新,我手动更新session过期时间和value时,value是怎么计算出来的?有标准方法吧。value的值(每次更新都不一样,下面这是一个value,因为论坛限制,中间加了好多空格)形如:c2VjdXJpdHlUb2tlbnxzOjMyOiIxODE3ODkwZjdlOTRjYTd lYzRmYTM0NjYxZWQ4YmE5NSI7Y3VzdG9tZXJzX2hvc3RfYWRkcmVzc3xzOjI1O iJPRkZJQ0VfSVBfVE9fSE9TVF9BRERSRVNTIjtjYXJ0SUR 8czowOiIiO2NhcnR8TzoxMjoic2hvcHBpbmdDYXJ0Ijo3OntzOjg6ImNvbnRl bnRzIjthOjA6e31zOjU6InRvdGFsIjtpOjA7czo2OiJ3ZWl naHQiO2k6MDtzOjEyOiJjb250ZW50X3R5cGUiO2I6MDtzOjE4OiJmcmVlX3Noa XBwaW5nX2l0ZW0iO2k6MDtzOjIwOiJmcmVlX3NoaXBwaW5n X3dlaWdodCI7aTowO3M6MTk6ImZyZWVfc2hpcHBpbmdfcHJpY2UiO2k6MDt9bm F2aWdhdGlvbnxPOjE3OiJuYXZpZ2F0aW9uSGlzdG9yeSI6 Mjp7czo0OiJwYXRoIjthOjE6e2k6MDthOjQ6e3M6NDoicGFnZSI7czo1OiJpbmRl eCI7czo0OiJtb2RlIjtzOjY6Ik5PTlNTTCI7czozOiJnZ XQiO3M6MDoiIjtzOjQ6InBvc3QiO2E6MDp7fX19czo4OiJzbmFwc2hvdCI7YTow Ont9fWNoZWNrX3ZhbGlkfHM6NDoidHJ1ZSI7bGFuZ3V hZ2V8czo4OiJzY2hpbmVzZSI7bGFuZ3VhZ2VzX2lkfHM6MToiMiI7bGFuZ3VhZ2VzX 2NvZGV8czoyOiJnYiI7Y3VycmVuY3l8czozOiJDTlki O3RvZGF5X2lzfHM6MTA6IjIwMTAtMTEtMTgiO3VwZGF0ZUV4cGlyYXRpb25zfGI6M TtzZXNzaW9uX2NvdW50ZXJ8YjoxO2N1c3RvbWVyc19 pcF9hZGRyZXNzfHM6OToiMTI3LjAuMC4xIjs=谢谢。

解决方案 »

  1.   

    session过期时间一旦你设定好之后 不需要你处理,时间到了会自动过期!
      

  2.   

    session_set_cookie_params
    你看看手册吧··
      

  3.   

    问题1:用session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc')设置session处理函数后,用户点击页面时,php会自动调用_sess_write更新过期时间和value吗?不会,要理解session机制和一些程序中的session是不一样的。可以这样理解,自定义只是解决存储session的问题,其他机制照旧。当然是自动更新。遇到session_start 就是读session。遇到附值,就会写session. 相同的sesssion,就会更新。过期的,根据概率收集垃圾。找个例子看看人家怎么写的就好理解了。
    问题2:如果不会自动更新,我手动更新session过期时间和value时,value是怎么计算出来的?有标准方法吧。value的值(每次更新都不一样,下面这是一个value,因为论坛限制,中间加了好多空格)形如:
      

  4.   

    也就是说,我给session中某个变量赋值,如 $_SESSION['customer_id']="xx";session的过期时间和value就会更新?
      

  5.   

    我试了一下,$_SESSION['customer_id']="xx"这样是不会更新session的过期时间的。我找了一些例子,都说设置session_set_save_handler后,就可以// proceed to use sessions normally 
    // 现在你就可以象往常一样地使用session了。
    但我设置完了,session没动静阿。
      

  6.   


    session里应该不存时间.所以,也无更新一说.
      

  7.   

    session表里有三项:
    mysql> describe sessions;
    +---------+------------------+------+-----+---------+-------+
    | Field   | Type             | Null | Key | Default | Extra |
    +---------+------------------+------+-----+---------+-------+
    | sesskey | varchar(32)      | NO   | PRI |         |       |
    | expiry  | int(11) unsigned | NO   |     | 0       |       |
    | value   | mediumblob       | NO   |     | NULL    |       |
    +---------+------------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)sesskey,vq4a06hnt6qhnin1pv7j1tkp66
    expiry是时间,类似1289455150;
    value就是最开始我说的那个长串,我发现value是个base64编码过的字串,解码后发现是:
    securityToken|s:32:"49fca76679b8a2fa939e4f904be113ff";customers_host_address|s:6:"bourne";cartID|s:0:"";cart|O:12:"shoppingCart":7:{s:8:"contents";a:0:{}s:5:"total";i:0;s:6:"weight";i:0;s:12:"content_type";b:0;s:18:"free_shipping_item";i:0;s:20:"free_shipping_weight";i:0;s:19:"free_shipping_price";i:0;}navigation|O:17:"navigationHistory":2:{s:4:"path";a:1:{i:0;a:4:{s:4:"page";s:12:"product_info";s:4:"mode";s:6:"NONSSL";s:3:"get";a:3:{s:5:"cPath";s:1:"1";s:11:"products_id";s:3:"751";s:5:"zenid";s:26:"rrafbleb11diqck5g61qk7s1j2";}s:4:"post";a:0:{}}}s:8:"snapshot";a:4:{s:4:"page";s:12:"product_info";s:4:"mode";s:6:"NONSSL";s:3:"get";a:3:{s:5:"cPath";s:1:"1";s:11:"products_id";s:3:"751";s:5:"zenid";s:26:"rrafbleb11diqck5g61qk7s1j2";}s:4:"post";a:0:{}}}check_valid|s:4:"true";language|s:7:"english";languages_id|s:1:"1";languages_code|s:2:"en";currency|s:3:"USD";today_is|s:10:"2010-11-23";updateExpirations|b:1;session_counter|b:1;customers_ip_address|s:13:"192.168.1.185";全是_SESSION[]里面的东西,
      

  8.   

    好了,已搞定。设置session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc')后,
    会将$_SESSION[]数组转为字串形式,经base64加密,作为session的value使用_sess_write写入DB。以后想要每次操作都更新value,就要给$_SESSION[]设置一个每次都不同的成员,如date/randd等。php会自动更新DB中的value和expiry。