<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>一个程序猿 &#187; session</title>
	<atom:link href="http://www.sunboyu.cn/tag/session/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sunboyu.cn</link>
	<description>时光不会倒流,脚步总要前进</description>
	<pubDate>Tue, 31 Jan 2012 10:50:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用无模式数据库来改造dz的session</title>
		<link>http://www.sunboyu.cn/2009/12/29/%e4%bd%bf%e7%94%a8%e6%97%a0%e6%a8%a1%e5%bc%8f%e6%95%b0%e6%8d%ae%e5%ba%93%e6%9d%a5%e6%94%b9%e9%80%a0dz%e7%9a%84session.shtml</link>
		<comments>http://www.sunboyu.cn/2009/12/29/%e4%bd%bf%e7%94%a8%e6%97%a0%e6%a8%a1%e5%bc%8f%e6%95%b0%e6%8d%ae%e5%ba%93%e6%9d%a5%e6%94%b9%e9%80%a0dz%e7%9a%84session.shtml#comments</comments>
		<pubDate>Tue, 29 Dec 2009 01:26:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[原创技术]]></category>

		<category><![CDATA[discuz]]></category>

		<category><![CDATA[session]]></category>

		<category><![CDATA[性能]]></category>

		<category><![CDATA[无模式数据库]]></category>

		<category><![CDATA[瓶颈]]></category>

		<guid isPermaLink="false">http://www.sunboyu.cn/?p=1124</guid>
		<description><![CDATA[前两天还不知道啥是无模式数据库，不过最近迫切需要修改discuz bbs的session表，所以研究了一下相关的资料，发现了无模式这个名字。
具体无模式是啥，这里找了两篇文章：

关系数据库的末日是否已经来临
关系数据库的根本问题分析及数据库革命之走向

关于无模式的应用案例，很典型的一个，就是康盛uchome的feed表。
这里简单介绍几个无模式数据库，供大家参考：
mongodb : http://www.mongodb.org/display/DOCS/Home
mongodb的php扩展 http://www.mongodb.org/display/DOCS/Installing+the+PHP+Driver#InstallingthePHPDriver-PECL
这个数据库已经在淘宝上配合10gen做了云计算的session（名字很操蛋）,具体资料在这里 http://rdc.taobao.com/blog/dw/archives/410。具有了实际应用的东西应该很不错，不过我没尝试过。
Tokyo Tyrant：http://1978th.net/
tt的php扩展 http://www.php.net/manual/en/book.tokyo-tyrant.php
这个大家就比较熟悉了，SB日本鬼子写的东西，应用很广，sina，qq等公司里都在大量应用，sina的研发团队在此基础上还做了个分布式的东东，很是不错。据说这玩意还得到了很多公司的赞助，shit。
TCSQL：张宴基于tt开发的一套东西，内部做了很多算法优化，具体可参考此文章 http://blog.s135.com/tcsql/
总结：康盛使用mysql来存储session，不能说是一种错，但对于dz的负载绝对是第一个瓶颈。用这种方式，在线人数5w对数据库绝对是个坎。很多负载比较大的论坛，都做了此方面的优化，比如，给session表单独一个数据库，或者干脆阉割此功能。不错，独立的session表，或者分库，访问量大的时候，瓶颈依然在mysql上；阉割此功能，有些心疼，而且很多运营数据会丢失。所以，保持原功能而平滑提升性能，是一个不错的解决方向。
]]></description>
			<content:encoded><![CDATA[<p>前两天还不知道啥是无模式数据库，不过最近迫切需要修改discuz bbs的session表，所以研究了一下相关的资料，发现了无模式这个名字。</p>
<p>具体无模式是啥，这里找了两篇文章：</p>
<blockquote><p>
<a href="http://database.51cto.com/art/200903/116752.htm">关系数据库的末日是否已经来临</a><br />
<a href="http://database.51cto.com/art/200908/146424.htm">关系数据库的根本问题分析及数据库革命之走向</a>
</p></blockquote>
<p>关于无模式的应用案例，很典型的一个，就是康盛uchome的feed表。</p>
<p>这里简单介绍几个无模式数据库，供大家参考：</p>
<p>mongodb : http://www.mongodb.org/display/DOCS/Home</p>
<p>mongodb的php扩展 http://www.mongodb.org/display/DOCS/Installing+the+PHP+Driver#InstallingthePHPDriver-PECL</p>
<p>这个数据库已经在淘宝上配合10gen做了云计算的session（名字很操蛋）,具体资料在这里 http://rdc.taobao.com/blog/dw/archives/410。具有了实际应用的东西应该很不错，不过我没尝试过。</p>
<p>Tokyo Tyrant：http://1978th.net/</p>
<p>tt的php扩展 http://www.php.net/manual/en/book.tokyo-tyrant.php</p>
<p>这个大家就比较熟悉了，SB日本鬼子写的东西，应用很广，sina，qq等公司里都在大量应用，sina的研发团队在此基础上还做了个分布式的东东，很是不错。据说这玩意还得到了很多公司的赞助，shit。</p>
<p>TCSQL：张宴基于tt开发的一套东西，内部做了很多算法优化，具体可参考此文章 http://blog.s135.com/tcsql/</p>
<p>总结：康盛使用mysql来存储session，不能说是一种错，但对于dz的负载绝对是第一个瓶颈。用这种方式，在线人数5w对数据库绝对是个坎。很多负载比较大的论坛，都做了此方面的优化，比如，给session表单独一个数据库，或者干脆阉割此功能。不错，独立的session表，或者分库，访问量大的时候，瓶颈依然在mysql上；阉割此功能，有些心疼，而且很多运营数据会丢失。所以，保持原功能而平滑提升性能，是一个不错的解决方向。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sunboyu.cn/2009/12/29/%e4%bd%bf%e7%94%a8%e6%97%a0%e6%a8%a1%e5%bc%8f%e6%95%b0%e6%8d%ae%e5%ba%93%e6%9d%a5%e6%94%b9%e9%80%a0dz%e7%9a%84session.shtml/feed</wfw:commentRss>
		</item>
		<item>
		<title>Session处理，比较怪异的应用</title>
		<link>http://www.sunboyu.cn/2008/12/04/session%e5%a4%84%e7%90%86%ef%bc%8c%e6%af%94%e8%be%83%e6%80%aa%e5%bc%82%e7%9a%84%e5%ba%94%e7%94%a8.shtml</link>
		<comments>http://www.sunboyu.cn/2008/12/04/session%e5%a4%84%e7%90%86%ef%bc%8c%e6%af%94%e8%be%83%e6%80%aa%e5%bc%82%e7%9a%84%e5%ba%94%e7%94%a8.shtml#comments</comments>
		<pubDate>Thu, 04 Dec 2008 15:47:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[session]]></category>

		<category><![CDATA[钩子]]></category>

		<guid isPermaLink="false">http://www.sunboyu.cn/?p=411</guid>
		<description><![CDATA[其实我很不喜欢把session放在数据库中处理，不过公司一直这么用，就先这么写，更倒霉的是，花了老大力气集成在一个不适合大项目的小框架里。
session本来是用URI类统一处理，过滤全局变量中的不安全因素，这样依赖，因为要重写session的几个方法，把原来的流程整得乱七八糟。
我正在想，是不是要把他做成一个钩子，钩挂在原来系统中，通过命令的方式开关，这样貌似是个不错的办法，不过，得把钩子的类写好……
补充：session放到数据库中的好处：可以即时得查看在新的用户（当然不是非常准确），可以踢人，如果是有登录认证的话。缺点：速度贼拉得慢，不如放到内存中。操作一次内存，得反复读写数据库，且不说硬盘，网络传输就是不消的消耗。
]]></description>
			<content:encoded><![CDATA[<p>其实我很不喜欢把session放在数据库中处理，不过公司一直这么用，就先这么写，更倒霉的是，花了老大力气集成在一个不适合大项目的小框架里。<br />
session本来是用URI类统一处理，过滤全局变量中的不安全因素，这样依赖，因为要重写session的几个方法，把原来的流程整得乱七八糟。<br />
我正在想，是不是要把他做成一个钩子，钩挂在原来系统中，通过命令的方式开关，这样貌似是个不错的办法，不过，得把钩子的类写好……</p>
<p>补充：session放到数据库中的好处：可以即时得查看在新的用户（当然不是非常准确），可以踢人，如果是有登录认证的话。缺点：速度贼拉得慢，不如放到内存中。操作一次内存，得反复读写数据库，且不说硬盘，网络传输就是不消的消耗。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sunboyu.cn/2008/12/04/session%e5%a4%84%e7%90%86%ef%bc%8c%e6%af%94%e8%be%83%e6%80%aa%e5%bc%82%e7%9a%84%e5%ba%94%e7%94%a8.shtml/feed</wfw:commentRss>
		</item>
		<item>
		<title>使用mysql保存session，并建立在线用户列表</title>
		<link>http://www.sunboyu.cn/2008/08/15/%e4%bd%bf%e7%94%a8mysql%e4%bf%9d%e5%ad%98session%ef%bc%8c%e5%b9%b6%e5%bb%ba%e7%ab%8b%e5%9c%a8%e7%ba%bf%e7%94%a8%e6%88%b7%e5%88%97%e8%a1%a8.shtml</link>
		<comments>http://www.sunboyu.cn/2008/08/15/%e4%bd%bf%e7%94%a8mysql%e4%bf%9d%e5%ad%98session%ef%bc%8c%e5%b9%b6%e5%bb%ba%e7%ab%8b%e5%9c%a8%e7%ba%bf%e7%94%a8%e6%88%b7%e5%88%97%e8%a1%a8.shtml#comments</comments>
		<pubDate>Fri, 15 Aug 2008 15:02:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[MYSQL]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[list]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://www.sunboyu.cn/?p=280</guid>
		<description><![CDATA[写OA，使用mysql存储session，这样，是为了获得在线用户的列表，为做一个web im做准备。
首先创建表,注，这里使用了adodb中数据字典的描述方法：
$Session_Fields = &#34;
session_id VARCHAR(100) NOTNULL,
session_value X DEFAULT '',
session_expires I(10) DEFAULT NULL,
userid I(5) DEFAULT NULL
&#34;;
$Session_Tables = array('mysql' =&#62; &#34;ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT = 'session表'&#34;);
$dict = NewDataDictionary(GetDB());
$sqlarray = $dict-&#62;CreateTableSQL($_CFG['table']['session'], $Session_Fields, $Session_Tables);
$dict-&#62;ExecuteSQLArray($sqlarray);
然后session类:
&#60;?php
/*&#160; Session.Class.php
&#160;*&#160; Session Manager
&#160;*&#160; @link&#160; &#160; &#160; &#160; http://www.sunboyu.cn
&#160;*&#160; @package&#160; &#160; &#160;OA
&#160;*&#160; @version&#160; &#160; &#160;V1.0
&#160;*
&#160;*&#160; 2008 08 14&#160; sunboyu@gmail.com
&#160;*/
class Session
{
	var $lifetime;
	var [...]]]></description>
			<content:encoded><![CDATA[<p>写OA，使用mysql存储session，这样，是为了获得在线用户的列表，为做一个web im做准备。</p>
<p>首先创建表,注，这里使用了adodb中数据字典的描述方法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">$Session_Fields = &quot;</li>
<li>session_id VARCHAR(100) NOTNULL,</li>
<li>session_value X DEFAULT '',</li>
<li>session_expires I(10) DEFAULT NULL,</li>
<li>userid I(5) DEFAULT NULL</li>
<li>&quot;;</li>
<li>$Session_Tables = array('mysql' =&gt; &quot;ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT = 'session表'&quot;);</li>
<li>$dict = NewDataDictionary(GetDB());</li>
<li>$sqlarray = $dict-&gt;CreateTableSQL($_CFG['table']['session'], $Session_Fields, $Session_Tables);</li>
<li>$dict-&gt;ExecuteSQLArray($sqlarray);</li></ol></div>
<p>然后session类:</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">&lt;?php</li>
<li>/*&nbsp; Session.Class.php</li>
<li>&nbsp;*&nbsp; Session Manager</li>
<li>&nbsp;*&nbsp; @link&nbsp; &nbsp; &nbsp; &nbsp; http://www.sunboyu.cn</li>
<li>&nbsp;*&nbsp; @package&nbsp; &nbsp; &nbsp;OA</li>
<li>&nbsp;*&nbsp; @version&nbsp; &nbsp; &nbsp;V1.0</li>
<li>&nbsp;*</li>
<li>&nbsp;*&nbsp; 2008 08 14&nbsp; sunboyu@gmail.com</li>
<li>&nbsp;*/</li>
<li>class Session</li>
<li>{</li>
<li>	var $lifetime;</li>
<li>	var $db = null;</li>
<li>	function __construct()</li>
<li>	{	</li>
<li>		#return adodb lite connetction</li>
<li>		$this-&gt;db = GetDB();</li>
<li>	}</li>
<li>	#open</li>
<li>	function open( $savepath , $session_name )</li>
<li>	{</li>
<li>		$this-&gt;lifetime =&nbsp; get_cfg_var(&quot;session.gc_maxlifetime&quot;);</li>
<li>		return true;</li>
<li>	}</li>
<li>	#close</li>
<li>	function close()</li>
<li>	{</li>
<li>		return true;</li>
<li>	}</li>
<li>	#read</li>
<li>	function read( $session_id )</li>
<li>	{</li>
<li>		global $_CFG;</li>
<li>		$sql = sprintf(&quot;SELECT * FROM %s WHERE session_id = %s&quot;,$_CFG['table']['session'],GetSqlString( $session_id ));</li>
<li>		$rs = $this-&gt;db-&gt;Execute( $sql );</li>
<li>		if($rs-&gt;RecordCount()&gt;0)</li>
<li>		{</li>
<li>			$result = $rs-&gt;fields;</li>
<li>			</li>
<li>			return $result['session_value'];</li>
<li>		}</li>
<li>		else</li>
<li>		{</li>
<li>			return null;</li>
<li>		}</li>
<li>	}</li>
<li>	#write</li>
<li>	function write( $session_id , $session_value )</li>
<li>	{</li>
<li>		global $_CFG;</li>
<li>		$sql = sprintf(&quot;SELECT session_id FROM %s WHERE session_id = %s&quot;,$_CFG['table']['session'],GetSqlString( $session_id ));</li>
<li>		$rs = $this-&gt;db-&gt;Execute( $sql );</li>
<li>		if($rs-&gt;RecordCount()==0)</li>
<li>		{</li>
<li>			$newsql = sprintf(&quot;INSERT INTO %s SET session_id = %s , session_value = %s , session_expires = %d&quot;,</li>
<li>				$_CFG['table']['session'],</li>
<li>				GetSqlString( $session_id ),</li>
<li>				GetSqlString( $session_value ),</li>
<li>				GetSqlString( $this-&gt;lifetime+time() , &quot;int&quot; ));</li>
<li>		}</li>
<li>		else</li>
<li>		{</li>
<li>			$newsql = sprintf(&quot;UPDATE %s SET session_value = %s , session_expires = %d WHERE session_id = %s&quot;,</li>
<li>				$_CFG['table']['session'],</li>
<li>				GetSqlString( $session_value ),</li>
<li>				GetSqlString( $this-&gt;lifetime+time() , &quot;int&quot; ),</li>
<li>				GetSqlString( $session_id ));</li>
<li>		}</li>
<li>		return $this-&gt;db-&gt;Execute( $newsql );</li>
<li>	}</li>
<li>	#destroy</li>
<li>	function destroy( $session_id )</li>
<li>	{	</li>
<li>		global $_CFG;</li>
<li>		$delsql = sprintf(&quot;DELETE FROM %s WHERE session_id = %s&quot;,$_CFG['table']['session'],GetSqlString( $session_id ));</li>
<li>		return $this-&gt;db-&gt;Execute( $delsql );</li>
<li>	}</li>
<li>	#gc</li>
<li>	function gc()</li>
<li>	{</li>
<li>		 global $_CFG;</li>
<li>		 $gcsql = sprintf(&quot;DELETE FROM %s WHERE session_expires &lt; %d&quot;,$_CFG['table']['session'],time());</li>
<li>		 return $this-&gt;db-&gt;Execute( $gcsql );</li>
<li>	}</li>
<li>}</li>
<li>?&gt;</li></ol></div>
<p>session机制，之前已经介绍，实现代码如下</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">$session = new Session();</li>
<li>	session_set_save_handler(array(&amp;$session,&quot;open&quot;),</li>
<li>							 array(&amp;$session,&quot;close&quot;),</li>
<li>							 array(&amp;$session,&quot;read&quot;),</li>
<li>							 array(&amp;$session,&quot;write&quot;),</li>
<li>							 array(&amp;$session,&quot;destroy&quot;),</li>
<li>							 array(&amp;$session,&quot;gc&quot;));</li>
<li>	session_start();</li></ol></div>
<p>把session与用户id对应，使用以下语句即可</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">sprintf(&quot;UPDATE %s SET userid = %d WHERE session_id = %s&quot;,$_CFG['table']['session'],GetSqlString($rs['id'],'int'),GetSqlString(session_id(),'text'))</li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sunboyu.cn/2008/08/15/%e4%bd%bf%e7%94%a8mysql%e4%bf%9d%e5%ad%98session%ef%bc%8c%e5%b9%b6%e5%bb%ba%e7%ab%8b%e5%9c%a8%e7%ba%bf%e7%94%a8%e6%88%b7%e5%88%97%e8%a1%a8.shtml/feed</wfw:commentRss>
		</item>
		<item>
		<title>完美的用户登录验证流程</title>
		<link>http://www.sunboyu.cn/2008/08/07/%e5%ae%8c%e7%be%8e%e7%9a%84%e7%94%a8%e6%88%b7%e7%99%bb%e5%bd%95%e9%aa%8c%e8%af%81%e6%b5%81%e7%a8%8b.shtml</link>
		<comments>http://www.sunboyu.cn/2008/08/07/%e5%ae%8c%e7%be%8e%e7%9a%84%e7%94%a8%e6%88%b7%e7%99%bb%e5%bd%95%e9%aa%8c%e8%af%81%e6%b5%81%e7%a8%8b.shtml#comments</comments>
		<pubDate>Thu, 07 Aug 2008 04:52:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[cookie]]></category>

		<category><![CDATA[session]]></category>

		<category><![CDATA[登录]]></category>

		<guid isPermaLink="false">http://www.sunboyu.cn/?p=246</guid>
		<description><![CDATA[
登  录  ────────── →  多域
↓
写 session  ────────── →  写cookie
↓                                          ＼
用户session列表  →  在线用户列表      cookie登录
＼  在线踢人
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sunboyu.cn/upfiles/2008/08/e69caae591bde5908d-1.gif"><img class="aligncenter size-full wp-image-247" title="登录验证控制流程" src="http://www.sunboyu.cn/upfiles/2008/08/e69caae591bde5908d-1.gif" alt="" width="434" height="118" /></a><br />
登  录  ────────── →  多域<br />
↓<br />
写 session  ────────── →  写cookie<br />
↓                                          ＼<br />
用户session列表  →  在线用户列表      cookie登录<br />
＼  在线踢人</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sunboyu.cn/2008/08/07/%e5%ae%8c%e7%be%8e%e7%9a%84%e7%94%a8%e6%88%b7%e7%99%bb%e5%bd%95%e9%aa%8c%e8%af%81%e6%b5%81%e7%a8%8b.shtml/feed</wfw:commentRss>
		</item>
		<item>
		<title>使用Mysql来存储Session</title>
		<link>http://www.sunboyu.cn/2008/07/31/%e4%bd%bf%e7%94%a8mysql%e6%9d%a5%e5%ad%98%e5%82%a8session.shtml</link>
		<comments>http://www.sunboyu.cn/2008/07/31/%e4%bd%bf%e7%94%a8mysql%e6%9d%a5%e5%ad%98%e5%82%a8session.shtml#comments</comments>
		<pubDate>Thu, 31 Jul 2008 14:39:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://www.sunboyu.cn/?p=236</guid>
		<description><![CDATA[接上篇，我们已经知道session的具体存储机制，我们来尝试修改一下这个机制，让数据存储在mysql数据库中。
mysql有三部分的内容，session session_data session_expires分别为session的id session的内容，session的过期时间。
创建这样一个数据库
CREATE TABLE IF NOT EXISTS `sessions` (
  `session` varchar(255) character set utf8 collate utf8_bin NOT NULL,
  `session_expires` int(10) unsigned NOT NULL default &#8216;0&#8242;,
  `session_data` mediumtext collate utf8_unicode_ci,
  KEY `session` (`session`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
相对于文件方式的session存储，这两个函数是不用动的
function open($save_path, $session_name)
{
  global $sess_save_path;
  $sess_save_path = $save_path;
  return(true);
}
function close()
{
  return(true);
}
而需要修改的是读，写，删，过期操作的函数
读的操作，很简单，只是从数据库中，根据sessionid，读出date字段中的内容
function [...]]]></description>
			<content:encoded><![CDATA[<p>接上篇，我们已经知道session的具体存储机制，我们来尝试修改一下这个机制，让数据存储在mysql数据库中。</p>
<p>mysql有三部分的内容，session session_data session_expires分别为session的id session的内容，session的过期时间。</p>
<p>创建这样一个数据库</p>
<p>CREATE TABLE IF NOT EXISTS `sessions` (<br />
  `session` varchar(255) character set utf8 collate utf8_bin NOT NULL,<br />
  `session_expires` int(10) unsigned NOT NULL default &#8216;0&#8242;,<br />
  `session_data` mediumtext collate utf8_unicode_ci,<br />
  KEY `session` (`session`)<br />
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;</p>
<p>相对于文件方式的session存储，这两个函数是不用动的<br />
function open($save_path, $session_name)<br />
{<br />
  global $sess_save_path;</p>
<p>  $sess_save_path = $save_path;<br />
  return(true);<br />
}</p>
<p>function close()<br />
{<br />
  return(true);<br />
}<br />
而需要修改的是读，写，删，过期操作的函数</p>
<p>读的操作，很简单，只是从数据库中，根据sessionid，读出date字段中的内容<br />
function read($sessID) {<br />
        global $php_errormsg;<br />
        // fetch session-data<br />
        $query = &#8221;<br />
            SELECT session_data FROM sessions<br />
            WHERE session = &#8216;$sessID&#8217;<br />
            AND session_expires ><br />
        &#8220;.time();<br />
        $result = $this->mdb2->query($query);<br />
        // return data or an empty string at failure<br />
        if (MDB2::isError($result)) {<br />
            $php_errormsg .= $result->getMessage();<br />
            $php_errormsg .= $result->getDebugInfo ();<br />
            return false;<br />
        }<br />
        list($value)=@$result->fetchrow();<br />
        return $value;<br />
    }<br />
同理，写的操作就是update数据，destory的操作为删除session的记录，另外有个gc的操作是删除过期的session。<br />
具体的代码没有去实现，但在PHP手册上都有。同时手册还介绍了memcache储存的方式，效率应该会不错的。</p>
<p>这是本月最后一篇日志，也算为下月找个题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sunboyu.cn/2008/07/31/%e4%bd%bf%e7%94%a8mysql%e6%9d%a5%e5%ad%98%e5%82%a8session.shtml/feed</wfw:commentRss>
		</item>
		<item>
		<title>PHP session机制详解</title>
		<link>http://www.sunboyu.cn/2008/07/31/php-session%e6%9c%ba%e5%88%b6%e8%af%a6%e8%a7%a3.shtml</link>
		<comments>http://www.sunboyu.cn/2008/07/31/php-session%e6%9c%ba%e5%88%b6%e8%af%a6%e8%a7%a3.shtml#comments</comments>
		<pubDate>Thu, 31 Jul 2008 12:27:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[session]]></category>

		<category><![CDATA[底层机制]]></category>

		<guid isPermaLink="false">http://www.sunboyu.cn/?p=235</guid>
		<description><![CDATA[http://cn.php.net/manual/en/function.session-set-save-handler.php
php的session函数非常好用，使用非常简单，$_SESSION[$name] = **  直接写session，而$_SESSION[$name]就可以直接读session。现在剖析一下简单背后，php是如何工作的。看上边的链接，
bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )
此函数有六个动作，关于session的初始化，结束，读，写，删，和超时处理。
open：初始化session存储路径信息。
close：关闭session。
read：读session的内容
write：写session的内容
destroy：删除session内容
gc：删除过期session
可以看这些函数实现，使用了file操作，在服务端写数据保存session。而这些数据以session专有的格式进行存储，类似cookie的，大家可以试着分解一下。
我找了个session，在editplus下打开 是这样的：
UserID&#124;s:1:&#8221;1&#8243;;UserName&#124;s:5:&#8221;admin&#8221;;
]]></description>
			<content:encoded><![CDATA[<p><a href="http://cn.php.net/manual/en/function.session-set-save-handler.php">http://cn.php.net/manual/en/function.session-set-save-handler.php</a></p>
<p>php的session函数非常好用，使用非常简单，$_SESSION[$name] = **  直接写session，而$_SESSION[$name]就可以直接读session。现在剖析一下简单背后，php是如何工作的。看上边的链接，</p>
<p><span class="type">bool</span> <span class="methodname"><strong><strong>session_set_save_handler</strong></strong></span> ( <span class="methodparam"><span class="type"><a class="type callback" href="http://cn.php.net/manual/en/language.pseudo-types.php#language.types.callback">callback</a></span> <tt class="parameter">$open</tt></span> , <span class="methodparam"><span class="type"><a class="type callback" href="http://cn.php.net/manual/en/language.pseudo-types.php#language.types.callback">callback</a></span> <tt class="parameter">$close</tt></span> , <span class="methodparam"><span class="type"><a class="type callback" href="http://cn.php.net/manual/en/language.pseudo-types.php#language.types.callback">callback</a></span> <tt class="parameter">$read</tt></span> , <span class="methodparam"><span class="type"><a class="type callback" href="http://cn.php.net/manual/en/language.pseudo-types.php#language.types.callback">callback</a></span> <tt class="parameter">$write</tt></span> , <span class="methodparam"><span class="type"><a class="type callback" href="http://cn.php.net/manual/en/language.pseudo-types.php#language.types.callback">callback</a></span> <tt class="parameter">$destroy</tt></span> , <span class="methodparam"><span class="type"><a class="type callback" href="http://cn.php.net/manual/en/language.pseudo-types.php#language.types.callback">callback</a></span> <tt class="parameter">$gc</tt></span> )</p>
<p>此函数有六个动作，关于session的初始化，结束，读，写，删，和超时处理。</p>
<p>open：初始化session存储路径信息。</p>
<p>close：关闭session。</p>
<p>read：读session的内容</p>
<p>write：写session的内容</p>
<p>destroy：删除session内容</p>
<p>gc：删除过期session</p>
<p>可以看这些函数实现，使用了file操作，在服务端写数据保存session。而这些数据以session专有的格式进行存储，类似cookie的，大家可以试着分解一下。</p>
<p>我找了个session，在editplus下打开 是这样的：</p>
<p>UserID|s:1:&#8221;1&#8243;;UserName|s:5:&#8221;admin&#8221;;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sunboyu.cn/2008/07/31/php-session%e6%9c%ba%e5%88%b6%e8%af%a6%e8%a7%a3.shtml/feed</wfw:commentRss>
		</item>
	</channel>
</rss>

