{"id":59370,"date":"2025-04-23T13:47:56","date_gmt":"2025-04-23T05:47:56","guid":{"rendered":"https:\/\/fwq.ai\/blog\/59370\/"},"modified":"2025-04-23T13:47:56","modified_gmt":"2025-04-23T05:47:56","slug":"%e5%b0%86ecshop%e4%b8%ad%e7%9a%84session%e4%bb%8emysql%e7%a7%bb%e6%a4%8d%e5%88%b0memcache%e7%9a%84%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/59370\/","title":{"rendered":"\u5c06ecshop\u4e2d\u7684session\u4ecemysql\u79fb\u690d\u5230memcache\u7684\u65b9\u6cd5"},"content":{"rendered":"<p>&nbsp;\u5c06ecshop\u4e2d\u7684session\u673a\u5236\u91cd\u5199,\u4eceDB\u79fb\u690d\u5230Memcache\u4e2d\u53bb\uff0c\u7ecf\u8fc7\u6d4b\u8bd5\u7edd\u5bf9\u53ef\u7528\uff01(\u597d\u6a21\u677f\u672a\u6d4b\u8bd5)<\/p>\n<p>  &nbsp;   \u4ee3\u7801\u5982\u4e0b\uff1a   &nbsp;   &lt;?php   &nbsp;   if (!defined(&#8216;IN_ECS&#8217;))   {   die(&#8216;Hacking attempt&#8217;);   }   &nbsp;   \/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/   \/\/&#8211; \u8be5\u7c7b\u7528\u4e8e\u5c06SESSION\u76f4\u63a5\u5199\u5165Memcache   \/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/   class cls_session   {   var $db = NULL;   &nbsp;   var $max_life_time = 1800; \/\/ SESSION \u8fc7\u671f\u65f6\u95f4   &nbsp;   var $session_name = &#8221;;   var $session_id = &#8221;;   &nbsp;   var $session_expiry = &#8221;;   var $session_md5 = &#8221;;   &nbsp;   var $session_cookie_path = &#8216;\/&#8217;;   var $session_cookie_domain = &#8221;;   var $session_cookie_secure = false;   &nbsp;   var $_ip = &#8221;;   var $_time = 0;   &nbsp;   function __construct(&amp;$db, $session_table, $session_data_table, $session_name = &#8216;ECS_ID&#8217;, $session_id = &#8221;)   {   $m = new Memcache;   $m-&gt;addServer(&#8216;127.0.0.1&#8217;, 11211);   $this-&gt;cls_session($m, $session_name, $session_id);   }   &nbsp;   function cls_session(&amp;$db, $session_name = &#8216;ECS_ID&#8217;, $session_id = &#8221;)   {   $GLOBALS[&#8216;_SESSION&#8217;] = array();   &nbsp;   if (!empty($GLOBALS[&#8216;cookie_path&#8217;]))   {   $this-&gt;session_cookie_path = $GLOBALS[&#8216;cookie_path&#8217;];   }   else   {   $this-&gt;session_cookie_path = &#8216;\/&#8217;;   }   &nbsp;   if (!empty($GLOBALS[&#8216;cookie_domain&#8217;]))   {   $this-&gt;session_cookie_domain = $GLOBALS[&#8216;cookie_domain&#8217;];   }   else   {   $this-&gt;session_cookie_domain = &#8221;;   }   &nbsp;   if (!empty($GLOBALS[&#8216;cookie_secure&#8217;]))   {   $this-&gt;session_cookie_secure = $GLOBALS[&#8216;cookie_secure&#8217;];   }   else   {   $this-&gt;session_cookie_secure = false;   }   &nbsp;   $this-&gt;session_name = $session_name;   &nbsp;   $this-&gt;db = &amp;$db;   $this-&gt;_ip = real_ip();   &nbsp;   if ($session_id == &#8221; &amp;&amp; !empty($_COOKIE[$this-&gt;session_name]))   {   $this-&gt;session_id = $_COOKIE[$this-&gt;session_name];   }   else   {   $this-&gt;session_id = $session_id;   }   &nbsp;   if ($this-&gt;session_id)   {   $tmp_session_id = substr($this-&gt;session_id, 0, 32);   if ($this-&gt;gen_session_key($tmp_session_id) == substr($this-&gt;session_id, 32))   {   $this-&gt;session_id = $tmp_session_id;   }   else   {   $this-&gt;session_id = &#8221;;   }   }   &nbsp;   $this-&gt;_time = time();   &nbsp;   if ($this-&gt;session_id)   {   $this-&gt;load_session();   }   else   {   $this-&gt;gen_session_id();   setcookie($this-&gt;session_name, $this-&gt;session_id . $this-&gt;gen_session_key($this-&gt;session_id), 0, $this-&gt;session_cookie_path, $this-&gt;session_cookie_domain, $this-&gt;session_cookie_secure);   }   register_shutdown_function(array(&amp;$this, &#8216;close_session&#8217;));   }   &nbsp;   function gen_session_id()   {   $this-&gt;session_id = md5(uniqid(mt_rand(), true));   &nbsp;   return $this-&gt;insert_session();   }   &nbsp;   function gen_session_key($session_id)   {   static $ip = &#8221;;   &nbsp;   if ($ip == &#8221;)   {   $ip = substr($this-&gt;_ip, 0, strrpos($this-&gt;_ip, &#8216;.&#8217;));   }   &nbsp;   return sprintf(&#8216;%08x&#8217;, crc32(!empty($_SERVER[&#8216;HTTP_USER_AGENT&#8217;]) ? $_SERVER[&#8216;HTTP_USER_AGENT&#8217;] . ROOT_PATH . $ip . $session_id : ROOT_PATH . $ip . $session_id));   }   &nbsp;   function insert_session()   {   return $this-&gt;db-&gt;set($this-&gt;session_id, array(&#8216;expiry&#8217;=&gt;$this-&gt;_time, &#8216;ip&#8217;=&gt;$this-&gt;_ip, &#8216;data&#8217;=&gt;&#8217;a:0:{}&#8217;), false, $this-&gt;max_life_time);   }   &nbsp;   function load_session()   {   $session = $this-&gt;db-&gt;get($this-&gt;session_id);   if (empty($session))   {   $this-&gt;insert_session();   $this-&gt;session_expiry = 0;   $this-&gt;session_md5 = &#8217;40cd750bba9870f18aada2478b24840a&#8217;;   $GLOBALS[&#8216;_SESSION&#8217;] = array();   }   else   {   if (!empty($session[&#8216;data&#8217;]) &amp;&amp; $this-&gt;_time &#8211; $session[&#8216;expiry&#8217;] &lt;= $this-&gt;max_life_time)   {   $this-&gt;session_expiry = $session[&#8216;expiry&#8217;];   $this-&gt;session_md5 = md5($session[&#8216;data&#8217;]);   $GLOBALS[&#8216;_SESSION&#8217;] = unserialize(stripslashes($session[&#8216;data&#8217;]));   }   else   {   $this-&gt;session_expiry = 0;   $this-&gt;session_md5 = &#8217;40cd750bba9870f18aada2478b24840a&#8217;;   $GLOBALS[&#8216;_SESSION&#8217;] = array();   }   }   }   &nbsp;   function update_session()   {   $adminid = !empty($GLOBALS[&#8216;_SESSION&#8217;][&#8216;admin_id&#8217;]) ? intval($GLOBALS[&#8216;_SESSION&#8217;][&#8216;admin_id&#8217;]) : 0;   $userid = !empty($GLOBALS[&#8216;_SESSION&#8217;][&#8216;user_id&#8217;]) ? intval($GLOBALS[&#8216;_SESSION&#8217;][&#8216;user_id&#8217;]) : 0;   &nbsp;   $data = serialize($GLOBALS[&#8216;_SESSION&#8217;]);   $this-&gt;_time = time();   &nbsp;   if ($this-&gt;session_md5 == md5($data) &amp;&amp; $this-&gt;_time &lt; $this-&gt;session_expiry + 10)   {   return true;   }   &nbsp;   $data = addslashes($data);   &nbsp;   return $this-&gt;db-&gt;replace($this-&gt;session_id, array(&#8216;expiry&#8217;=&gt;$this-&gt;_time, &#8216;ip&#8217;=&gt;$this-&gt;_ip, &#8216;userid&#8217;=&gt;$userid, &#8216;adminid&#8217;=&gt;$adminid, &#8216;data&#8217;=&gt;$data), false, $this-&gt;max_life_time);   }   &nbsp;   function close_session()   {   $this-&gt;update_session();   return true;   }   &nbsp;   function delete_spec_admin_session($adminid)   {   if (!empty($GLOBALS[&#8216;_SESSION&#8217;][&#8216;admin_id&#8217;]) &amp;&amp; $adminid)   {   $all_items = $this-&gt;db-&gt;getExtendedStats(&#8216;items&#8217;);   $items = $all_items[&#8216;127.0.0.1:11211&#8217;][&#8216;items&#8217;];   foreach ($items as $key =&gt; $item) {   if (isset($item[&#8216;adminid&#8217;])) {   if ($item[&#8216;adminid&#8217;] == $adminid) return $this-&gt;db-&gt;delete($key);   }   }   }   else   {   return false;   }   }   &nbsp;   function destroy_session()   {&nbsp;   $GLOBALS[&#8216;_SESSION&#8217;] = array();   &nbsp;   setcookie($this-&gt;session_name, $this-&gt;session_id, 1, $this-&gt;session_cookie_path, $this-&gt;session_cookie_domain, $this-&gt;session_cookie_secure);   &nbsp;   \/* ECSHOP \u81ea\u5b9a\u4e49\u6267\u884c\u90e8\u5206 *\/   if (!empty($GLOBALS[&#8216;ecs&#8217;]))   {   $GLOBALS[&#8216;db&#8217;]-&gt;query(&#8216;DELETE FROM &#8216; . $GLOBALS[&#8216;ecs&#8217;]-&gt;table(&#8216;cart&#8217;) . &#8221; WHERE session_id = &#8216;$this-&gt;session_id'&#8221;);   }   \/* ECSHOP \u81ea\u5b9a\u4e49\u6267\u884c\u90e8\u5206 *\/   &nbsp;   return $this-&gt;db-&gt;delete($this-&gt;session_id);   }   &nbsp;   function get_session_id()   {   return $this-&gt;session_id;   }   &nbsp;   function get_users_count()   {   $all_items = $this-&gt;db-&gt;getExtendedStats();   return $count = $all_items[&#8216;127.0.0.1:11211&#8217;][&#8216;curr_items&#8217;];\/\/\u7531\u4e8e\u6709\u5176\u4ed6key\u7684\u7f13\u5b58\uff0c\u56e0\u6b64\u8fd9\u53ea\u662f\u4e2a\u63a5\u8fd1\u6570\u503c   }   &nbsp;   }   &nbsp;   ?&gt;&nbsp; <\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp;\u5c06ecshop\u4e2d\u7684session\u673a\u5236\u91cd\u5199,\u4eceDB\u79fb\u690d\u5230Memcache\u4e2d\u53bb\uff0c\u7ecf\u8fc7\u6d4b\u8bd5\u7edd\u5bf9\u53ef\u7528\uff01(\u597d\u6a21\u677f\u672a\u6d4b\u8bd5) &nbsp; \u4ee3\u7801\u5982\u4e0b\uff1a &nbsp; &lt;?php &nbsp; if (!defined(&#8216;IN_ECS&#8217;)) { die(&#8216;Hacking attempt&#8217;); } &nbsp; \/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/ \/\/&#8211; \u8be5\u7c7b\u7528\u4e8e\u5c06SESSION\u76f4\u63a5\u5199\u5165Memcache \/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/ class cls_session { var $db = NULL; &nbsp; var $max_life_time = 1800; \/\/ SESSION \u8fc7\u671f\u65f6\u95f4 &nbsp; var $session_name = &#8221;; var $session_id = &#8221;; &nbsp; var $session_expiry = &#8221;; var $session_md5 = &#8221;; &nbsp; var $session_cookie_path [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-59370","post","type-post","status-publish","format-standard","hentry","category-16"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/59370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=59370"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/59370\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=59370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=59370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=59370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}