<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://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://jackxiang.com/post//</link>
<title><![CDATA[[实践Ok]PHP用memcache作为session的存放时遇到的问题备案。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Fri, 18 Jan 2013 10:06:18 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	Session其实是和cookie有联系的，通过session_id()作为浏览器里的cookie发送给浏览器，下次浏览器就像PHP客户端发送这个session_id（Cookie）后，服务器于是就知道这个用户是谁，通过session_id获取到所有的当前用户设置的session数组，因session是隐私，所以，在一个PHP里是没法获取到所有用户的session的，只能获取到当前，要想获取所有的，得记录到文件中（有session的用户访问）才行获取到程序设置的session值，否则，只能从服务器里的session文件中去提取（可能要对文件进行破解）。<br/><br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
ob_start();
session_start();
$filename&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;session_id();
echo $filename;echo &quot;&#92;n&quot;;
$SESS_LIFE = get_cfg_var(&quot;session.gc_maxlifetime&quot;);
$session_save_path = get_cfg_var(&quot;session.save_path&quot;);
echo $SESS_LIFE;echo &quot;&#92;n&quot;;
echo $session_save_path;echo &quot;&#92;n&quot;;
ob_end_flush();
?&gt;
</textarea><br/><br/>背景：<br/>&nbsp;&nbsp;&nbsp;&nbsp;今天搞什么东东，突然windows7死机了，于是重启动，发现验证码登录不进了，提示错误，于是否，我还以为是代码修改的问题，但我也没有修改那个关于session那一块的代码啊，于是否，我一看php.ini里的配置，发现这个：<br/>session.save_path = &quot;d:/wamp/tmp&quot;<br/>和xdebug里的配置一样的目录，还以为是死机会出现了文件的错误等，如下：<br/>[xdebug]<br/>xdebug.profiler_output_dir = &quot;d:/wamp/tmp&quot;<br/>于是，修改成了下面这个：<br/>session.save_path = &quot;d:/wamp/session&quot;<br/>再进行访问，还是有错，于是我打开d:/wamp/session目录，发现没有一个session文件存在，于是否，在localhost里建立了一个index.php文件，写入phpinfo();访问了一下这个页面发现session这一块有如下设置：<br/><textarea name="code" class="php" rows="15" cols="100">
Registered save handlers&nbsp;&nbsp; files user memcache
</textarea><br/>有一个memcache的东东，我怀疑是不是这个session是用memcache来存的呢？于是否，我杀死memcache，在windows服务里重启memcache（services.msc），再登录，发现好了，于是否，我问了下同事：我们这个验证码的session是存在memcache里的么？<br/>刚才电脑死机了一直验证码错误，后来我就重启动memcache就好了。 回答是的，于是明白了：为何session文件夹里没有文件了。<br/>这里也要注意，不要把session的文件夹和xdebug的输出文件混起来放一个文件，尽管是开发，还是要注意适度规范下。<br/><br/>下面讲这个是怎么把php里的session放入memcache里的，如下文章转载：<br/>memcache PHP 的 session.save_handler<br/>也就是可以直接用 memcache 来作 PHP 的 session.save_handler。<br/>1. 安装 memcached，还是那套 ./configure; make; make install，注意 memcached 用 libevent 来作事件驱动，所以要先安装有 libevent。<br/>2. 安装 pecl::memcache，用 pecl 命令行工具安装：<br/>pecl install memcache<br/>或直接从源码安装： <br/>phpize ./configure make make install<br/>将 php.ini 中 extension=memcache.so 打开，重启一下 apache，查看 phpinfo 中的 &quot;Registered save handlers&quot; 会有 &quot;files user memcache&quot; 这3个可用。<br/>3. 修改配置文件，在 php.ini 中全局设置：<br/><textarea name="code" class="php" rows="15" cols="100">
session.save_handler = memcachesession.save_path = &quot;tcp://127.0.0.1:11211&quot;
</textarea><br/><br/>或者某个目录下的 .htaccess ： <br/>php_value session.save_handler &quot;memcache&quot;php_value session.save_path&nbsp;&nbsp;&quot;tcp://127.0.0.1:11211&quot;<br/>再或者在某个一个应用中： <br/><textarea name="code" class="php" rows="15" cols="100">
ini_set(&quot;session.save_handler&quot;, &quot;memcache&quot;);
ini_set(&quot;session.save_path&quot;, &quot;tcp://127.0.0.1:11211&quot;);
</textarea><br/><br/>使用多个 memcached server 时用逗号&quot;,&quot;隔开，并且和 Memcache::addServer() 文档中说明的一样，可以带额外的参数&quot;persistent&quot;、&quot;weight&quot;、&quot;timeout&quot;、&quot;retry_interval&quot; 等等，类似这样的：&quot;tcp://host1:port1?persistent=1&amp;weight=2,tcp://host2:port2&quot; 。<br/>4. 启动 memcached：<br/>memcached -d -l 127.0.0.1 -p 11212 -m 128<br/>5. 在程序中使用 memcache 来作 session 存储，用例子测试一下：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php 
session_start();
if (!isset($_SESSION[&#039;TEST&#039;])) &#123;
&nbsp;&nbsp;$_SESSION[&#039;TEST&#039;] = time();
&#125; 
$_SESSION[&#039;TEST3&#039;] = time();
print $_SESSION[&#039;TEST&#039;];
print &quot;&lt;br&gt;&lt;br&gt;&quot;;
print $_SESSION[&#039;TEST3&#039;];
print &quot;&lt;br&gt;&lt;br&gt;&quot;;
print session_id();
?&gt;
</textarea><br/>6. 用 sessionid 去 memcached 里查询一下：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
$memcache = memcache_connect(&#039;localhost&#039;, 11211);
var_dump($memcache -&gt; get(&#039;19216821213c65cedec65b0883238c278eeb573e077&#039;));
?&gt;
</textarea><br/><br/>会有看到 <br/>string(37) &quot;TEST&#124;i:1177556731;TEST3&#124;i:1177556881;&quot;<br/>这样的输出，证明 session 正常工作。<br/>用 memcache 来存储 session 在读写速度上会比 files 时快很多，而且在多个服务器需要共用 session 时会比较方便，将这些服务器都配置成使用同一组 memcached 服务器就可以，减少了额外的工作量。缺点是 session 数据都保存在 memory 中，持久化方面有所欠缺，但对 session 数据来说也不是很大的问题。<br/><br/>来自：<br/>http://www.zzxj.net/blog/fxs_2008/archive/2009/12/04/105.html<br/><br/><br/><br/>很有意思的PHP session过期机制和配置<br/>使用PHP session时会遇到明明超过了session过期时间，但session依然完好无损的活着，让人头大。其实仔细看一下php.ini关于PHP session回收机制就一目了然了。<br/>session 回收机制：<br/>PHP采用Garbage Collection process对过期session进行回收，然而并不是每次session建立时，都能够唤起 &#039;garbage collection&#039; process ，gc是按照一定概率启动的。这主要是出于对服务器性能方面的考虑，每个session都触发gc，浏览量大的话，服务器吃不消，然而按照一定概率开启gc，当流览量大的时候，session过期机制能够正常运行，而且服务器效率得到节省。细节应该都是多年的经验积累得出的。<br/>三个与PHP session过期相关的参数(php.ini中)：<br/>session.gc_probability = 1<br/>session.gc_divisor = 1000<br/>session.gc_maxlifetime = 1440<br/>gc启动概率 = gc_probability / gc_divisor = 0.1%<br/>session过期时间 gc_maxlifetime 单位：秒<br/><br/>来自：http://hi.baidu.com/tbjmnvbagkfgike/item/9eba52cbe064dc25a0b50aae<br/>较为深入的理解：http://www.laruence.com/2011/03/29/1949.html<br/><br/>http://www.sphinxsearch.org/archives/436<br/>php memcache保存session的一个设置误区：<br/>php中，使用memcache作为session的save handler 一般会使用如下设置：<br/><br/>php.ini里：<br/><br/>session.save_handler = memcache <br/>session.save_path = “localhost:11211″<br/><br/>项目配置里：<br/><br/>ini_set(“session.save_handler”, “memcache”);<br/>ini_set(“session.save_path”, “127.0.0.1:11211″);<br/>在网上很多资料会写成这样：<br/>session.save_path = “tcp://localhost:11211″<br/>就是连接前缀里添加了tcp:// 这是会导致php的memcache模块写入失败，切记一定不要添加tcp协议前缀！<br/><br/>原文：http://php.net/manual/en/memcached.sessions.php<br/>session.save_path string<br/>Defines a comma separated of hostname:port entries to use for session server pool, for example “sess1:11211, sess2:11211″.<br/><br/>If you want to use ‘memcacheD’ extention not ‘memcache’ (there are two diffrent extentions) for session control,&nbsp;&nbsp;you should pay attention to modify php.ini <br/><br/>Most web resource from google is based on memcache because It’s earlier version than memcacheD. They will say as following <br/><br/>session.save_handler = memcache <br/>session.save_path = “tcp://localhost:11211″ <br/><br/>But it’s not valid when it comes to memcacheD <br/><br/>you should modify php.ini like that <br/><br/>session.save_handler = memcached <br/>session.save_path = “localhost:11211″ <br/><br/>Look, there is no protocol indentifier<br/>KO框架里&#92;libraries&#92;session.php 有这样的一段，用Memcache来实现的session：<br/><textarea name="code" class="php" rows="15" cols="100">
&nbsp;&nbsp;&nbsp;&nbsp;protected function __construct ($group = &#039;default&#039;)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// This part only needs to be run once
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (self::$instance[$group] === NULL) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Load config
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$config = Ko::config(&#039;session.&#039; . $group);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Configure garbage collection
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ini_set(&#039;session.gc_probability&#039;, (int) self::$config[&#039;gc_probability&#039;]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ini_set(&#039;session.gc_divisor&#039;, 100);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ini_set(&#039;session.gc_maxlifetime&#039;, (self::$config[&#039;lifetime&#039;] == 0) ? 86400 : self::$config[&#039;lifetime&#039;]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Create a new session
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;create();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Write the session at shutdown
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register_shutdown_function(array($this , &#039;write_close&#039;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Singleton instance
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$instance[$group] = $this;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

</textarea><br/>更多资料：<br/>http://koda.iteye.com/blog/466667<br/>http://zhengdl126.iteye.com/blog/768211
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践Ok]PHP用memcache作为session的存放时遇到的问题备案。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>