<?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"
	>

<channel>
	<title>爱游一游</title>
	<atom:link href="http://www.iu1u.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iu1u.com</link>
	<description>又一个 WordPress Blog</description>
	<pubDate>Tue, 23 Sep 2008 16:34:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>在MYSQL中创建utf-8格式的数据库</title>
		<link>http://www.iu1u.com/2008/09/53/</link>
		<comments>http://www.iu1u.com/2008/09/53/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 16:34:08 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

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

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

		<guid isPermaLink="false">http://www.iu1u.com/?p=53</guid>
		<description><![CDATA[mysql&#62;Create DATABASE &#8220;your_db_name&#8221; default charset utf8 COLLATE utf8_general_ci;
#my_db:要创建的数据库
#“COLLATE utf8_general_ci“,使用utf编码存储数据
]]></description>
			<content:encoded><![CDATA[<p>mysql&gt;Create DATABASE &#8220;your_db_name&#8221; default charset utf8 COLLATE utf8_general_ci;</p>
<p>#my_db:要创建的数据库<br />
#“COLLATE utf8_general_ci“,使用utf编码存储数据</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/09/53/feed/</wfw:commentRss>
		</item>
		<item>
		<title>有空再研究一下xdebug，优化一下系统</title>
		<link>http://www.iu1u.com/2008/07/52/</link>
		<comments>http://www.iu1u.com/2008/07/52/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 10:27:39 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=52</guid>
		<description><![CDATA[rt
顺便转一篇参考资料：http://www.ooso.net/index.php/archives/397
在优化php代码执行效率过程中，有个好办法是利用xdebug生成profile文件，然后查看整个程序的瓶颈在哪里。现在xdebug profile的查看程序有好几个，在这里罗列一下.
Wincachegrind
Wincachegrind是windows下的profile查看程序，使用起来感觉还不错，profile文件太大的话偶尔会崩溃。
今天在高春辉的博客上看到这些:
最近又开始拿 Xdebug 和 wincachegrind 对项目的 PHP 代码进行分析和优化，但是发现和自己输出的执行时间总是相差十倍，差的不是零头，而是十倍。
上网搜索了一下，原来在 Xdebug 2.0.0RC4 版本开始，对 profiler 日志中的时间单位进行了修改。
（“Use µ seconds instead of a tenths of µ seconds to avoid confusion in profile information. ”）
而 wincachegrind 又不再升级维护了，所以凡是用 2.0.0RC4 以及之后版本的 Xdebug 输出的 profiler 日志用 wincachegrind 来分析的话，都会有十倍的时间差距。
他已经提供了hack后的版本，可以解决时间差距的问题，有兴趣的同学可以试试。
CachegrindVisualizer
CachegrindVisualizer是一个xdebug的profile文件查看客户端,采用Adobe的AIR制作。
更详细的介绍可以看以前写的关于CachegrindVisualizer的介绍。
Kcachegrind
Kcachegrind是linux下的一个图形化profile查看工具，功能很强劲。
Callgrind uses runtime instrumentation via the Valgrind framework for its cache simulation and call-graph generation. This way, [...]]]></description>
			<content:encoded><![CDATA[<p>rt</p>
<p>顺便转一篇参考资料：<a href="http://www.ooso.net/index.php/archives/397">http://www.ooso.net/index.php/archives/397</a></p>
<p>在优化php代码执行效率过程中，有个好办法是利用<a href="http://www.iu1u.com/?tag=xdebug">xdebug</a>生成profile文件，然后查看整个程序的瓶颈在哪里。现在xdebug profile的查看程序有好几个，在这里罗列一下.</p>
<h3>Wincachegrind</h3>
<p><a href="http://sourceforge.net/project/showfiles.php?group_id=135562">Wincachegrind</a>是windows下的profile查看程序，使用起来感觉还不错，profile文件太大的话偶尔会崩溃。</p>
<p>今天在<a href="http://www.paulgao.com.cn/index.php?itemid=134">高春辉的博客</a>上看到这些:</p>
<blockquote><p>最近又开始拿 Xdebug 和 wincachegrind 对项目的 PHP 代码进行分析和优化，但是发现和自己输出的执行时间总是相差十倍，差的不是零头，而是十倍。<br />
上网搜索了一下，原来在 Xdebug 2.0.0RC4 版本开始，对 profiler 日志中的时间单位进行了修改。<br />
（“Use µ seconds instead of a tenths of µ seconds to avoid confusion in profile information. ”）<br />
而 wincachegrind 又不再升级维护了，所以凡是用 2.0.0RC4 以及之后版本的 Xdebug 输出的 profiler 日志用 wincachegrind 来分析的话，都会有十倍的时间差距。</p></blockquote>
<p>他已经提供了hack后的版本，可以解决时间差距的问题，有兴趣的同学可以试试。</p>
<h3>CachegrindVisualizer</h3>
<p><a href="http://code.google.com/p/cachegrindvisualizer/">CachegrindVisualizer</a>是一个xdebug的profile文件查看客户端,采用Adobe的<a href="http://www.iu1u.com/?tag=air">AIR</a>制作。</p>
<p>更详细的介绍可以看以前写的<a href="http://www.ooso.net/index.php/archives/338">关于CachegrindVisualizer的介绍</a>。</p>
<h3>Kcachegrind</h3>
<p>Kcachegrind是linux下的一个图形化profile查看工具，功能很强劲。</p>
<blockquote><p>Callgrind uses runtime instrumentation via the Valgrind framework for its cache simulation and call-graph generation. This way, even shared libraries and dynamically opened plugins can be profiled. The data files generated by Callgrind can be loaded into KCachegrind for browsing the performance results.</p></blockquote>
<h3>webgrind</h3>
<p><a href="http://code.google.com/p/webgrind/">webgrind</a>和wincachegrind的功能差不多，但是webgrind是基于web的，采用php写的查看工具。看了一下代码，跑在linux的服务器比较好。</p>
<blockquote><p>Webgrind is an Xdebug profiling web frontend in PHP5. It implements only a minimal subset of the features of kcachegrind, but installs in seconds and works on all platforms. For quick’n&#8217;dirty optimizations it does the job.</p></blockquote>
<p>下面是用webgrind查看phpmyadmin的profile抓图：<br />
<a href="http://jokke.dk/media/2008-webgrind/webgrind_large.png"><img src="http://jokke.dk/media/2008-webgrind/webgrind_small.png" alt="" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/52/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP中的Memcache函数库（Memcache Functions）[zt备份]</title>
		<link>http://www.iu1u.com/2008/07/51/</link>
		<comments>http://www.iu1u.com/2008/07/51/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 10:14:03 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=51</guid>
		<description><![CDATA[Memcache函数库是在PECL(PHP Extension Community Library)中，主要作用是搭建大容量的内存数据的临时存放区域，在分布式的时候作用体现的非常明显，否则不建议使用。

在《phper》电子杂志的第一期中，有黑夜路人写的关于Memcache的详细安装教程，本人在ubuntu上安装完运行的时候报错：
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

按照：《libeven、memcached、libmemcache安装》中的方法，使用：

sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2
可以修正这个BUG

]]></description>
			<content:encoded><![CDATA[<p>转自：<a href="http://www.csask.com/">http://www.csask.com/</a></p>
<p>Memcache函数库是在PECL(PHP Extension Community Library)中，主要作用是搭建大容量的内存数据的临时存放区域，在分布式的时候作用体现的非常明显，否则不建议使用。</p>
<p>在<a href="http://phper.phpchina.com/">《phper》</a>电子杂志的第一期中，有黑夜路人写的关于Memcache的详细安装教程，本人在ubuntu上安装完运行的时候报错：<br />
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory</p>
<p>按照：<a href="http://yayu.org/look.php?id=105">《libeven、memcached、libmemcache安装》</a>中的方法，使用：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #0000ff;">sudo</span><span style="color: #808080;"> </span><span style="color: #0000ff;">ln</span><span style="color: #808080;"> -</span><span style="color: #0000ff;">s</span><span style="color: #808080;"> /</span><span style="color: #0000ff;">usr</span><span style="color: #808080;">/</span><span style="color: #0000ff;">local</span><span style="color: #808080;">/</span><span style="color: #0000ff;">lib</span><span style="color: #808080;">/</span><span style="color: #0000ff;">libevent</span><span style="color: #808080;">-</span><span style="color: #800000;">1.4</span><span style="color: #808080;">.</span><span style="color: #0000ff;">so</span><span style="color: #800000;">.2</span><span style="color: #808080;"> /</span><span style="color: #0000ff;">usr</span><span style="color: #808080;">/</span><span style="color: #0000ff;">lib</span><span style="color: #808080;">/</span><span style="color: #0000ff;">libevent</span><span style="color: #808080;">-</span><span style="color: #800000;">1.4</span><span style="color: #808080;">.</span><span style="color: #0000ff;">so</span><span style="color: #800000;">.2</span></div>
</div>
<p>可以修正这个BUG</p>
<p>通过新得立安装php的memcached模块，注销/etc/php5/conf.d/memcached.ini里面的“;”，重启apache，调用phpinfo()出现memcached的信息</p>
<p>执行：</p>
<div class="hl-surround">
<div class="hl-main">/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid</div>
</div>
<p>memcached的服务正式启动</p>
<p>Memcache::add — 添加一个值，如果已经存在，则返回false<br />
Memcache::addServer — 添加一个可供使用的服务器地址<br />
Memcache::close — 关闭一个Memcache对象<br />
Memcache::connect — 创建一个Memcache对象<br />
memcache_debug — 控制调试功能<br />
Memcache::decrement — 对保存的某个key中的值进行减法操作<br />
Memcache::delete — 删除一个key值<br />
Memcache::flush — 清除所有缓存的数据<br />
Memcache::get — 获取一个key值<br />
Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计<br />
Memcache::getServerStatus — 获取运行服务器的参数<br />
Memcache::getStats — 返回服务器的一些运行统计信息<br />
Memcache::getVersion — 返回运行的Memcache的版本信息<br />
Memcache::increment — 对保存的某个key中的值进行加法操作<br />
Memcache::pconnect — 创建一个Memcache的持久连接对象<br />
Memcache::replace — R对一个已有的key进行覆写操作<br />
Memcache::set — 添加一个值，如果已经存在，则覆写<br />
Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩<br />
Memcache::setServerParams — 在运行时修改服务器的参数</p>
<p>建议用面向对象的方式来测试这个库：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #0000ff;">&lt;?php</span><span style="color: #808080;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;"> = </span><span style="color: #008000;">new</span><span style="color: #808080;"> </span><span style="color: #0000ff;">Memcache</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">connect</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808000;">)</span><span style="color: #808080;"> </span><span style="color: #008000;">or</span><span style="color: #808080;"> </span><span style="color: #008000;">die</span><span style="color: #808080;"> </span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: #ff0000;">Could not connect</span><span style="color: #8b0000;">&#8220;</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$version</span><span style="color: #808080;"> = </span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">getVersion</span><span style="color: #808000;">()</span><span style="color: #808080;">;<br />
</span><span style="color: #008000;">echo</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8220;</span><span style="color: #ff0000;">Server&#8217;s version: </span><span style="color: #8b0000;">&#8220;</span><span style="color: #808080;">.</span><span style="color: #00008b;">$version</span><span style="color: #808080;">.</span><span style="color: #8b0000;">&#8220;</span><span style="color: #ff0000;">&lt;br/&gt;</span><span style="color: #000080;">\n</span><span style="color: #8b0000;">&#8220;</span><span style="color: #808080;">;<br />
</span><span style="color: #0000ff;">?&gt;</span></div>
</div>
<p>Memcache::getVersion方法的作用是返回运行的Memcache的版本信息。</p>
<p>Memcache::getStats方法的作用是返回服务器的一些运行统计信息。Memcache::getStats方法有三个参数，第一个参数表示要求返回的类型：reset, malloc, maps, cachedump, slabs, items, sizes;第二个参数和第三个参数是在第一个参数设置为“cachedump”时使用的。Memcache::getExtendedStats方法的作用是获取进程池中所有进程的运行系统统计。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #0000ff;">&lt;?php</span><span style="color: #808080;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;"> = </span><span style="color: #008000;">new</span><span style="color: #808080;"> </span><span style="color: #0000ff;">Memcache</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">connect</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808000;">)</span><span style="color: #808080;"> </span><span style="color: #008000;">or</span><span style="color: #808080;"> </span><span style="color: #008000;">die</span><span style="color: #808080;"> </span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: #ff0000;">Could not connect</span><span style="color: #8b0000;">&#8220;</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #0000ff;">print_r</span><span style="color: #808000;">(</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">getStats</span><span style="color: #808000;">())</span><span style="color: #808080;">;<br />
</span><span style="color: #ffa500;">/**<br />
 * Array<br />
 * (<br />
 *     [pid] =&gt; 8052<br />
 *     [uptime] =&gt; 9205<br />
 *     [time] =&gt; 1205898428<br />
 *     [version] =&gt; 1.2.5<br />
 *     [pointer_size] =&gt; 32<br />
 *     [rusage_user] =&gt; 0.008000<br />
 *     [rusage_system] =&gt; 0.000000<br />
 *     [curr_items] =&gt; 1<br />
 *     [total_items] =&gt; 17<br />
 *     [bytes] =&gt; 57<br />
 *     [curr_connections] =&gt; 2<br />
 *     [total_connections] =&gt; 15<br />
 *     [connection_structures] =&gt; 3<br />
 *     [cmd_get] =&gt; 9<br />
 *     [cmd_set] =&gt; 23<br />
 *     [get_hits] =&gt; 5<br />
 *     [get_misses] =&gt; 4<br />
 *     [evictions] =&gt; 0<br />
 *     [bytes_read] =&gt; 671<br />
 *     [bytes_written] =&gt; 850<br />
 *     [limit_maxbytes] =&gt; 10485760<br />
 *     [threads] =&gt; 1<br />
 * )<br />
 */</span><span style="color: #808080;"><br />
</span><span style="color: #0000ff;">?&gt;</span></div>
</div>
<p>Memcache::connect方法的作用是创建一个Memcache对象。Memcache::pconnect方法的作用是创建一个Memcache的持久连接对象。Memcache::close方法的作用是关闭一个Memcache对象。</p>
<p>Memcache::set方法的作用是添加一个值，Memcache::set方法有四个参数，第一个参数是key，第二个参数是value，第三个参数可选，表示是否压缩保存，第四个参数可选，用来设置一个过期自动销毁的时间。Memcache::add方法的作用和Memcache::set方法类似，区别是如果Memcache::add方法的返回值为false，表示这个key已经存在，而Memcache::set方法则会直接覆写。Memcache::get方法的作用是获取一个key值，Memcache::get方法有一个参数，表示key。Memcache::replace方法的作用是对一个已有的key进行覆写操作，Memcache::replace方法有四个参数，作用和Memcache::set方法的相同。Memcache::delete方法的作用是删除一个key值，Memcache::delete方法有两个参数，第一个参数表示key，第二个参数可选，表示删除延迟的时间。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #0000ff;">&lt;?php</span><span style="color: #808080;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;"> = </span><span style="color: #008000;">new</span><span style="color: #808080;"> </span><span style="color: #0000ff;">Memcache</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">connect</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808000;">)</span><span style="color: #808080;"> </span><span style="color: #008000;">or</span><span style="color: #808080;"> </span><span style="color: #008000;">die</span><span style="color: #808080;"> </span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: #ff0000;">Could not connect</span><span style="color: #8b0000;">&#8220;</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">set</span><span style="color: #808000;">(</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">leo</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">0</span><span style="color: #808080;">, </span><span style="color: #800000;">30</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #008000;">if</span><span style="color: #808000;">(</span><span style="color: #808080;">!</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">add</span><span style="color: #808000;">(</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">susan</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">0</span><span style="color: #808080;">, </span><span style="color: #800000;">30</span><span style="color: #808000;">))</span><span style="color: #808080;"><br />
</span><span style="color: #808000;">{</span><span style="color: #808080;"><br />
    </span><span style="color: #008000;">echo</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">susan is exist</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">;<br />
</span><span style="color: #808000;">}</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">replace</span><span style="color: #808000;">(</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">lion</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">0</span><span style="color: #808080;">, </span><span style="color: #800000;">300</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #008000;">echo</span><span style="color: #808080;"> </span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">get</span><span style="color: #808000;">(</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">delete</span><span style="color: #808000;">(</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">5</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #0000ff;">?&gt;</span></div>
</div>
<p>memcache_debug()函数的作用是控制调试功能，前提是php在编译的时候使用了–enable-debug选项，否则这个函数不会有作用。</p>
<p>Memcache::addServer方法的作用是添加一个可供使用的服务器地址，Memcache::addServer方法有8个参数，除了第一个参数意外，其他都是可选的，第一个参数表示服务器的地址，第二个参数表示端口，第三个参数表示是否是一个持久连接，第四个参数表示这台服务器在所有服务器中所占的权重，第五个参数表示连接的持续时间，第六个参数表示连接重试的间隔时间，默认为15,设置为-1表示不进行重试，第七个参数用来控制服务器的在线状态，第8个参数允许设置一个回掉函数来处理错误信息。<br />
Memcache::setServerParams方法的作用是在运行时修改服务器的参数，Memcache::setServerParams方法有六个参数，Memcache::addServer方法少了第三和第四个参数。Memcache::getServerStatus方法的作用是获取运行服务器的参数，两个参数分别表示的地址和端口。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #0000ff;">&lt;?php</span><span style="color: #808080;"><br />
</span><span style="color: #008000;">function</span><span style="color: #808080;"> </span><span style="color: #0000ff;">_callback_memcache_failure</span><span style="color: #808000;">(</span><span style="color: #00008b;">$host</span><span style="color: #808080;">, </span><span style="color: #00008b;">$port</span><span style="color: #808000;">)</span><span style="color: #808080;"> </span><span style="color: #808000;">{</span><span style="color: #808080;"><br />
    </span><span style="color: #0000ff;">print</span><span style="color: #808080;"> </span><span style="color: #8b0000;">&#8220;</span><span style="color: #ff0000;">memcache &#8216;</span><span style="color: #00008b;">$host</span><span style="color: #ff0000;">:</span><span style="color: #00008b;">$port</span><span style="color: #ff0000;">&#8216; failed</span><span style="color: #8b0000;">&#8220;</span><span style="color: #808080;">;<br />
</span><span style="color: #808000;">}</span><span style="color: #808080;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;"> = </span><span style="color: #008000;">new</span><span style="color: #808080;"> </span><span style="color: #0000ff;">Memcache</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">addServer</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">192.168.1.116</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">setServerParams</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">192.168.1.116</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808080;">, </span><span style="color: #800000;">1</span><span style="color: #808080;">, </span><span style="color: #800000;">15</span><span style="color: #808080;">, </span><span style="color: #008000;">true</span><span style="color: #808080;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">_callback_memcache_failure</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #008000;">echo</span><span style="color: #808080;"> </span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">getServerStatus</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">192.168.1.116</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #0000ff;">?&gt;</span></div>
</div>
<p>Memcache::flush方法的作用是清除所有缓存的数据，但是不会削去使用的内存空间。</p>
<p>Memcache::increment方法的作用是对保存的某个key中的值进行加法操作，Memcache::decremen方法的作用是对保存的某个key中的值进行减法操作。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #0000ff;">&lt;?php</span><span style="color: #808080;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;"> = </span><span style="color: #008000;">new</span><span style="color: #808080;"> </span><span style="color: #0000ff;">Memcache</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">connect</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">set</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">test_item</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">8</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">increment</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">test_item</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">4</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #008000;">echo</span><span style="color: #808080;"> </span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">decrement</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">test_item</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">7</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #ffa500;">// 显示 5</span><span style="color: #808080;"><br />
</span><span style="color: #0000ff;">?&gt;</span></div>
</div>
<p>setCompressThreshold方法的作用是对大于某一大小的数据进行压缩。setCompressThreshold方法有两个参数，第一个参数表示处理数据大小的临界点，第二个参数表示压缩的比例，默认为0.2。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #0000ff;">&lt;?php</span><span style="color: #808080;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;"> = </span><span style="color: #008000;">new</span><span style="color: #808080;"> </span><span style="color: #0000ff;">Memcache</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">addServer</span><span style="color: #808000;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: #ff0000;">memcache_host</span><span style="color: #8b0000;">&#8216;</span><span style="color: #808080;">, </span><span style="color: #800000;">11211</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: #808080;">-&gt;</span><span style="color: #0000ff;">setCompressThreshold</span><span style="color: #808000;">(</span><span style="color: #800000;">20000</span><span style="color: #808080;">, </span><span style="color: #800000;">0.2</span><span style="color: #808000;">)</span><span style="color: #808080;">;<br />
</span><span style="color: #0000ff;">?&gt;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/51/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP &#038; memcached 客户端[zt备份]</title>
		<link>http://www.iu1u.com/2008/07/50/</link>
		<comments>http://www.iu1u.com/2008/07/50/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 10:13:24 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=50</guid>
		<description><![CDATA[一、memcached 简介

在很多场合，我们都会听到 memcached 这个名字，但很多同学只是听过，并没有用过或实际了解过，只知道它是一个很不错的东东。这里简单介绍一下，memcached 是高效、快速的分布式内存对象缓存系统，主要用于加速 WEB 动态应用程序。

二、memcached 安装

首先是下载 memcached 了，目前最新版本是 1.1.12，直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外，memcached 用到了 libevent，我下载的是 libevent-1.1a.tar.gz。

接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装：

]]></description>
			<content:encoded><![CDATA[<p><strong><em>肖理达 (KrazyNio AT hotmail.com), 2006.04. 06, 转载请注明出处</em></strong></p>
<p><strong>一、memcached 简介</strong></p>
<p>在很多场合，我们都会听到 <a href="http://www.danga.com/memcached/">memcached</a> 这个名字，但很多同学只是听过，并没有用过或实际了解过，只知道它是一个很不错的东东。这里简单介绍一下，memcached 是高效、快速的分布式内存对象缓存系统，主要用于加速 WEB 动态应用程序。</p>
<p><strong>二、memcached 安装</strong></p>
<p>首先是下载 memcached 了，目前最新版本是 1.1.12，直接从官方网站即可下载到 <a href="http://www.danga.com/memcached/dist/memcached-1.1.12.tar.gz">memcached-1.1.12.tar.gz</a>。除此之外，memcached 用到了 <a href="http://monkey.org/~provos/libevent/">libevent</a>，我<a href="http://monkey.org/~provos/libevent-1.1a.tar.gz">下载的是 libevent-1.1a.tar.gz</a>。</p>
<p>接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装：</p>
<pre class="code" style="padding-bottom: 20px; width: 500px;"># tar -xzf libevent-1.1a.tar.gz
# cd libevent-1.1a
# ./configure --prefix=/usr
# make
# make install
# cd ..
# tar -xzf memcached-1.1.12.tar.gz
# cd memcached-1.1.12
# ./configure --prefix=/usr
# make
# make install</pre>
<p>安装完成之后，memcached 应该在 /usr/bin/memcached。</p>
<p><strong>三、运行 memcached 守护程序</strong></p>
<p>运行 memcached 守护程序很简单，只需一个命令行即可，不需要修改任何配置文件（也没有配置文件给你修改 <img class="wp-smiley" src="http://nio.infor96.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" /> ）：</p>
<pre class="code" style="padding-bottom: 20px; width: 500px;">/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd</pre>
<p>参数解释：</p>
<pre class="code" style="padding-bottom: 20px; width: 500px;">-d 以守护程序（daemon）方式运行 memcached；
-m 设置 memcached 可以使用的内存大小，单位为 M；
-l 设置监听的 IP 地址，如果是本机的话，通常可以不设置此参数；
-p 设置监听的端口，默认为 11211，所以也可以不设置此参数；
-u 指定用户，如果当前为 root 的话，需要使用此参数指定用户。</pre>
<p>当然，还有其它参数可以用，<code>man memcached</code> 一下就可以看到了。</p>
<p><strong>四、memcached 的工作原理</strong></p>
<p>首先 memcached 是以守护程序方式运行于一个或多个服务器中，随时接受客户端的连接操作，客户端可以由各种语言编写，目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后，接下来的事情就是存取对象了，每个被存取的对象都有一个唯一的标识符 key，存取操作均通过这个 key 进行，保存到 memcached 中的对象实际上是放置内存中的，并不是保存在 cache 文件中的，这也是为什么 memcached 能够如此高效快速的原因。注意，这些对象并不是持久的，服务停止之后，里边的数据就会丢失。</p>
<p><img id="image622" src="http://nio.infor96.com/wp-content/uploads/2006/11/image001.png" alt="image001.png" /></p>
<p><strong>三、PHP 如何作为 memcached 客户端</strong></p>
<p>有两种方法可以使 PHP 作为 memcached 客户端，调用 memcached 的服务进行对象存取操作。</p>
<p>第一种，PHP 有一个叫做 <a href="http://www.php.net/manual/en/ref.memcache.php">memcache 的扩展</a>，Linux 下编译时需要带上 <em>–enable-memcache[=DIR]</em> 选项，Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符，使其可用。</p>
<p>除此之外，还有一种方法，可以避开扩展、重新编译所带来的麻烦，那就是直接使用 <a href="http://wikipedia.sourceforge.net/doc/memcached-client/_includes_memcached-client_php.html">php-memcached-client</a>。</p>
<p>本文选用第二种方式，虽然效率会比扩展库稍差一些，但问题不大。</p>
<p><strong>四、PHP memcached 应用示例</strong></p>
<p>首先 <a id="p481" href="http://nio.infor96.com/wp-content/uploads/2006/04/memcached-client.zip">下载 memcached-client.php</a>，在下载了 memcached-client.php 之后，就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单，主要会用到的方法有 add()、get()、replace() 和 delete()，方法说明如下：</p>
<p><code>add ($key, $val, $exp = 0)</code><br />
往 memcached 中写入对象，$key 是对象的唯一标识符，$val 是写入的对象数据，$exp 为过期时间，单位为秒，默认为不限时间；</p>
<p><code>get ($key)</code><br />
从 memcached 中获取对象数据，通过对象的唯一标识符 $key 获取；</p>
<p><code>replace ($key, $value, $exp=0)</code><br />
使用 $value 替换 memcached 中标识符为 $key 的对象内容，参数与 add() 方法一样，只有 $key 对象存在的情况下才会起作用；</p>
<p><code>delete ($key, $time = 0)</code><br />
删除 memcached 中标识符为 $key 的对象，$time 为可选参数，表示删除之前需要等待多长时间。</p>
<p>下面是一段简单的测试代码，代码中对标识符为 &#8216;mykey&#8217; 的对象数据进行存取操作：</p>
<pre class="code" style="padding-bottom: 20px; width: 500px;"><code><span style="color: #000000;">
&lt;pre&gt;
<span style="color: #0000bb;">&lt;?php
</span><span style="color: #ff8000;">//  包含 memcached 类文件
</span><span style="color: #007700;">require_once(</span><span style="color: #dd0000;">&#8216;memcached-client.php&#8217;</span><span style="color: #007700;">);
</span><span style="color: #ff8000;">//  选项设置
</span><span style="color: #0000bb;">$options </span><span style="color: #007700;">= array(
    </span><span style="color: #dd0000;">&#8217;servers&#8217; </span><span style="color: #007700;">=&gt; array(</span><span style="color: #dd0000;">&#8216;192.168.1.1:11211&#8242;</span><span style="color: #007700;">), </span><span style="color: #ff8000;">//memcached 服务的地址、端口，可用多个数组元素表示多个 memcached 服务
    </span><span style="color: #dd0000;">&#8216;debug&#8217; </span><span style="color: #007700;">=&gt; </span><span style="color: #0000bb;">true</span><span style="color: #007700;">,  </span><span style="color: #ff8000;">//是否打开 debug
    </span><span style="color: #dd0000;">&#8216;compress_threshold&#8217; </span><span style="color: #007700;">=&gt; </span><span style="color: #0000bb;">10240</span><span style="color: #007700;">,  </span><span style="color: #ff8000;">//超过多少字节的数据时进行压缩
    </span><span style="color: #dd0000;">&#8216;persistant&#8217; </span><span style="color: #007700;">=&gt; </span><span style="color: #0000bb;">false  </span><span style="color: #ff8000;">//是否使用持久连接
    </span><span style="color: #007700;">);
</span><span style="color: #ff8000;">//  创建 memcached 对象实例
</span><span style="color: #0000bb;">$mc </span><span style="color: #007700;">= new </span><span style="color: #0000bb;">memcached</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$options</span><span style="color: #007700;">);
</span><span style="color: #ff8000;">//  设置此脚本使用的唯一标识符
</span><span style="color: #0000bb;">$key </span><span style="color: #007700;">= </span><span style="color: #dd0000;">&#8216;mykey&#8217;</span><span style="color: #007700;">;
</span><span style="color: #ff8000;">//  往 memcached 中写入对象
</span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">add</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8217;some random strings&#8217;</span><span style="color: #007700;">);
</span><span style="color: #0000bb;">$val </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">get</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">);
echo </span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">.</span><span style="color: #0000bb;">str_pad</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;$mc-&gt;add() &#8217;</span><span style="color: #007700;">, </span><span style="color: #0000bb;">60</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;_&#8217;</span><span style="color: #007700;">).</span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">;
</span><span style="color: #0000bb;">var_dump</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$val</span><span style="color: #007700;">);
</span><span style="color: #ff8000;">//  替换已写入的对象数据值
</span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">replace</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">, array(</span><span style="color: #dd0000;">&#8217;some&#8217;</span><span style="color: #007700;">=&gt;</span><span style="color: #dd0000;">&#8216;haha&#8217;</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;array&#8217;</span><span style="color: #007700;">=&gt;</span><span style="color: #dd0000;">&#8216;xxx&#8217;</span><span style="color: #007700;">));
</span><span style="color: #0000bb;">$val </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">get</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">);
echo </span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">.</span><span style="color: #0000bb;">str_pad</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;$mc-&gt;replace() &#8217;</span><span style="color: #007700;">, </span><span style="color: #0000bb;">60</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;_&#8217;</span><span style="color: #007700;">).</span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">;
</span><span style="color: #0000bb;">var_dump</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$val</span><span style="color: #007700;">);
</span><span style="color: #ff8000;">//  删除 memcached 中的对象
</span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">delete</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">);
</span><span style="color: #0000bb;">$val </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">get</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">);
echo </span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">.</span><span style="color: #0000bb;">str_pad</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;$mc-&gt;delete() &#8217;</span><span style="color: #007700;">, </span><span style="color: #0000bb;">60</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;_&#8217;</span><span style="color: #007700;">).</span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">;
</span><span style="color: #0000bb;">var_dump</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$val</span><span style="color: #007700;">);
</span><span style="color: #0000bb;">?&gt;
</span>&lt;/pre&gt;</span>
</code></pre>
<p>是不是很简单，在实际应用中，通常会把数据库查询的结果集保存到 memcached 中，下次访问时直接从 memcached 中获取，而不再做数据库查询操作，这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例（此代码片段紧接上边的示例代码）：</p>
<pre class="code" style="padding-bottom: 20px; width: 500px;"><code><span style="color: #000000;">
<span style="color: #0000bb;">&lt;?php
$sql </span><span style="color: #007700;">= </span><span style="color: #dd0000;">&#8216;SELECT * FROM users&#8217;</span><span style="color: #007700;">;
</span><span style="color: #0000bb;">$key </span><span style="color: #007700;">= </span><span style="color: #0000bb;">md5</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$sql</span><span style="color: #007700;">);   </span><span style="color: #ff8000;">//memcached 对象标识符
</span><span style="color: #007700;">if ( !(</span><span style="color: #0000bb;">$datas </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">get</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">)) ) {
    </span><span style="color: #ff8000;">//  在 memcached 中未获取到缓存数据，则使用数据库查询获取记录集。
    </span><span style="color: #007700;">echo </span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">.</span><span style="color: #0000bb;">str_pad</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Read datas from MySQL.&#8217;</span><span style="color: #007700;">, </span><span style="color: #0000bb;">60</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;_&#8217;</span><span style="color: #007700;">).</span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">;
    </span><span style="color: #0000bb;">$conn </span><span style="color: #007700;">= </span><span style="color: #0000bb;">mysql_connect</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;localhost&#8217;</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;test&#8217;</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;test&#8217;</span><span style="color: #007700;">);
    </span><span style="color: #0000bb;">mysql_select_db</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;test&#8217;</span><span style="color: #007700;">);
    </span><span style="color: #0000bb;">$result </span><span style="color: #007700;">= </span><span style="color: #0000bb;">mysql_query</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$sql</span><span style="color: #007700;">);
    while (</span><span style="color: #0000bb;">$row </span><span style="color: #007700;">= </span><span style="color: #0000bb;">mysql_fetch_object</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$result</span><span style="color: #007700;">))
        </span><span style="color: #0000bb;">$datas</span><span style="color: #007700;">[] = </span><span style="color: #0000bb;">$row</span><span style="color: #007700;">;
    </span><span style="color: #ff8000;">//  将数据库中获取到的结果集数据保存到 memcached 中，以供下次访问时使用。
    </span><span style="color: #0000bb;">$mc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">add</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$key</span><span style="color: #007700;">, </span><span style="color: #0000bb;">$datas</span><span style="color: #007700;">);
} else {
    echo </span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">.</span><span style="color: #0000bb;">str_pad</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Read datas from memcached.&#8217;</span><span style="color: #007700;">, </span><span style="color: #0000bb;">60</span><span style="color: #007700;">, </span><span style="color: #dd0000;">&#8216;_&#8217;</span><span style="color: #007700;">).</span><span style="color: #dd0000;">&#8220;n&#8221;</span><span style="color: #007700;">;
}
</span><span style="color: #0000bb;">var_dump</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$datas</span><span style="color: #007700;">);
</span><span style="color: #0000bb;">?&gt;</span>
</span>
</code></pre>
<p>可以看出，使用 memcached 之后，可以减少数据库连接、查询操作，数据库负载下来了，脚本的运行速度也提高了。</p>
<p>之前我曾经写过一篇名为<a href="http://nio.infor96.com/sharing-php-session-data-between-servers/">《PHP 实现多服务器共享 SESSION 数据》</a>文章，文中的 SESSION 是使用数据库保存的，在并发访问量大的时候，服务器的负载会很大，经常会超出 MySQL 最大连接数，利用 memcached，我们可以很好地解决这个问题，工作原理如下：</p>
<ul>
<li>用户访问网页时，查看 memcached 中是否有当前用户的 SESSION 数据，使用 session_id() 作为唯一标识符；如果数据存在，则直接返回，如果不存在，再进行数据库连接，获取 SESSION 数据，并将此数据保存到 memcached 中，供下次使用；</li>
<li>当前的 PHP 运行结束（或使用了 <a href="http://php.liukang.com/manual/en/function.session-write-close.php">session_write_close()</a>）时，会调用 My_Sess::write() 方法，将数据写入数据库，这样的话，每次仍然会有数据库操作，对于这个方法，也需要进行优化。使用一个全局变量，记录用户进入页面时的 SESSION 数据，然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同，不同才进行数据库连接、写入数据库，同时将 memcached 中对应的对象删除，如果相同的话，则表示 SESSION 数据未改变，那么就可以不做任何操作，直接返回了；</li>
<li>那么用户 SESSION 过期时间怎么解决呢？记得 memcached 的 add() 方法有个过期时间参数 $exp 吗？把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长，这个可以在 write() 方法中解决，通过判断时间，符合条件则更新数据库数据。</li>
</ul>
<p><strong>五、相关资源</strong></p>
<ul>
<li><a href="http://www.danga.com/memcached/">memcached 官方网站</a></li>
<li><a href="http://wikipedia.sourceforge.net/doc/memcached-client/_includes_memcached-client_php.html">PHP memcached client</a></li>
<li><a href="http://nio.infor96.com/wp-content/uploads/2006/04/memcached-client.zip">下载 memcached-client.php</a></li>
</ul>
<p><!-- You can start editing here. --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/50/feed/</wfw:commentRss>
		</item>
		<item>
		<title>libeven、memcached、libmemcache安装 [zt备份]</title>
		<link>http://www.iu1u.com/2008/07/49/</link>
		<comments>http://www.iu1u.com/2008/07/49/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 10:12:39 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=49</guid>
		<description><![CDATA[ 前端时间玩了一下memcached，由于工作关系得过一段时间在玩它。哎，工作就是这样，老变！

    libeven

    memcached的使用需要libeven的支持，我们得先装上libeven。
    官方网站：http://www.monkey.org/~provos/libevent/
    下载地址：http://www.monkey.org/~provos/libevent-1.4.0-beta.tar.gz
    libevent安装方式比较简单:

...]]></description>
			<content:encoded><![CDATA[<p>    前端时间玩了一下memcached，由于工作关系得过一段时间在玩它。哎，工作就是这样，老变！</p>
<p>    <strong>libeven</strong></p>
<p>    memcached的使用需要libeven的支持，我们得先装上libeven。<br />
    官方网站：<a href="http://www.monkey.org/~provos/libevent/">http://www.monkey.org/~provos/libevent/</a><br />
    下载地址：<a href="http://www.monkey.org/~provos/libevent-1.4.0-beta.tar.gz">http://www.monkey.org/~provos/libevent-1.4.0-beta.tar.gz</a><br />
    libevent安装方式比较简单:</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
./configure &amp;&amp; make<br />
make install</td>
</tr>
</tbody>
</table>
<p>    这样就好</p>
<p>    检查如下：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
[root@localhost memcached-1.2.2]# ls -l /usr/local/lib/ | grep even<br />
lrwxrwxrwx   1 root root      21 Nov 26 11:32 libevent-1.4.so.2 -&gt; libevent-1.4.so.2.0.0<br />
-rwxr-xr-x   1 root root  267334 Nov 26 11:32 libevent-1.4.so.2.0.0<br />
-rw-r&#8211;r&#8211;   1 root root  351694 Nov 26 11:32 libevent.a<br />
lrwxrwxrwx   1 root root      26 Nov 26 11:32 libevent_core-1.4.so.2 -&gt; libevent_core-1.4.so.2.0.0<br />
-rwxr-xr-x   1 root root  101485 Nov 26 11:32 libevent_core-1.4.so.2.0.0<br />
-rw-r&#8211;r&#8211;   1 root root  139080 Nov 26 11:32 libevent_core.a<br />
-rwxr-xr-x   1 root root     866 Nov 26 11:32 libevent_core.la<br />
lrwxrwxrwx   1 root root      26 Nov 26 11:32 libevent_core.so -&gt; libevent_core-1.4.so.2.0.0<br />
lrwxrwxrwx   1 root root      27 Nov 26 11:32 libevent_extra-1.4.so.2 -&gt; libevent_extra-1.4.so.2.0.0<br />
-rwxr-xr-x   1 root root  214596 Nov 26 11:32 libevent_extra-1.4.so.2.0.0<br />
-rw-r&#8211;r&#8211;   1 root root  273270 Nov 26 11:32 libevent_extra.a<br />
-rwxr-xr-x   1 root root     873 Nov 26 11:32 libevent_extra.la<br />
lrwxrwxrwx   1 root root      27 Nov 26 11:32 libevent_extra.so -&gt; libevent_extra-1.4.so.2.0.0<br />
-rwxr-xr-x   1 root root     831 Nov 26 11:32 libevent.la<br />
lrwxrwxrwx   1 root root      21 Nov 26 11:32 libevent.so -&gt; libevent-1.4.so.2.0.0</td>
</tr>
</tbody>
</table>
<p>    看见有很多libevent，就可以放心了。</p>
<p>    <strong>memcached</strong></p>
<p>    官方网站：<a href="http://www.danga.com/memcached/download.bml">http://www.danga.com/memcached/download.bml</a><br />
    下载地址：<a href="http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz">http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz</a></p>
<p>    memcached安装需要些参数:</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
./configure &#8211;prefix=/usr/local/memcached &#8211;with-libevent=/usr/local<br />
make<br />
make install</td>
</tr>
</tbody>
</table>
<p>   我们来运行看看：<br />
   运行：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
/usr/local/memcached/bin/memcached -d -m 10 -p 11211 -u root</td>
</tr>
</tbody>
</table>
<p>    结果：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
[root@localhost memcached-1.2.2]# /usr/local/memcached/bin/memcached -d -m 10 -p 11211 -u root<br />
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory</td>
</tr>
</tbody>
</table>
<p>    查找原因，解决方案如下：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
LD_DEBUG=libs /usr/local/memcached/bin/memcached -v</td>
</tr>
</tbody>
</table>
<p>    有如下显示：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
[root@localhost memcached-1.2.2]# LD_DEBUG=libs /usr/local/memcached/bin/memcached -v<br />
     18999:     find library=libevent-1.4.so.2 [0]; searching<br />
     18999:      search cache=/etc/ld.so.cache<br />
     18999:      search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib/sse2:/lib:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i686:/usr/lib/sse2:/usr/lib          (system search path)<br />
     18999:       trying file=/lib/tls/i686/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/lib/tls/i686/libevent-1.4.so.2<br />
     18999:       trying file=/lib/tls/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/lib/tls/libevent-1.4.so.2<br />
     18999:       trying file=/lib/i686/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/lib/i686/libevent-1.4.so.2<br />
     18999:       trying file=/lib/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/lib/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/tls/i686/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/tls/i686/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/tls/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/tls/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/i686/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/i686/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/sse2/libevent-1.4.so.2<br />
     18999:       trying file=/usr/lib/libevent-1.4.so.2<br />
     18999:<br />
<span style="color: #0909f7;">/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory</span></td>
</tr>
</tbody>
</table>
<p>    主要是看最后一行提示的错误，那么我们：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2</td>
</tr>
</tbody>
</table>
<p>    OK!再次运行：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
/usr/local/memcached/bin/memcached -d -m 10 -p 11211 -u root</td>
</tr>
</tbody>
</table>
<p>    成功！</p>
<p>    貌似用“ldconfig”也可以解决这个问题</p>
<p>    <strong> libmemcache</strong>   </p>
<p>    libmemcache是memcached C的客户端之一。我准备使用这个玩意。<br />
    官网：<a href="http://people.freebsd.org/~seanc/libmemcache/">http://people.freebsd.org/~seanc/libmemcache/</a><br />
    下载：<a href="http://people.freebsd.org/~seanc/libmemcache/libmemcache-1.4.0.rc2.tar.bz2">http://people.freebsd.org/~seanc/libmemcache/libmemcache-1.4.0.rc2.tar.bz2</a><br />
    编译：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
./configure<br />
make<br />
make install</td>
</tr>
</tbody>
</table>
<p>     写一个有libmemcache函数的程序<br />
     然后    </p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
gcc a.c -o a.cgi -L/usr/local/include -lmemcache</td>
</tr>
</tbody>
</table>
<p>    运行</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
./a.cgi</td>
</tr>
</tbody>
</table>
<p>    提示类似上面的“error while loading shared libraries”的错误，查了一下可用&#8221;ldconfig&#8221;解决这个问题，那上面的可否用这个命令解决呢？</p>
<p>    上面的gcc编译的时候，带有参数“-lmemcache”。<br />
    -l参数后面跟的库名有规则的，库的命名方式有libxxxx.so或libxxxx.a，编译时要用-lxxxx就可以了。<br />
    而“-l”的意思就是代表是个“lib”了。</p>
<p>    所以在你自己编写动态库或者静态库时，命名还是得按照 libxxxx.so的形式来。</p>
<p>    不得不认为libmemcache有点糟糕，编译它自带的一个程序编译竟然有问题，很无语！</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
[root@login benchmark]# gcc benchmark.c -L/usr/local/include -lmemcache<br />
benchmark.c: In function `main&#8217;:<br />
benchmark.c:100: warning: passing arg 2 of `mc_set&#8217; discards qualifiers from pointer target type<br />
benchmark.c:108: warning: passing arg 2 of `mc_set&#8217; discards qualifiers from pointer target type<br />
benchmark.c:121: warning: passing arg 2 of `mc_req_add&#8217; discards qualifiers from pointer target type<br />
benchmark.c:145: warning: passing arg 2 of `mc_delete&#8217; discards qualifiers from pointer target type<br />
benchmark.c:153: warning: passing arg 2 of `mc_add&#8217; discards qualifiers from pointer target type<br />
benchmark.c:167: warning: passing arg 2 of `mc_delete&#8217; discards qualifiers from pointer target type</td>
</tr>
</tbody>
</table>
<p>    解决方法：</p>
<p>    找到passing arg 2这个参数的定义：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
const char *key;</td>
</tr>
</tbody>
</table>
<p>    把const去了：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
char *key;</td>
</tr>
</tbody>
</table>
<p>    这样就好了！</p>
<p>    然后：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
[root@login memcache-test]# ./a.out</td>
</tr>
</tbody>
</table>
<p>    执行时可能报以下的错误：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3"><span style="font-weight: bold;">以下是引用片段：</span><br />
./a.out: error while loading shared libraries: libmemcache.so.0: cannot open shared object file: No such file or directory</td>
</tr>
</tbody>
</table>
<p>    解决方法：</p>
<p>    执行ldconfig命令即可！<br />
    <strong>附：</strong></p>
<p>    <a href="http://kapoc.blogdriver.com/kapoc/1200549.html">http://kapoc.blogdriver.com/kapoc/1200549.html</a><br />
    ldconfig命令 - - 动态链接库管理命令</p>
<p>    为了让动态链接库为系统所共享,还需运行动态链接库的管理命令&#8211;ldconfig.此执行程序存放在/sbin目录下.</p>
<p>    ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.</p>
<p>    ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/49/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MemCached安装手记，记录一些注意事项</title>
		<link>http://www.iu1u.com/2008/07/48/</link>
		<comments>http://www.iu1u.com/2008/07/48/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 10:11:02 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

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

		<guid isPermaLink="false">http://www.iu1u.com/?p=48</guid>
		<description><![CDATA[注：使用起来很直观的东西，安装起来确实有点比较费劲。涉及到的名词比较多
1.Memcached分为服务器端和客户端，服务器端需要先安装Libevent,然后make install。需要一部额外操作ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2。 参考文章：http://yayu.org/look.php?id=105
2. 我用的是php5，memcache的客户端有两种，第一种是php的模块方式，第二种是php外部文件库方式。使用第二种相对比较简单，只要memcached的服务器跑起来了就没有问题。但是貌似性能会稍微差点，方法可以参考：http://nio.infor96.com/php-memcached/
3. 我在调通了第二种客户端方式以后，继续调php模块的方式，在这里可以下载http://pecl.php.net/package/memcache，为了省事，直接下载stable版本的memcache-2.2.3.tgz，结果反而都最后的最后，运行php.exe时，提示我说&#8230;(那句错误信息找不着了)，总之就是加载memcache.so错误，查了半天，发现是一个bug，在最新的memcache-3.0.1.tgz 里已经修复了。注意，这个包也是需要make的，但是没有configure文件，怎么办呢，先之星phpize就可以生成那些编译信息了。然后
#./configure &#8211;with-apxs=/usr/local/apache/bin/apxs &#8211;enable-memcache 即可。
3. 一些使用技巧，参考Memcache的备忘
顺便把上面的提到的文章备份起来，省得以后失效了。
其他tip，顺便记下：
清空cache： echo ”flush_all” &#124; nc localhost 11211
 
]]></description>
			<content:encoded><![CDATA[<p>注：使用起来很直观的东西，安装起来确实有点比较费劲。涉及到的名词比较多</p>
<p>1.Memcached分为服务器端和客户端，服务器端需要先安装Libevent,然后make install。需要一部额外操作<span style="color: #0000ff;">ln</span><span style="color: #808080;"> -</span><span style="color: #0000ff;">s</span><span style="color: #808080;"> /</span><span style="color: #0000ff;">usr</span><span style="color: #808080;">/</span><span style="color: #0000ff;">local</span><span style="color: #808080;">/</span><span style="color: #0000ff;">lib</span><span style="color: #808080;">/</span><span style="color: #0000ff;">libevent</span><span style="color: #808080;">-</span><span style="color: #800000;">1.4</span><span style="color: #808080;">.</span><span style="color: #0000ff;">so</span><span style="color: #800000;">.2</span><span style="color: #808080;"> /</span><span style="color: #0000ff;">usr</span><span style="color: #808080;">/</span><span style="color: #0000ff;">lib</span><span style="color: #808080;">/</span><span style="color: #0000ff;">libevent</span><span style="color: #808080;">-</span><span style="color: #800000;">1.4</span><span style="color: #808080;">.</span><span style="color: #0000ff;">so</span><span style="color: #800000;">.2。 </span>参考文章：<a href="http://yayu.org/look.php?id=105">http://yayu.org/look.php?id=105</a></p>
<p>2. 我用的是php5，memcache的客户端有两种，第一种是php的模块方式，第二种是php外部文件库方式。使用第二种相对比较简单，只要memcached的服务器跑起来了就没有问题。但是貌似性能会稍微差点，方法可以参考：<a href="http://nio.infor96.com/php-memcached/">http://nio.infor96.com/php-memcached/</a></p>
<p>3. 我在调通了第二种客户端方式以后，继续调php模块的方式，在这里可以下载<a href="http://pecl.php.net/package/memcache">http://pecl.php.net/package/memcache</a>，为了省事，直接下载stable版本的<a href="http://www.iu1u.com/get/memcache-2.2.3.tgz">memcache-2.2.3.tgz</a>，结果反而都最后的最后，运行php.exe时，提示我说&#8230;(那句错误信息找不着了)，总之就是加载memcache.so错误，查了半天，发现是一个bug，在最新的<a href="http://www.iu1u.com/get/memcache-3.0.1.tgz">memcache-3.0.1.tgz</a> 里已经修复了。注意，这个包也是需要make的，但是没有configure文件，怎么办呢，先之星phpize就可以生成那些编译信息了。然后<br />
#./configure &#8211;with-apxs=/usr/local/apache/bin/apxs &#8211;enable-memcache 即可。</p>
<p>3. 一些使用技巧，参考<a title="Permanent link to Memcache的备忘" rel="bookmark" href="http://www.ooso.net/index.php/archives/428">Memcache的备忘</a></p>
<p>顺便把上面的提到的文章备份起来，省得以后失效了。</p>
<p>其他tip，顺便记下：</p>
<p>清空cache： echo ”flush_all” | nc localhost 11211</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/48/feed/</wfw:commentRss>
		</item>
		<item>
		<title>门户社区忙着改版迎接开放</title>
		<link>http://www.iu1u.com/2008/07/47/</link>
		<comments>http://www.iu1u.com/2008/07/47/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 08:17:50 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<category><![CDATA[开放平台]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=47</guid>
		<description><![CDATA[各个门户社区现在正在忙着往sns的方式方式改。sohu也是在原来的博客里面硬塞进去了一个“我的空间”，用来存放feed。今天登录了一下，发现通知等也加上了，好友也要验证了（原来是单向的）。
funy担心这些门户虽然人气搞，但是朋友关系都较弱，不具备开放平台的条件。我觉得，feed不管对于强关系还是弱关系，都多了一条特别便捷的扩展视野的方式。feed不仅是用来保持和好友紧密联系关系的方式，还是一个扩张关系的方式。Feed本身整合多元数据的能力，让了解朋友的成本变得很低。举例，sohu的好友，大部分我也不认识，交流也不多，但我也习惯看它的feed，也总能从feed里点出很多东西看。
另外，应用里更流行的一些just for fun的东西，这些东西，我觉得不管是什么好友关系，是从很信任的同学还是一个很普通的网友里看到的，不是那么重要。:)
]]></description>
			<content:encoded><![CDATA[<div class="content">各个门户社区现在正在忙着往sns的方式方式改。sohu也是在原来的博客里面硬塞进去了一个“我的空间”，用来存放feed。今天登录了一下，发现通知等也加上了，好友也要验证了（原来是单向的）。</p>
<p>funy担心这些门户虽然人气搞，但是朋友关系都较弱，不具备开放平台的条件。我觉得，feed不管对于强关系还是弱关系，都多了一条特别便捷的扩展视野的方式。feed不仅是用来保持和好友紧密联系关系的方式，还是一个扩张关系的方式。Feed本身整合多元数据的能力，让了解朋友的成本变得很低。举例，sohu的好友，大部分我也不认识，交流也不多，但我也习惯看它的feed，也总能从feed里点出很多东西看。</p>
<p>另外，应用里更流行的一些just for fun的东西，这些东西，我觉得不管是什么好友关系，是从很信任的同学还是一个很普通的网友里看到的，不是那么重要。:)</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/47/feed/</wfw:commentRss>
		</item>
		<item>
		<title>56昨天恢复上线了</title>
		<link>http://www.iu1u.com/2008/07/46/</link>
		<comments>http://www.iu1u.com/2008/07/46/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 17:04:19 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<category><![CDATA[胡说八道]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=46</guid>
		<description><![CDATA[本来传闻56打算转型做应用开发了。突然又复活了，还号称被火星人截获了 ，回到地球了。被某人知道这么影射他，又要找机会掐你一顿。
多少也算一件事，记录一下吧。
]]></description>
			<content:encoded><![CDATA[<p>本来传闻56打算转型做应用开发了。突然又复活了，还号称被火星人截获了 ，回到地球了。被某人知道这么影射他，又要找机会掐你一顿。</p>
<p>多少也算一件事，记录一下吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/46/feed/</wfw:commentRss>
		</item>
		<item>
		<title>开放平台之MYOP</title>
		<link>http://www.iu1u.com/2008/07/44/</link>
		<comments>http://www.iu1u.com/2008/07/44/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 04:56:18 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<category><![CDATA[开放平台]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=44</guid>
		<description><![CDATA[校内的官方开发者群组基本上都是开发者在支撑。官方只提供了java开发库，php是有钟士杰，ror开发库是有david提供的。现在倒好，霸王条款出来了，囚徒都没有困境了，就是把牢底坐穿了，我也不招。开发者走了，已久没有官方眷顾的开发者群组继续冷清，一些刚来的新手们，在里面嗷嗷待“辅”，也只能嗷嗷待嗷了。
 
这么放，MYOP很有做生态链的态度。要站长PV给他，开发者提供软硬件资源和创意，嵌个页面10%以内的广告，分给他。兵马未动，粮草先行。uch1.5还没发布，支持uch1.5的站点还没几个。但是无论从开发库，还是文档，getting started，Hello world&#8230; 都是很完善的。我把一个现有的app，转到myop，几分钟就搞定了。Myop用的也是和facebook类似的接口形式。(偶曾经说过，facebook的应用转到xn很难，因为要砍掉很多东西，找其他的实现方式，xn的app转到facebook很容易，转到myop也挺容易的。)
 
康盛真正开源的产品里，还是有不少追随者的，dz的hack版，虽然方式很不好。就算拿到一个人家贡献的很好的hack，要安装到自己的论坛里，都需要一遍重复的调试过程。相比之下，只要站长这边心态摆正了，myop这种方式，是一种复用性很高的方式。
 
好，经典的show me the money问题。目前按康盛的说法，貌似应用里的广告不超过10%都归开发者，框架外的归站长。康盛有这样的心态，等uch1.5发布以后，就算大牛david不出手，也会有大批虾兵蟹将上去鼓捣的。
 
 
 
]]></description>
			<content:encoded><![CDATA[<p>校内的官方开发者群组基本上都是开发者在支撑。官方只提供了java开发库，php是有钟士杰，ror开发库是有david提供的。现在倒好，霸王条款出来了，囚徒都没有困境了，就是把牢底坐穿了，我也不招。开发者走了，已久没有官方眷顾的开发者群组继续冷清，一些刚来的新手们，在里面嗷嗷待“辅”，也只能嗷嗷待嗷了。</p>
<p> </p>
<p>这么放，MYOP很有做生态链的态度。要站长PV给他，开发者提供软硬件资源和创意，嵌个页面10%以内的广告，分给他。兵马未动，粮草先行。uch1.5还没发布，支持uch1.5的站点还没几个。但是无论从开发库，还是文档，getting started，Hello world&#8230; 都是很完善的。我把一个现有的app，转到myop，几分钟就搞定了。Myop用的也是和facebook类似的接口形式。(偶曾经说过，facebook的应用转到xn很难，因为要砍掉很多东西，找其他的实现方式，xn的app转到facebook很容易，转到myop也挺容易的。)</p>
<p> </p>
<p>康盛真正开源的产品里，还是有不少追随者的，dz的hack版，虽然方式很不好。就算拿到一个人家贡献的很好的hack，要安装到自己的论坛里，都需要一遍重复的调试过程。相比之下，只要站长这边心态摆正了，myop这种方式，是一种复用性很高的方式。</p>
<p> </p>
<p>好，经典的show me the money问题。目前按康盛的说法，貌似应用里的广告不超过10%都归开发者，框架外的归站长。康盛有这样的心态，等uch1.5发布以后，就算大牛david不出手，也会有大批虾兵蟹将上去鼓捣的。</p>
<p> </p>
<p> </p>
<p> <img class="blogimg" src="http://photo.hainei.com/b0/00/fv/h111294.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/44/feed/</wfw:commentRss>
		</item>
		<item>
		<title>智猪博弈、囚徒困境与开放平台</title>
		<link>http://www.iu1u.com/2008/07/43/</link>
		<comments>http://www.iu1u.com/2008/07/43/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 11:54:24 +0000</pubDate>
		<dc:creator>stone</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<category><![CDATA[校内 开放平台 51 widget]]></category>

		<guid isPermaLink="false">http://www.iu1u.com/?p=43</guid>
		<description><![CDATA[都说08年，是开放年。
但是开放平台在中国貌似总走的不太顺利。之前的sohu,myspace就不扯了，说说最近大家比较关注的校内和51吧。
校内最早是王兴借鉴facebook的概念引入国内的，所以，开放平台在facebook这样的SNS上是很成功的，因为他们能提供应用成长的突然，病毒传播机制。其实病毒传播并不是贬义词，和流氓是两回事，是基于信任的好友关系的，有选择的传播。最近大家都在看校内和51，因为他们具备这样的土壤。
现在的态势很微妙，对博弈论不是很熟，但是尝试用它演绎一下，抛砖引玉。关于相关的理论知识，我也搞不清，大家自己去读股市。
开放平台和开发者群体的关系——智猪博弈：
（平台是小猪，开发者是大猪。做还是不做？）
理想的情况下是，开放平台和开发者按照一个公平的游戏规则合作，共赢。但是呢，在某些情况下，只有你一家可以用，那么你做不做。做吧，就按照我定的规则，虽然是不公平嘛，不做的话，你就一点都没得吃；做的话，你至少还有点饭吃。有一点是一点嘛，于是大家开始帮校内测试开始就很不稳定的接口，忍受接口持续变动的痛苦。
补充：即使这个过程中，校内特别不配合，对于开发者提出的很多问题，很少回应甚至不回应。api错了，文档错了，没有回应，最终有开发者自己乱试，试出那个参数应该那么写。这里类比的地方在于，本来这个接口应该双方一起完善的，(两只猪一起去踩踏板吃饭)，但是因为环境形式，小猪校内不踩踏板，你们开发者这段时间也没有什么好玩的开放平台，你们要吃饭，就去踩踏板，帮我测试接口）
开发者群体之间的博弈——囚徒困境：
（开发者是囚徒，招还是不招，做还是不做）
囚徒们理想的情况下，都不招，最后都能得到最都的好处，判最少的刑，2年。但是在无法串供的情况下，自利的囚徒都招了，都被判了5年。
开发者们面对对自己极为不理的游戏规则，要是都不做，给平台谈条件，都有好处。但是现实中也不可能。我要是不做，别人要是去做呢，虽然游戏规则对我们很不利，但是，现做的总是有利，有先发优势的，于是。。。(都给我判5年)，这里的两个囚徒是开发者中的个体。
瞎扯完毕，表扬一下51的康泰克，多可爱啊：
“放心，只要我在这里做一天事，我就不会容许这种事情发生的。”
“如果事情出了我的控制之外了，我会以死抗争的，呵呵:) ”

相关阅读：
校内开放api平台发布会及校内网开放平台开发者协议讨论（凌乱无整理版）
http://www.hainei.com/blog?r[0]=166724&#38;r[1]=115253
校内为什么不能是百度和腾讯2nd ？李大维同学在国内白忙活
http://www.hainei.com/blog?r[0]=166740&#38;r[1]=126439&#38;fr=nf
签个卖身契至少有主人养，签了&#8221;校内网开放平台开发者协议&#8221;后呢？
http://www.hainei.com/blog?r[0]=166722&#38;r[1]=230840
]]></description>
			<content:encoded><![CDATA[<p>都说08年，是开放年。</p>
<p>但是开放平台在中国貌似总走的不太顺利。之前的sohu,myspace就不扯了，说说最近大家比较关注的校内和51吧。</p>
<p>校内最早是王兴借鉴facebook的概念引入国内的，所以，开放平台在facebook这样的SNS上是很成功的，因为他们能提供应用成长的突然，病毒传播机制。其实病毒传播并不是贬义词，和流氓是两回事，是基于信任的好友关系的，有选择的传播。最近大家都在看校内和51，因为他们具备这样的土壤。</p>
<p>现在的态势很微妙，对博弈论不是很熟，但是尝试用它演绎一下，抛砖引玉。关于相关的理论知识，我也搞不清，大家自己去读股市。</p>
<p>开放平台和开发者群体的关系——<strong>智猪博弈</strong>：</p>
<p>（平台是小猪，开发者是大猪。做还是不做？）</p>
<p>理想的情况下是，开放平台和开发者按照一个公平的游戏规则合作，共赢。但是呢，在某些情况下，只有你一家可以用，那么你做不做。做吧，就按照我定的规则，虽然是不公平嘛，不做的话，你就一点都没得吃；做的话，你至少还有点饭吃。有一点是一点嘛，于是大家开始帮校内测试开始就很不稳定的接口，忍受接口持续变动的痛苦。</p>
<p><span style="color: #008000;">补充：即使这个过程中，校内特别不配合，对于开发者提出的很多问题，很少回应甚至不回应。api错了，文档错了，没有回应，最终有开发者自己乱试，试出那个参数应该那么写。这里类比的地方在于，本来这个接口应该双方一起完善的，(两只猪一起去踩踏板吃饭)，但是因为环境形式，小猪校内不踩踏板，你们开发者这段时间也没有什么好玩的开放平台，你们要吃饭，就去踩踏板，帮我测试接口）</span></p>
<p>开发者群体之间的博弈——<strong>囚徒困境</strong>：</p>
<p>（开发者是囚徒，招还是不招，做还是不做）</p>
<p>囚徒们理想的情况下，都不招，最后都能得到最都的好处，判最少的刑，2年。但是在无法串供的情况下，自利的囚徒都招了，都被判了5年。</p>
<p>开发者们面对对自己极为不理的游戏规则，要是都不做，给平台谈条件，都有好处。但是现实中也不可能。我要是不做，别人要是去做呢，虽然游戏规则对我们很不利，但是，现做的总是有利，有先发优势的，于是。。。(都给我判5年)，<span style="color: #008000;">这里的两个囚徒是开发者中的个体</span>。</p>
<p>瞎扯完毕，表扬一下51的康泰克，多可爱啊：</p>
<p>“放心，只要我在这里做一天事，我就不会容许这种事情发生的。”</p>
<p>“如果事情出了我的控制之外了，我会以死抗争的，呵呵:) ”</p>
<p><img class="blogimg" src="http://photo.hainei.com/b0/00/ft/mt11288.jpg" alt="" /></p>
<p>相关阅读：</p>
<p>校内开放api平台发布会及校内网开放平台开发者协议讨论（凌乱无整理版）</p>
<p><a href="http://www.hainei.com/blog?r[0]=166724&amp;r[1]=115253" target="_blank"><span style="color: #0066cc;">http://www.hainei.com/blog?r[0]=166724&amp;r[1]=115253</span></a></p>
<p>校内为什么不能是百度和腾讯2nd ？李大维同学在国内白忙活</p>
<p><a href="http://www.hainei.com/blog?r[0]=166740&amp;r[1]=126439&amp;fr=nf" target="_blank"><span style="color: #0066cc;">http://www.hainei.com/blog?r[0]=166740&amp;r[1]=126439&amp;fr=nf</span></a></p>
<p>签个卖身契至少有主人养，签了&#8221;校内网开放平台开发者协议&#8221;后呢？</p>
<p><a href="http://www.hainei.com/blog?r[0]=166722&amp;r[1]=230840" target="_blank"><span style="color: #0066cc;">http://www.hainei.com/blog?r[0]=166722&amp;r[1]=230840</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iu1u.com/2008/07/43/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
