<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[PHP下利用共享内存处理session的代码]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 22 Jul 2009 10:15:11 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/><div class="code">&lt;?php<br/>define(&quot;SESSION_PATH_HANDLE&quot;,&quot;session.data&quot;);<br/>define(&quot;SESSION_INDEX_HANDLE&quot;,&quot;index.data&quot;);<br/>define(&quot;SESSION_INDEX_SIZE&quot;,1048576);<br/>define(&quot;SESSION_DATA_SIZE&quot;,10485760);<br/>define(&quot;SHARED_SESS_TIME&quot;,3600);<br/>class ShareMemSession<br/>&#123;<br/><br/>function init()<br/>&#123;<br/>if(!file_exists(SESSION_INDEX_HANDLE))<br/>&#123;<br/>$handle=fopen(SESSION_INDEX_HANDLE,&quot;wb&quot;);<br/>fwrite($handle,&quot;I will use this file for session index&quot;);<br/>fclose($handle);<br/>$shm_index_key=ftok(SESSION_INDEX_HANDLE,&quot;c&quot;);<br/>$sem_index_id=sem_get($shm_index_key,1,0644,0);<br/>sem_acquire($sem_index_id);<br/>$shm_index_id=shm_attach( $shm_index_key,SESSION_INDEX_SIZE);<br/>$session_index=array();<br/>$shm_put_var($shm_index_id,1,$session_index);<br/>shm_detach($shm_index_id);<br/>sem_release($sem_index_id);<br/>&#125;<br/>if(!file_exists(SESSION_PATH_HANDLE))<br/>&#123;<br/>$handle=fopen(SESSION_PATH_HANDLE,&quot;wb&quot;);<br/>fwrite($handle,&quot;I will use this file for session&quot;);<br/>fclose($handle);<br/>$shm_data_key=ftok(SESSION_PATH_HANDLE,&quot;c&quot;);<br/>$sem_data_id=sem_get($shm_data_key,1,0644,0);<br/>$shm_data_id=shm_attach( $shm_data_key,SESSION_DATA_SIZE);<br/>shm_detach($shm_data_id);<br/>sem_release($sem_data_id);<br/>&#125;<br/>ini_set(&#039;session.use_trans_sid&#039;, 0);<br/>//设置垃圾回收最大生存时间<br/>ini_set(&#039;session.gc_maxlifetime&#039;, SHARED_SESS_TIME);<br/><br/>//使用 COOKIE 保存 SESSION ID 的方式<br/>ini_set(&#039;session.use_cookies&#039;, 1);<br/>ini_set(&#039;session.cookie_path&#039;, &quot;/&quot;);<br/>//多主机共享保存 SESSION ID 的 COOKIE<br/>// ini_set(&#039;session.cookie_domain&#039;, $domain);<br/>session_module_name(&quot;user&quot;);<br/>session_set_save_handler(<br/>array(&quot;ShareMemSession&quot;, &quot;open&quot;),<br/>array(&quot;ShareMemSession&quot;, &quot;close&quot;),<br/>array(&quot;ShareMemSession&quot;, &quot;read&quot;),<br/>array(&quot;ShareMemSession&quot;, &quot;write&quot;),<br/>array(&quot;ShareMemSession&quot;, &quot;destroy&quot;),<br/>array(&quot;ShareMemSession&quot;, &quot;gc&quot;)<br/>);<br/><br/>&#125;<br/>function open($save_path, $session_name)<br/>&#123;<br/>return true;<br/>&#125;<br/><br/>function close()&#123;<br/>return true;<br/>&#125;<br/><br/>function read($session_id)<br/>&#123;<br/>$tmp_session_id=-1;<br/>//first ,I will read session index from share_mem<br/>$shm_index_key=ftok(SESSION_INDEX_HANDLE,&quot;c&quot;);<br/>$sem_index_id=sem_get($shm_index_key,1,0644,0);<br/>sem_acquire($sem_index_id);<br/>$shm_index_id=shm_attach( $shm_index_key,SESSION_INDEX_SIZE);<br/>$session_index=shm_get_var($shm_index_id,1);<br/><br/>if($session_index)<br/>&#123;<br/>if(!is_array($session_index) &#124;&#124; !isset($session_index&#91;$session_id&#93;)) return &quot;&quot;;<br/>$tmp_session_id=$session_index&#91;$session_id&#93;&#91;&quot;session_hash_id&quot;&#93;;//得到当前session的hash id<br/>$session_index&#91;$session_id&#93;&#91;&quot;lastvisit&quot;&#93;=time();<br/>shm_put_var($shm_index_id,1,$session_index);<br/>shm_detach($shm_index_id);<br/>sem_release($sem_index_id);<br/>&#125;<br/>else<br/>&#123;<br/>shm_detach($shm_index_id);<br/>sem_release($sem_index_id);<br/>return &quot;&quot;;<br/>&#125;<br/>$shm_data_key=ftok(SESSION_PATH_HANDLE,&quot;c&quot;);<br/>$sem_data_id=sem_get($shm_data_key,1,0644,0);<br/>sem_acquire($sem_data_id);<br/>$shm_data_id=shm_attach( $shm_data_key,SESSION_DATA_SIZE);<br/>$result=shm_get_var($shm_data_id,$tmp_session_id);<br/>shm_detach($shm_data_id);<br/>sem_release($sem_data_id);<br/>return $result;<br/>&#125;<br/><br/>function write($session_id, $data_value)<br/>&#123;<br/>$tmp_session_id=-1;<br/>//first ,I will read session index from share_mem<br/>$shm_index_key=ftok(SESSION_INDEX_HANDLE,&quot;c&quot;);<br/>$sem_index_id=sem_get($shm_index_key,1,0644,0);<br/>sem_acquire($sem_index_id);<br/>$shm_index_id=shm_attach( $shm_index_key,SESSION_INDEX_SIZE);<br/>$session_index=shm_get_var($shm_index_id,1);<br/>if($session_index)<br/>&#123;<br/>if(is_array($session_index) &amp;&amp; isset($session_index&#91;$session_id&#93;))<br/>&#123;<br/>$tmp_session_id=$session_index&#91;$session_id&#93;&#91;&quot;session_hash_id&quot;&#93;;//得到当前session的hash id<br/>$session_index&#91;$session_id&#93;&#91;&quot;lastvisit&quot;&#93;=time();<br/>&#125;<br/>else<br/>&#123;<br/>$hash_id=ShareMemSession::hash($session_id);<br/>while(array_search($hash_id,$session_index))<br/>&#123;<br/>if ($hash_id&lt;5000)<br/>$hash_id=5000;<br/>else<br/>$hash_id++;<br/>&#125;<br/>$tmp_index=array();<br/>$tmp_index&#91;&quot;session_hash_id&quot;&#93;=$hash_id;<br/>$tmp_index&#91;&quot;lastvisit&quot;&#93;=time();<br/>$session_index&#91;$session_id&#93;=$tmp_index;<br/>$tmp_session_id=$hash_id;<br/>&#125;<br/><br/>shm_put_var($shm_index_id,1,$session_index);<br/><br/>&#125;<br/>else<br/>&#123;<br/>shm_detach($shm_index_id);<br/>sem_release($sem_index_id);<br/>return false;<br/>&#125;<br/>$shm_data_key=ftok(SESSION_PATH_HANDLE,&quot;c&quot;);<br/>$sem_data_id=sem_get($shm_data_key,1,0644,0);<br/>sem_acquire($sem_data_id);<br/>$shm_data_id=shm_attach( $shm_data_key,SESSION_DATA_SIZE);<br/>$result=shm_put_var($shm_data_id,$tmp_session_id,$data_value);<br/>shm_detach($shm_data_id);<br/>sem_release($sem_data_id);<br/><br/>return true;<br/>&#125;<br/><br/>function destroy($session_id)&#123;<br/>$tmp_session_id=-1;<br/>//first ,I will read session index from share_mem<br/>$shm_index_key=ftok(SESSION_INDEX_HANDLE,&quot;c&quot;);<br/>$sem_index_id=sem_get($shm_index_key,1,0644,0);<br/>sem_acquire($sem_index_id);<br/>$shm_index_id=shm_attach( $shm_index_key,SESSION_INDEX_SIZE);<br/>$session_index=shm_get_var($shm_index_id,1);<br/><br/>if($session_index)<br/>&#123;<br/>if(is_array($session_index) &amp;&amp; isset($session_index&#91;$session_id&#93;))<br/>&#123;<br/>$tmp_session_id=$session_index&#91;$session_id&#93;&#91;&quot;session_hash_id&quot;&#93;;//得到当前session的hash id<br/>unset($session_index&#91;$session_id&#93;);<br/>shm_put_var($shm_index_id,1,$session_index);<br/>shm_detach($shm_index_id);<br/>sem_release($sem_index_id);<br/>&#125;<br/>&#125;<br/>if($tmp_session_id!=-1)<br/>&#123;<br/>$shm_data_key=ftok(SESSION_PATH_HANDLE,&quot;c&quot;);<br/>$sem_data_id=sem_get($shm_data_key,1,0644,0);<br/>sem_acquire($sem_data_id);<br/>$shm_data_id=shm_attach( $shm_data_key,SESSION_DATA_SIZE);<br/>$result=shm_remove_var($shm_data_id,$tmp_session_id);<br/>shm_detach($shm_data_id);<br/>sem_release($sem_data_id);<br/>&#125;<br/>return true;<br/>&#125;<br/><br/>function gc($maxlifetime = SHARED_SESS_TIME)<br/>&#123;<br/>$shm_index_key=ftok(SESSION_INDEX_HANDLE,&quot;c&quot;);<br/>$sem_index_id=sem_get($shm_index_key,1,0644,0);<br/>sem_acquire($sem_index_id);<br/>$shm_index_id=shm_attach( $shm_index_key,SESSION_INDEX_SIZE);<br/>$session_index=shm_get_var($shm_index_id,1);<br/>$tmpresult=array();<br/>$check_time=time();<br/>if($session_index)<br/>&#123;<br/>foreach($session_index as $key=&gt;$value)<br/>&#123;<br/>if($value&#91;&quot;lastvisit&quot;&#93;+$maxlifetime&lt;$check_time)<br/>$tmpresult&#91;&#93;=array(&quot;session_id&quot;=&gt;$key,&quot;hash_id&quot;=&gt;$value&#91;&quot;session_hash_id&quot;&#93;);<br/>// $tmp_session_id=$session_index&#91;$session_id&#93;&#91;&quot;session_hash_id&quot;&#93;;//得到当前session的hash id<br/>// unset($session_index&#91;$session_id&#93;);<br/>&#125;<br/>$shm_data_key=ftok(SESSION_PATH_HANDLE,&quot;c&quot;);<br/>$sem_data_id=sem_get($shm_data_key,1,0644,0);<br/>sem_acquire($sem_data_id);<br/>foreach($tmpresult as $item)<br/>&#123;<br/>$tmp_session_id=$item&#91;&quot;session_id&quot;&#93;;//得到当前session的hash id<br/>unset($session_index&#91;$session_id&#93;);<br/>$result=shm_remove_var($shm_data_id,$item&#91;&quot;hash_id&quot;&#93;);<br/>&#125;<br/>shm_put_var($shm_index_id,1,$session_index);<br/><br/><br/>&#125;<br/>shm_detach($shm_index_id);<br/>sem_release($sem_index_id);<br/>shm_detach($shm_data_id);<br/>sem_release($sem_data_id);<br/>return true;<br/>&#125;<br/>function hash($session_id)<br/>&#123;<br/>$length = strlen($string);<br/>//$aim;<br/>$aim = &quot;&quot;;<br/>for($loop = 0;$loop &lt; $length;$loop++)<br/>&#123;<br/>$temp = substr($string, $loop, 1);<br/>if (is_numeric($temp))<br/>$aim += $temp;<br/>else<br/>&#123;<br/>$asc = ord($temp);<br/>$aim += $asc;<br/>&#125;<br/>&#125;<br/>return $aim;<br/>&#125;<br/>&#125;<br/>ShareMemSession::init();<br/>?&gt;</div><br/><br/><br/><br/><br/>session共享大家有什么好的解决方案吗？<br/>1、PHP原生SESSION，NFS共享<br/>2、自定义SESSION，存入数据库<br/>3、更改SESSION配置，存入MEMCACHED
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] PHP下利用共享内存处理session的代码]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>