<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[张宴的博客]]></title> 
<link>http://blog.s135.com/index.php</link> 
<description><![CDATA[Web系统架构与底层研发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[张宴的博客]]></copyright>
<item>
<link>http://blog.s135.com/qingdao/</link>
<title><![CDATA[4月8日，青岛，那些旧战机、潜艇和驱逐舰]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[生活琐事]]></category>
<pubDate>Tue, 10 Apr 2012 16:03:59 +0000</pubDate> 
<guid>http://blog.s135.com/qingdao/</guid> 
<description>
<![CDATA[ 
	　　三顾青岛，著名的景点在第一次来青岛时，都去过了。等车之余，看了看那些旧战机、潜艇和驱逐舰。<br/><br/>　　<a href="http://blog.s135.com/attachment/201204/qingdao/801.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/qingdao/801.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　歼7战机<br/><br/>　　<a href="http://blog.s135.com/attachment/201204/qingdao/802.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/qingdao/802.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　歼6甲战机<br/><br/>　　<a href="http://blog.s135.com/attachment/201204/qingdao/803.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/qingdao/803.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/%25E9%259D%2592%25E5%25B2%259B/" rel="tag">青岛</a> , <a href="http://blog.s135.com/tags/%25E6%25B5%25B7%25E5%2586%259B/" rel="tag">海军</a> , <a href="http://blog.s135.com/tags/%25E9%25A3%259E%25E6%259C%25BA/" rel="tag">飞机</a> , <a href="http://blog.s135.com/tags/%25E6%25BD%259C%25E8%2589%2587/" rel="tag">潜艇</a> , <a href="http://blog.s135.com/tags/%25E5%2586%259B%25E8%2588%25B0/" rel="tag">军舰</a> , <a href="http://blog.s135.com/tags/%25E9%25A9%25B1%25E9%2580%2590%25E8%2588%25B0/" rel="tag">驱逐舰</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/jiaonan/</link>
<title><![CDATA[4月7日，青岛胶南，那片海、那间房、那座城]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[生活琐事]]></category>
<pubDate>Tue, 10 Apr 2012 16:01:45 +0000</pubDate> 
<guid>http://blog.s135.com/jiaonan/</guid> 
<description>
<![CDATA[ 
	　　1、早上07:10，北京南站出发，D331，中午12:22，走出青岛火车站。<br/>　　2、胶州湾海底隧道通车之后，交通便利多了，从【青岛火车站（广西路）】坐“隧道5路/隧道6路/隧道7路”到【灵山卫公交枢纽站】。<br/>　　3、从【灵山卫公交枢纽站】坐“胶南303路”到“胶南市”。<br/><br/>　　<a href="http://blog.s135.com/attachment/201204/qingdao/701.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/qingdao/701.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201204/qingdao/702.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/qingdao/702.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201204/qingdao/705.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/qingdao/705.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>............<br/>
]]>
</description>
</item><item>
<link>http://blog.s135.com/house_decoration/</link>
<title><![CDATA[新房终于装修完了，列出各房间照片和装修费用清单]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[心情随笔]]></category>
<pubDate>Wed, 04 Apr 2012 16:07:24 +0000</pubDate> 
<guid>http://blog.s135.com/house_decoration/</guid> 
<description>
<![CDATA[ 
	　　位于北京昌平区白浮泉路的<a href="http://blog.s135.com/buy_house/" target="_blank">龙山华府新房</a>终于装修完了。有了<a href="http://blog.s135.com/sogou_map/" target="_blank">之前卖掉的那个小房子</a>的装修经验，这次装修该买什么的东西、怎样的顺序、时间安排，一切都顺利按计划进行。<br/><br/>　　<strong>一、客厅：</strong><br/><br/>　　<a href="http://blog.s135.com/attachment/201204/house/kt1.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/house/kt1.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　客厅全貌<br/><br/>　　<a href="http://blog.s135.com/attachment/201204/house/kt2.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/house/kt2.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　电视墙<br/><br/>　　<a href="http://blog.s135.com/attachment/201204/house/kt3.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201204/house/kt3.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　沙发<br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/%25E8%25A3%2585%25E4%25BF%25AE/" rel="tag">装修</a> , <a href="http://blog.s135.com/tags/%25E6%2596%25B0%25E6%2588%25BF/" rel="tag">新房</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/android_ios_status/</link>
<title><![CDATA[一些数据：移动iPhone用户超联通两倍，Android用户小米手机占有率第一]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[移动互联网与手机]]></category>
<pubDate>Thu, 23 Feb 2012 05:24:55 +0000</pubDate> 
<guid>http://blog.s135.com/android_ios_status/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2012.02.23 转载请注明原文链接：<a href="http://blog.s135.com/android_ios_status/" target="_blank">http://blog.s135.com/android_ios_status/</a>]<br/><br/>　　上周，我们发布了一款支持 Android 和 iOS 平台手机应用。本周，又发布了另一款手机应用的 iOS 版本。纵贯两款应用的统计数据，发现有两点出乎我的意料。<br/><br/>　　<strong>1、iOS 应用状况：移动iPhone用户超联通两倍，WIFI 联网方式接近 75%</strong><br/><br/>　　我曾经一直以为在 iPhone 4/4S 用户中，中国联通的用户要比中国移动多，毕竟联通是苹果合作伙伴，联通卡是3G网络，而移动卡的国产TD-SCDMA iPhone不支持，只能使用2G网络。但经过最近一星期发布的两款手机应用（均有 iOS、Android 版本）的统计数据发现，iPhone 里插着中国移动2G卡的用户比中国联通3G用户多两倍。因此，将来针对移动互联网 IDC 机房的选择与优化，也需要偏向中国移动网络。<br/><br/>　　<a href="http://blog.s135.com/attachment/201202/tongji/ios_yys.png" target="_blank"><img src="http://blog.s135.com/attachment/201202/tongji/ios_yys.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　<a href="http://blog.s135.com/attachment/201202/tongji/ios_lw.png" target="_blank"><img src="http://blog.s135.com/attachment/201202/tongji/ios_lw.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　<strong>2、Android 应用状况：小米手机占有率领先，WIFI 联网方式超过 80%</strong><br/><br/>　　Android 用户移动远超联通，在预料之中。但是，没有想到，在这么多不同型号的 Android 手机中，小米手机 MI-ONE Plus 的占有量竟然能够位居第一，而三星 GT-I9100 紧跟其后。<br/><br/>　　<a href="http://blog.s135.com/attachment/201202/tongji/android_sb.png" target="_blank"><img src="http://blog.s135.com/attachment/201202/tongji/android_sb.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/android/" rel="tag">android</a> , <a href="http://blog.s135.com/tags/ios/" rel="tag">ios</a> , <a href="http://blog.s135.com/tags/iphone/" rel="tag">iphone</a> , <a href="http://blog.s135.com/tags/iphone4/" rel="tag">iphone4</a> , <a href="http://blog.s135.com/tags/ipad/" rel="tag">ipad</a> , <a href="http://blog.s135.com/tags/3g/" rel="tag">3g</a> , <a href="http://blog.s135.com/tags/2g/" rel="tag">2g</a> , <a href="http://blog.s135.com/tags/wifi/" rel="tag">wifi</a> , <a href="http://blog.s135.com/tags/%25E5%25B0%258F%25E7%25B1%25B3%25E6%2589%258B%25E6%259C%25BA/" rel="tag">小米手机</a> , <a href="http://blog.s135.com/tags/%25E4%25B8%2589%25E6%2598%259F/" rel="tag">三星</a> , <a href="http://blog.s135.com/tags/%25E4%25B8%25AD%25E5%259B%25BD%25E7%25A7%25BB%25E5%258A%25A8/" rel="tag">中国移动</a> , <a href="http://blog.s135.com/tags/%25E4%25B8%25AD%25E5%259B%25BD%25E8%2581%2594%25E9%2580%259A/" rel="tag">中国联通</a> , <a href="http://blog.s135.com/tags/%25E4%25B8%25AD%25E5%259B%25BD%25E7%2594%25B5%25E4%25BF%25A1/" rel="tag">中国电信</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/taobaoke_click_urls/</link>
<title><![CDATA[根据淘宝商品 num_iid 批量生成淘宝客链接的 PHP 函数]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Thu, 16 Feb 2012 06:08:13 +0000</pubDate> 
<guid>http://blog.s135.com/taobaoke_click_urls/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2012.02.16 转载请注明原文链接：<a href="http://blog.s135.com/taobaoke_click_urls/" target="_blank">http://blog.s135.com/taobaoke_click_urls/</a>]<br/><br/>　　根据淘宝商品 num_iid 批量生成淘宝客（<a href="http://baike.baidu.com/view/2133469.htm" target="_blank">什么是淘宝客？</a>）链接的 PHP 文件内容如下。<br/><br/>　　淘宝 API 有调用次数限制，一次 API 调用，可以最大返回40个商品的淘宝客链接，因此，在本函数内，如果需要批量生成的淘宝商品 num_iid 数大于40，将按照40个一次，分多次调用。如果调用淘宝 API 查询过的商品 num_iid，不管其是否有淘宝客链接（有些商品没有淘宝客推广链接），都将利用 Memcached 缓存起来，下次直接查缓存，不会重复调用淘宝 API。<br/><br/><div class="code">&lt;?php<br/>require_once(dirname(__FILE__).&#039;/TopSdk.php&#039;); //引用淘宝开放平台 API SDK<br/><br/>function object2Array($d)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_object($d))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$d = get_object_vars($d);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($d))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return array_map(__FUNCTION__, $d);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $d;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/><br/>/*********************************************<br/>* 函数名：get_taobaoke_link ($num_iids)<br/>* 函数用途：通过淘宝商品 num_iids 获取其对应的淘宝客手机版链接 <br/>* 创建时间：2012-02-14<br/>* 创建人：张宴 net@s135.com<br/>* 参数说明：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&nbsp;&nbsp; 淘宝商品ID（支持多个商品）数组，示例如下：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&#91;&#93; = &quot;13583512568&quot;;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&#91;&#93; = &quot;10809380078&quot;;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&#91;&#93; = &quot;10809380079&quot;;&nbsp;&nbsp;<br/>* 返回值：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;下标为淘宝商品 num_iid ，值为淘宝客链接 click_url 的二维数组。如果无淘宝客链接，click_url 为空字符串，示例如下：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(3) &#123;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;13583512568&quot;&#93;=&gt;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string(191) &quot;http://auction1.wap.taobao.com/auction/item_detail-0db2-13583512568.jhtml?tks=jUTwPLMDtUUNEZhqfEuTZqkZhGw1LA7%2BzCJBXCj27NpurHxjZN70Amg0DVaFU61pfnHwW%2FI4MZGm%0Awgb69kbb1NL8uwtu%2BDnyAunBCVDP&quot;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;10809380078&quot;&#93;=&gt;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string(187) &quot;http://auction1.wap.taobao.com/auction/item_detail-0db2-10809380078.jhtml?tks=jUTwPLMDtUUNEGWhOOgVVuX%2BJKYt7fesyuZjEe7hvmpTJxYDfK8i1Wpvfl7lwI7nzD9W8M352v6E%0AyuUtsKun81AGltKzJWCYPiVDiOeC&quot;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;10809380079&quot;&#93;=&gt;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string(0) &quot;&quot;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>*********************************************/<br/>function get_taobaoke_link ($num_iids) &#123;<br/>&nbsp;&nbsp;$memcache = new Memcache;<br/>&nbsp;&nbsp;$memcache-&gt;connect(&#039;127.0.0.1&#039;, 11911); //Memcached 缓存服务器地址<br/>&nbsp;&nbsp;$click_urls = $memcache-&gt;get($num_iids);<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;foreach ($num_iids AS $num_iid) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (!isset($click_urls&#91;$num_iid&#93;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tbapi_num_iids_arr&#91;&#93; = $num_iid;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (!empty($tbapi_num_iids_arr)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$numbers = count($tbapi_num_iids_arr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$numbers_max = 40; //淘宝 API 限制最大返回40条记录<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($numbers &gt; 0) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_times = ceil($numbers / $numbers_max); //第一层循环的循环次数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_start = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_end = $numbers_max;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($numbers_i = 1; $numbers_i &lt;= $numbers_times; $numbers_i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($numbers_j = $numbers_start; $numbers_j &lt; $numbers_end; $numbers_j++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($numbers_j &gt;= $numbers) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tbapi_num_iids_arr_sp&#91;&#93; = $tbapi_num_iids_arr&#91;$numbers_j&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_start = $numbers_start + $numbers_max;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_end = $numbers_end + $numbers_max;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tbapi_num_iids = implode(&quot;,&quot;, $tbapi_num_iids_arr_sp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c = new TopClient;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c-&gt;appkey = 12498835; //淘宝开放平台 API 接口 App Key<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c-&gt;secretKey = &quot;745db5f8e316f9f1aa8310a7568d6566&quot;; //淘宝开放平台 API 接口 App Secret<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c-&gt;format = &quot;json&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req = new TaobaokeItemsConvertRequest;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setFields(&quot;num_iid,click_url&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setNumIids($tbapi_num_iids);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setPid(29509662); //淘宝联盟（阿里妈妈）PID<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setIsMobile(&quot;true&quot;); //如果要生成手机页面的淘宝客链接，选择 true；网页版选择 false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$resp = $c-&gt;execute($req);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res = object2Array($resp);<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isset($res&#91;&quot;taobaoke_items&quot;&#93;&#91;&quot;taobaoke_item&quot;&#93;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$links = $res&#91;&quot;taobaoke_items&quot;&#93;&#91;&quot;taobaoke_item&quot;&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($links as $value) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$memcache-&gt;set($value&#91;&quot;num_iid&quot;&#93;, $value&#91;&quot;click_url&quot;&#93;, MEMCACHE_COMPRESSED, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$click_urls&#91;(string)$value&#91;&quot;num_iid&quot;&#93;&#93; = $value&#91;&quot;click_url&quot;&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($tbapi_num_iids_arr_sp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($tbapi_num_iids);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($resp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($res);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($links);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;foreach ($num_iids AS $num_iid) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (!isset($click_urls&#91;$num_iid&#93;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$memcache-&gt;set($num_iid, &quot;&quot;, MEMCACHE_COMPRESSED, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$click_urls&#91;(string)$num_iid&#93; = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;$memcache-&gt;close();<br/>&nbsp;&nbsp;return $click_urls;<br/>&#125;<br/><br/>//演示<br/>$num_iids&#91;&#93; = &quot;13583512568&quot;;<br/>$num_iids&#91;&#93; = &quot;10809380078&quot;;<br/>$num_iids&#91;&#93; = &quot;10809380079&quot;;<br/>$click_urls = get_taobaoke_link ($num_iids);<br/>var_dump($click_urls);<br/>?&gt;</div><br/><br/><hr/><br/>　　淘宝开放平台（<a href="http://open.taobao.com/" target="_blank">http://open.taobao.com/</a>） PHP SDK 下载：<br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/%25E6%25B7%2598%25E5%25AE%259D%25E5%25AE%25A2/" rel="tag">淘宝客</a> , <a href="http://blog.s135.com/tags/%25E6%2589%258B%25E6%259C%25BA/" rel="tag">手机</a> , <a href="http://blog.s135.com/tags/%25E6%25B7%2598%25E5%25AE%259D%25E5%2595%2586%25E5%2593%2581/" rel="tag">淘宝商品</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/itms-services/</link>
<title><![CDATA[越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[移动互联网与手机]]></category>
<pubDate>Mon, 13 Feb 2012 05:50:07 +0000</pubDate> 
<guid>http://blog.s135.com/itms-services/</guid> 
<description>
<![CDATA[ 
	　　1、已经<a href="http://tech.sina.com.cn/n/2012-02-08/01092021451.shtml" target="_blank">越狱</a>的 iPhone、iPad 设备，当通过其自带的 safari 浏览器访问 ipa 应用下载网站时，利用 itms-services 协议，可以一键安装 ipa 文件的 iOS 应用，例如：<br/><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">&lt;a href=&quot;itms-services://?action=download-manifest&amp;url=http://blog.s135.com/demo/ios/jhsmyt.plist&quot;&gt;通过越狱的iOS设备浏览器访问本页，点这儿一键安装APP应用。&lt;/a&gt;</div><br/><hr/><br/>　　2、jhsmyt.plist 的内容如下：<br/>　　<a href="http://blog.s135.com/demo/ios/jhsmyt.xml" target="_blank">blog.s135.com/demo/ios/jhsmyt.plist</a><br/><br/>　　需要修改之处：<br/><br/>　　<a href="http://blog.s135.com/attachment/201202/plist.png" target="_blank"><img src="http://blog.s135.com/attachment/201202/plist.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　3、如果通过 iPhone、iPad 上的二维码扫描软件，还可以实现类似 Android 系统的扫描二维码下载 app 应用：<br/><br/>　　<a href="http://blog.s135.com/demo/ios/autodown.png" target="_blank"><img src="http://blog.s135.com/demo/ios/autodown.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　二维码内的网址地址为 <a href="http://blog.s135.com/demo/ios/autodown.htm" target="_blank">http://blog.s135.com/demo/ios/autodown.htm</a> 内容如下：<br/><textarea name="code" class="html" rows="15" cols="100"><html>
<head>
<title>iOS 越狱版安装</title>
<meta http-equiv="Content-Type" content="text/HTML; charset=utf-8">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
<script type="text/javascript">
function doLocation(url)
&#123;
&nbsp;&nbsp;var a = document.createElement("a");
&nbsp;&nbsp;if(!a.click) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;window.location = url;
&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;a.setAttribute("href", url);
&nbsp;&nbsp;a.style.display = "none";
&nbsp;&nbsp;document.body.appendChild(a);
&nbsp;&nbsp;a.click();
&#125;
</script>
</head>
<body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;>
<script type="text/javascript">
doLocation('itms-services://?action=download-manifest&url=http://blog.s135.com/demo/ios/jhsmyt.plist');
</script>
</body>
</html></textarea><br/><hr/><br/>　　4、完整的 Demo 示例：<br/><br/>　　<a href="http://blog.s135.com/demo/ios/" target="_blank">http://blog.s135.com/demo/ios/</a><br/><br/>　　<a href="http://blog.s135.com/attachment/201202/ios1.png" target="_blank"><img src="http://blog.s135.com/attachment/201202/ios1.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201202/ios2.png" target="_blank"><img src="http://blog.s135.com/attachment/201202/ios2.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>Tags - <a href="http://blog.s135.com/tags/ios/" rel="tag">ios</a> , <a href="http://blog.s135.com/tags/iphone/" rel="tag">iphone</a> , <a href="http://blog.s135.com/tags/ipad/" rel="tag">ipad</a> , <a href="http://blog.s135.com/tags/app/" rel="tag">app</a> , <a href="http://blog.s135.com/tags/ipa/" rel="tag">ipa</a> , <a href="http://blog.s135.com/tags/safari/" rel="tag">safari</a> , <a href="http://blog.s135.com/tags/%25E8%258B%25B9%25E6%259E%259C/" rel="tag">苹果</a> , <a href="http://blog.s135.com/tags/%25E8%25B6%258A%25E7%258B%25B1/" rel="tag">越狱</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/file_get_contents/</link>
<title><![CDATA[PHP-CGI 进程 CPU 100% 与 file_get_contents 函数的关系]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[Web服务器]]></category>
<pubDate>Fri, 05 Aug 2011 07:33:05 +0000</pubDate> 
<guid>http://blog.s135.com/file_get_contents/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2011.08.05 转载请注明原文链接：<a href="http://blog.s135.com/file_get_contents/" target="_blank">http://blog.s135.com/file_get_contents/</a>]<br/><br/>　　有时候，运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器，突然系统负载上升，使用 top 命令查看，很多 php-cgi 进程 CPU 使用率接近100%。后来，我通过跟踪发现，这类情况的出现，跟 PHP 的 file_get_contents() 函数有着密切的关系。<br/><br/>　　大、中型网站中，基于 HTTP 协议的 API 接口调用，是家常便饭。PHP 程序员们喜欢使用简单便捷的 file_get_contents("http://example.com/") 函数，来获取一个 URL 的返回内容，但是，如果 <a href="http://example.com/" target="_blank">http://example.com/</a> 这个网站响应缓慢，file_get_contents() 就会一直卡在那儿，不会超时。<br/><br/>　　我们知道，在 php.ini 中，有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间，但是，在 php-cgi(php-fpm) 中，该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数：<br/><textarea name="code" class="xml" rows="15" cols="100">The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when 'max_execution_time' ini option does not stop script execution for some reason
'0s' means 'off'
<value name="request_terminate_timeout">0s</value></textarea>　　默认值为 0 秒，也就是说，PHP 脚本会一直执行下去。这样，当所有的 php-cgi 进程都卡在 file_get_contents() 函数时，这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了，Nginx 将给用户返回“502 Bad Gateway”。修改该参数，设置一个 PHP 脚本最大执行时间是必要的，但是，治标不治本。例如改成 &lt;value name=&quot;request_terminate_timeout&quot;&gt;30s&lt;/value&gt;，如果发生 file_get_contents() 获取网页内容较慢的情况，这就意味着 150 个 php-cgi 进程，每秒钟只能处理 5 个请求，WebServer 同样很难避免“502 Bad Gateway”。<br/><br/>　　要做到彻底解决，只能让 PHP 程序员们改掉直接使用 file_get_contents("http://example.com/") 的习惯，而是稍微修改一下，加个超时时间，用以下方式来实现 HTTP GET 请求。要是觉得麻烦，可以自行将以下代码封装成一个函数。<br/><textarea name="code" class="php" rows="15" cols="100"><?php
$ctx = stream_context_create(array(
&nbsp;&nbsp; 'http' => array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'timeout' => 1 //设置一个超时时间，单位为秒
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )
&nbsp;&nbsp; )
);
file_get_contents("http://example.com/", 0, $ctx);
?></textarea>　　当然，导致 php-cgi 进程 CPU 100% 的原因不只有这一种，那么，怎么确定是 file_get_contents() 函数导致的呢？<br/><br/>　　首先，使用 top 命令查看 CPU 使用率较高的 php-cgi 进程。<br/><br/><div class="code">top - 10:34:18 up 724 days, 21:01,&nbsp;&nbsp;3 users,&nbsp;&nbsp;load average: 17.86, 11.16, 7.69<br/>Tasks: 561 total,&nbsp;&nbsp;15 running, 546 sleeping,&nbsp;&nbsp; 0 stopped,&nbsp;&nbsp; 0 zombie<br/>Cpu(s):&nbsp;&nbsp;5.9%us,&nbsp;&nbsp;4.2%sy,&nbsp;&nbsp;0.0%ni, 89.4%id,&nbsp;&nbsp;0.2%wa,&nbsp;&nbsp;0.0%hi,&nbsp;&nbsp;0.2%si,&nbsp;&nbsp;0.0%st<br/>Mem:&nbsp;&nbsp; 8100996k total,&nbsp;&nbsp;4320108k used,&nbsp;&nbsp;3780888k free,&nbsp;&nbsp; 772572k buffers<br/>Swap:&nbsp;&nbsp;8193108k total,&nbsp;&nbsp;&nbsp;&nbsp;50776k used,&nbsp;&nbsp;8142332k free,&nbsp;&nbsp; 412088k cached<br/><br/>&nbsp;&nbsp;PID USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PR&nbsp;&nbsp;NI&nbsp;&nbsp;VIRT&nbsp;&nbsp;RES&nbsp;&nbsp;SHR S %CPU %MEM&nbsp;&nbsp;&nbsp;&nbsp;TIME+&nbsp;&nbsp;COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10747 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp; 0&nbsp;&nbsp;360m&nbsp;&nbsp;22m&nbsp;&nbsp;12m R 100.6 0.3&nbsp;&nbsp;&nbsp;&nbsp;0:02.60 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>10709 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp; 0&nbsp;&nbsp;359m&nbsp;&nbsp;28m&nbsp;&nbsp;17m R 96.8&nbsp;&nbsp;0.4&nbsp;&nbsp;&nbsp;&nbsp;0:11.34 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10745 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp; 0&nbsp;&nbsp;360m&nbsp;&nbsp;24m&nbsp;&nbsp;14m R 94.8&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;0:39.51 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10707 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp; 0&nbsp;&nbsp;360m&nbsp;&nbsp;25m&nbsp;&nbsp;14m S 77.4&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;0:33.48 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10782 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp; 0&nbsp;&nbsp;360m&nbsp;&nbsp;26m&nbsp;&nbsp;15m R 75.5&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;0:10.93 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10708 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; 0&nbsp;&nbsp;360m&nbsp;&nbsp;22m&nbsp;&nbsp;12m R 69.7&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;0:45.16 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10683 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; 0&nbsp;&nbsp;362m&nbsp;&nbsp;28m&nbsp;&nbsp;15m R 54.2&nbsp;&nbsp;0.4&nbsp;&nbsp;&nbsp;&nbsp;0:32.65 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10711 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; 0&nbsp;&nbsp;360m&nbsp;&nbsp;25m&nbsp;&nbsp;15m R 52.2&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;0:44.25 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10688 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; 0&nbsp;&nbsp;359m&nbsp;&nbsp;25m&nbsp;&nbsp;15m R 38.7&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;0:10.44 php-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>10719 www&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; 0&nbsp;&nbsp;360m&nbsp;&nbsp;26m&nbsp;&nbsp;16m R&nbsp;&nbsp;7.7&nbsp;&nbsp;0.3&nbsp;&nbsp;&nbsp;&nbsp;0:40.59 php-cgi</div><br/>　　找其中一个 CPU 100% 的 php-cgi 进程的 PID，用以下命令跟踪一下：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">strace -p 10747</div><br/>　　如果屏幕显示：<br/><div class="code">select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)<br/>select(7, &#91;6&#93;, &#91;6&#93;, &#91;&#93;, &#123;15, 0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1 (out &#91;6&#93;, left &#123;15, 0&#125;)<br/>poll(&#91;&#123;fd=6, events=POLLIN&#125;&#93;, 1, 0)&nbsp;&nbsp;&nbsp;&nbsp; = 0 (Timeout)</div><br/>　　那么，就可以确定是 file_get_contents() 导致的问题了。<br/>Tags - <a href="http://blog.s135.com/tags/nginx/" rel="tag">nginx</a> , <a href="http://blog.s135.com/tags/php/" rel="tag">php</a> , <a href="http://blog.s135.com/tags/file_get_contents/" rel="tag">file get contents</a> , <a href="http://blog.s135.com/tags/max_execution_time/" rel="tag">max execution time</a> , <a href="http://blog.s135.com/tags/request_terminate_timeout/" rel="tag">request terminate timeout</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/httpsqs_1_7/</link>
<title><![CDATA[HTTPSQS 1.7 发布：Libevent 2.0.x 的 evhttp_parse_query BUG 与动态编译时指定动态链接库 .so 寻找路径]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[Cache与存储]]></category>
<pubDate>Tue, 26 Jul 2011 09:07:57 +0000</pubDate> 
<guid>http://blog.s135.com/httpsqs_1_7/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2011.07.26 转载请注明原文链接：<a href="http://blog.s135.com/httpsqs_1_7/" target="_blank">http://blog.s135.com/httpsqs_1_7/</a>]<br/><br/>　　HTTPSQS（HTTP Simple Queue Service）是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务，使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。<br/><br/>　　<span style="font-size: 14px;"><span style="color: #FF0000;">项目网址</span>：<a href="http://code.google.com/p/httpsqs/" target="_blank">http://code.google.com/p/httpsqs/</a></span><br/>　　<span style="font-size: 14px;"><span style="color: #FF0000;">使用文档</span>：<a href="http://blog.s135.com/httpsqs/" target="_blank">http://blog.s135.com/httpsqs/</a></span><br/>　　<span style="font-size: 14px;">使用环境：</span>Linux（同时支持32位、64位操作系统，推荐使用64位操作系统）<br/>　　<span style="font-size: 14px;">软件作者：</span>张宴<br/><br/><hr/><br/>　　<strong>HTTPSQS 1.7 版本更新内容：</strong><br/><br/>　　下面的内容不只是介绍 HTTPSQS 1.7 更新了哪些东西，更多的介绍在于：如何绕开 Libevent 2.0.x evhttp 使用过程中，无法正常处理包含“&#124;”字符的 URI 参数的问题；提供了一份比 Libevent 官方网站更新的在线文档；Linux 下如何动态编译程序，运行时不用在 /etc/ld.so.conf 文件中添加动态链接库路径。<br/><br/>　　<strong>1、针对 Libevent 2.0.x 版本 evhttp_parse_query 函数的 BUG。</strong><br/><br/>　　网友发邮件，反应了一个 HTTPSQS 的 BUG，见下图，data 的值为NULL。我查找发现，这不是 HTTPSQS 的 BUG，而是 Libevent 2.0.x 版本的 BUG。在 Libevent 1.4.14b 版本中，evhttp_parse_query 函数是能够正常处理包含“&#124;”字符的 URI 的，而在 Libevent 2.0.12 版本中，同样使用 evhttp_parse_query 函数，包含“&#124;”字符的 URI&nbsp;&nbsp;处理后的结果是 NULL。<br/><br/>　　<a href="http://blog.s135.com/attachment/201107/evbug0.gif" target="_blank"><img src="http://blog.s135.com/attachment/201107/evbug0.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　对比 Libevent 2.0.12 和 1.4.14b 版本的 evhttp_parse_query 函数代码，发现在 2.0.12 版本中，evhttp_parse_query(const char *uri, struct evkeyvalq *headers) 实际变成了调用 evhttp_parse_query_impl(uri, headers, 1) 函数，该函数内再调用的一个 2.0.x 版本新增的函数 evhttp_uri_parse(const char *source_uri)，逻辑处理代码在 evhttp_uri_parse_with_flags(const char *source_uri, unsigned flags) 函数中。evhttp_uri_parse(const char *source_uri) 无法正确解析含有“&#124;”的URL，遇到类似“<a href="http://127.0.0.1:1218/?opt=get&name=aaa&#124;bbb" target="_blank">http://127.0.0.1:1218/?opt=get&name=aaa&#124;bbb</a>”的URL，直接返回NULL，也就是 BUG 所在。<br/><br/>　　libevent-2.0.12-stable/http.c<br/>　　<a href="http://blog.s135.com/attachment/201107/evbug1.gif" target="_blank"><img src="http://blog.s135.com/attachment/201107/evbug1.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201107/evbug2.gif" target="_blank"><img src="http://blog.s135.com/attachment/201107/evbug2.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201107/evbug3.gif" target="_blank"><img src="http://blog.s135.com/attachment/201107/evbug3.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　不建议修改第三方库，这个 BUG 还是留给 Libevent 自己去解决吧。使用 Libevent 2.0.x evhttp 作开发的同学，遇到URI参数中包含“&#124;”的问题，注意一下吧。<br/><br/>　　我修改了 HTTPSQS 代码，在 HTTPSQS 1.7 版本，采用以下方式来绕开evhttp_uri_parse(const char *source_uri)函数，解决这个问题。其中用到了 Libevent 2.0.x&nbsp;&nbsp;evhttp_request 结构体中新增的 struct evhttp_uri *uri_elems，以及新增的函数 evhttp_parse_query_str (const char *uri, struct evkeyvalq *headers)。<br/><textarea name="code" class="c" rows="15" cols="100">
/* 处理模块 */
void httpsqs_handler(struct evhttp_request *req, void *arg)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct evbuffer *buf;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf = evbuffer_new();
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 分析URL参数 */&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const char *httpsqs_query_part;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct evkeyvalq httpsqs_http_query;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpsqs_query_part = evhttp_uri_get_query(req->uri_elems);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evhttp_parse_query_str(httpsqs_query_part, &httpsqs_http_query);
</textarea><br/>　　Libevent 的官方文档只有 <a href="http://monkey.org/~provos/libevent/doxygen-1.4.10" target="_blank">1.4.10-stable</a> 和 <a href="http://monkey.org/~provos/libevent/doxygen-2.0.1" target="_blank">2.0.1-alpha</a> 版本的，2.0.1x 很多新增的函数、结构体都没有。<br/><br/>　　<span style="font-size: 14px;"><span style="color: #FF0000;">我这里提供一份最新的 Libevent 在线文档：</span> <a href="http://blog.s135.com/book/libevent/" target="_blank">http://blog.s135.com/book/libevent/</a> </span><br/><br/><hr/><br/>　　<strong>2、静态编译改为动态编译，并指定程序运行时查找的动态链接库路径 </strong><br/><br/>　　一些网友反映，CentOS 6.0、Fedora 等系统没有默认安装lz、lbz2、lrt、...等静态链接库，出现无法编译HTTPSQS的情况：<br/><div class="code">gcc -o httpsqs httpsqs.c prename.c -L/usr/local/libevent-2.0.10-stable/lib/ -levent -L/usr/local/tokyocabinet-1.4.47/lib/ -ltokyocabinet -I/usr/local/libevent-2.0.10-stable/include/ -I/usr/local/tokyocabinet-1.4.47/include/ -lz -lbz2 -lrt -lpthread -lm -lc -O2 -g --static&nbsp;&nbsp;<br/>/usr/bin/ld: cannot find -lz&nbsp;&nbsp;<br/>/usr/bin/ld: cannot find -lbz2&nbsp;&nbsp;<br/>/usr/bin/ld: cannot find -lrt&nbsp;&nbsp;<br/>/usr/bin/ld: cannot find -lpthread&nbsp;&nbsp;<br/>/usr/bin/ld: cannot find -lm&nbsp;&nbsp;<br/>/usr/bin/ld: cannot find -lc&nbsp;&nbsp;<br/>/usr/bin/ld: cannot find -lc&nbsp;&nbsp;<br/>collect2: ld 返回 1&nbsp;&nbsp;<br/>make: *** &#91;httpsqs&#93; 错误 1</div><br/><br/>　　HTTPSQS 1.7 版本改为动态编译，编译时使用“<span style="color: red;">-Wl,-rpath</span>”参数指定了程序运行时的动态库搜索路径。这样就不需要在 /etc/ld.so.conf 中 添加 HTTPSQS 程序运行时需要的 libevent、tokyocabinet 动态链接库路径了，可以避免与其他软件（例如：Memcached、TT）使用的 libevent、tokyocabinet 动态链接库版本相冲突。详情请见 Makefile 文件：<br/><div class="code"># Makefile for httpsqs<br/>CC=gcc<br/>CFLAGS=-Wl,-rpath,/usr/local/libevent-2.0.12-stable/lib/:/usr/local/tokyocabinet-1.4.47/lib/ -L/usr/local/libevent-2.0.12-stable/lib/ -levent -L/usr/local/tokyocabinet-1.4.47/lib/ -ltokyocabinet -I/usr/local/libevent-2.0.12-stable/include/ -I/usr/local/tokyocabinet-1.4.47/include/ -lz -lbz2 -lrt -lpthread -lm -lc -O2 -g<br/><br/>httpsqs: httpsqs.c<br/>&nbsp;&nbsp;$(CC) -o httpsqs httpsqs.c prename.c $(CFLAGS)<br/>&nbsp;&nbsp;@echo &quot;&quot;<br/>&nbsp;&nbsp;@echo &quot;httpsqs build complete.&quot;<br/>&nbsp;&nbsp;@echo &quot;&quot;&nbsp;&nbsp;<br/><br/>clean: httpsqs<br/>&nbsp;&nbsp;rm -f httpsqs<br/><br/>install: httpsqs<br/>&nbsp;&nbsp;install $(INSTALL_FLAGS) -m 4755 -o root httpsqs $(DESTDIR)/usr/bin<br/></div><br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/httpsqs/" rel="tag">httpsqs</a> , <a href="http://blog.s135.com/tags/libevent/" rel="tag">libevent</a> , <a href="http://blog.s135.com/tags/evhttp/" rel="tag">evhttp</a> , <a href="http://blog.s135.com/tags/evhttp_parse_query/" rel="tag">evhttp parse query</a> , <a href="http://blog.s135.com/tags/evhttp_uri_parse/" rel="tag">evhttp uri parse</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/mu_lan_wei_chang/</link>
<title><![CDATA[2011年夏，木兰围场与乌兰布统大草原三日游]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[心情随笔]]></category>
<pubDate>Tue, 12 Jul 2011 09:17:41 +0000</pubDate> 
<guid>http://blog.s135.com/mu_lan_wei_chang/</guid> 
<description>
<![CDATA[ 
	　　2011年7月8日早上7:00，作为领队，带领金山游戏运营技术中心部分同事、家属组成的45人旅行团，乘大巴车从北京金山软件大厦出发，开始承德木兰围场、内蒙古乌兰布统大草原三日游。<br/><br/>　　没有去过的朋友，可以将本文当成一篇攻略；无论是否去过的朋友，都可以将本文当成一篇美景欣赏相册。木兰围场、乌兰布统大草原，真是太漂亮了。<br/><br/>　　<strong>【第一天：2011年7月8日】</strong><br/><br/>　　“北京→木兰围场”行车路线：<br/>　　<br/>此处包含一个多媒体文件，请用网页方式查看。<br/><br/><hr/><br/>　　<strong>【万顷林海】</strong><br/><br/>　　经过3个小时的京承高速、3个小时的国道，到达“塞罕坝国家森林公园”山门。<br/><br/>　　车过山门，还需1小时的山路，观千里松林、万顷林海。53座的大巴车，挑战360度的下坡大转弯，还是有些难度的。<br/><br/>　　<a href="http://blog.s135.com/attachment/201107/mlwc/immense_forest/P7080043.JPG" target="_blank"><img src="http://blog.s135.com/attachment/201107/mlwc/immense_forest/P7080043.JPG" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/%25E6%259C%25A8%25E5%2585%25B0%25E5%259B%25B4%25E5%259C%25BA/" rel="tag">木兰围场</a> , <a href="http://blog.s135.com/tags/%25E4%25B9%258C%25E5%2585%25B0%25E5%25B8%2583%25E7%25BB%259F/" rel="tag">乌兰布统</a> , <a href="http://blog.s135.com/tags/%25E8%258D%2589%25E5%258E%259F/" rel="tag">草原</a> , <a href="http://blog.s135.com/tags/%25E9%25AA%2591%25E9%25A9%25AC/" rel="tag">骑马</a> , <a href="http://blog.s135.com/tags/%25E4%25B8%2583%25E6%2598%259F%25E6%25B9%2596/" rel="tag">七星湖</a> , <a href="http://blog.s135.com/tags/%25E6%25B3%25B0%25E4%25B8%25B0%25E6%25B9%2596/" rel="tag">泰丰湖</a> , <a href="http://blog.s135.com/tags/%25E6%259C%2588%25E4%25BA%25AE%25E6%25B9%2596/" rel="tag">月亮湖</a> , <a href="http://blog.s135.com/tags/%25E7%2599%25BE%25E8%258A%25B1%25E5%259D%25A1/" rel="tag">百花坡</a> , <a href="http://blog.s135.com/tags/%25E6%25BB%25A6%25E6%25B2%25B3%25E6%25BA%2590%25E5%25A4%25B4/" rel="tag">滦河源头</a> , <a href="http://blog.s135.com/tags/%25E7%2595%258C%25E6%25B2%25B3%25E6%25BC%2582%25E6%25B5%2581/" rel="tag">界河漂流</a> , <a href="http://blog.s135.com/tags/%25E5%2586%259B%25E9%25A9%25AC%25E5%259C%25BA/" rel="tag">军马场</a> , <a href="http://blog.s135.com/tags/%25E5%25B0%2586%25E5%2586%259B%25E6%25B3%25A1%25E5%25AD%2590/" rel="tag">将军泡子</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/windows_mstsc/</link>
<title><![CDATA[Windows 服务程序、窗口界面与远程桌面的那点事]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[Windows相关]]></category>
<pubDate>Tue, 28 Jun 2011 09:17:51 +0000</pubDate> 
<guid>http://blog.s135.com/windows_mstsc/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2011.06.28 转载请注明原文链接：<a href="http://blog.s135.com/windows_mstsc/" target="_blank">http://blog.s135.com/windows_mstsc/</a>]<br/><br/>　　个人不喜欢服务端程序，以 Windows 操作系统作为运行平台，但是，很多时候，迫于环境现状，需要让自己的程序实现跨平台。<br/><br/>　　在开发全新的金山游戏运营平台时，发现：虽然大部分游戏，服务端程序运行在 Linux 服务器，但是，仍有例外。几款最近代理的游戏，服务端运行在 Windows 服务器上。西山居开发的游戏，服务端集群架构，既有 Windows 服务器，又有 Linux 服务器。<br/><br/>　　<a href="http://blog.s135.com/attachment/201106/knose01.png" target="_blank"><img src="http://blog.s135.com/attachment/201106/knose01.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><hr/><br/>　　游戏运行系统的 Knose 程序，我最初是在 Linux 下开发的，后来才实现了兼容 Windows 的跨平台版本。<br/><br/>　　<a href="http://blog.s135.com/attachment/201106/knose02.png" target="_blank"><img src="http://blog.s135.com/attachment/201106/knose02.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><hr/><br/>　　在 Linux 下，Knose 为“父子进程+指令处理线程池+独立功能多线程”结构；在 Windows 上，将 Knose 父子进程结构，拆分成了 knose_daemon.exe（Service 服务程序）和 knose.exe（主程序），由 knose_daemon.exe 启动 knose.exe。<br/><br/>　　<a href="http://blog.s135.com/attachment/201106/knose03.png" target="_blank"><img src="http://blog.s135.com/attachment/201106/knose03.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><hr/><br/>　　遇到了问题：按照运营维护需求，knose.exe 以及通过它启动的游戏服务端进程，需要有“窗口界面”，显示在桌面中。而 knose_daemon.exe 是以服务方式运行的，无窗口界面，knose_daemon.exe 启动的 knose.exe，窗口界面没有弹出来。<br/><br/>　　为了解决这个问题，我在 install.bat 中，用了 Windows 的 sc 命令，将 knose_daemon.exe 启动为系统服务，“type= interact type= own”设置了“允许桌面与服务交互”。在本机（Windows XP SP3）测试，knose.exe 的窗口界面以及通过它启动的游戏进程窗口界面，都弹出来了。<br/><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">@echo off<br/>sc create "KingeyesKnose" binPath= "%CD%&#92;knose_daemon.exe" DisplayName= "Kingeyes Knose Daemon" start= auto type= interact type= own<br/>sc description KingeyesKnose "金山游戏运营系统 KingEyes Knose 守护进程。"<br/>sc start KingeyesKnose</div><br/><br/>　　<a href="http://blog.s135.com/attachment/201106/knose04.png" target="_blank"><img src="http://blog.s135.com/attachment/201106/knose04.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><hr/><br/>　　于是将程序发布到 Windows Server 2003 服务器上，远程桌面连接上去，发现 knose.exe 的窗口界面始终弹不出来。<br/><br/>　　后来，同事发现，原来是“远程桌面”惹的祸：<br/><br/>　　远程桌面客户端 mstsc 有一个 /console 参数，模式等同于本地终端显示器登录，/console 不会去占用非 /console 远程桌面，远程桌面允许两个正常连接和一个控制台/console方式连接，并且正常连接和 /console 连接的桌面操作不能相互看见，只有通过 /console 参数远程桌面连接到 Windows 2003 服务器，才能够看到弹出的 knose.exe 窗口界面。<br/><br/>　　在 Windows XP SP3 以上版本，/console 参数改名为 /admin，需要用 mstsc /admin 启动远程桌面：<br/><br/>　　<a href="http://blog.s135.com/attachment/201106/knose05.png" target="_blank"><img src="http://blog.s135.com/attachment/201106/knose05.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　连上后，终于能够看到由 knose_daemon.exe 启动的 knose.exe 程序窗口，以及由 knose.exe 启动的游戏服务端进程窗口了。<br/><br/>Tags - <a href="http://blog.s135.com/tags/windows/" rel="tag">windows</a> , <a href="http://blog.s135.com/tags/mstsc/" rel="tag">mstsc</a> , <a href="http://blog.s135.com/tags/console/" rel="tag">console</a> , <a href="http://blog.s135.com/tags/admin/" rel="tag">admin</a> , <a href="http://blog.s135.com/tags/%25E8%25BF%259C%25E7%25A8%258B%25E6%25A1%258C%25E9%259D%25A2/" rel="tag">远程桌面</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/2011phptc/</link>
<title><![CDATA[2011中国PHP技术高峰论坛：PHP在金山游戏运营中的应用]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Sun, 08 May 2011 11:40:41 +0000</pubDate> 
<guid>http://blog.s135.com/2011phptc/</guid> 
<description>
<![CDATA[ 
	　　5月7日，我在北京长城饭店“<a href="http://www.phpchina.com/2011phptc/" target="_blank">2011中国PHP技术高峰论坛</a>”上的演讲PPT：<br/><br/>　　下载地址1（国外服务器）：<a href="http://blog.s135.com/attachment/201105/2011phptc_zy.zip" target="_blank">http://blog.s135.com/attachment/201105/2011phptc_zy.zip</a><br/><br/>　　下载地址2（国内服务器）：<a href="http://ishare.iask.sina.com.cn/f/15231659.html" target="_blank">http://ishare.iask.sina.com.cn/f/15231659.html</a><br/><br/><hr/><br/>　　<a href="http://blog.s135.com/attachment/201105/2011phptc_zy.jpg" target="_blank"><img src="http://blog.s135.com/attachment/201105/2011phptc_zy.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　以下是我在会议主办方对演讲文字速录的基础上，修正错漏内容，整理之后，对应到每页PPT的文字内容：<br/><br/>　　[PPT No.1]<br/>　　大家下午好，现在我来跟大家分享的是PHP在金山游戏运营中的应用，包括团队协助开发实现方式、网站Web架构设计、游戏运营平台设计这些信息。<br/><br/>　　[PPT No.2]<br/>　　我议题主要有两个，一个是<a href="http://www.xoyo.com" target="_blank">金山游戏官方网站</a>的一些应用，另一个是金山游戏运营系统Keyes中的架构设计。<br/><br/>　　[PPT No.3]<br/>　　金山游戏官方网站包括<a href="http://my.xoyo.com" target="_blank">用户中心</a>、<a href="http://kefu.xoyo.com" target="_blank">客服系统</a>、<a href="http://bbs.xoyo.com" target="_blank">论坛</a>、<a href="http://v.xoyo.com" target="_blank">视频</a>、各游戏<a href="http://jx3.xoyo.com" target="_blank">官网</a>，以及其他跟游戏相关的一些产品，主要采用64位CentOS Linux系统、Nginx、PHP 5.2版本、MySQL 5.5。<br/><br/>　　[PPT No.4]<br/>　　首先来看团队协作开发。我们肯定遇到过这样一种情况，在很多项目中，都是多个人同时开发，涉及到开发环境和测试环境不一样。我们很多PHP工程师，都是在Windows上开发代码，虽然Windows上也可以配置Nginx+PHP+MySQL环境，但是，由于测试环境、生产环境都是Linux系统，而且一些功能只能在Linux下运行，还有一些PHP扩展（例如：分布式图片处理、金山通行证加密扩展），也只能运行在Linux环境中。当我们在Windows上修改完几行PHP代码，想马上看一下执行结果，如果利用FTP之类的工具传到Linux测试服务器上再测试，就太慢了。如果同一台Linux测试服务器上，有多少人同时开发，你上传上去PHP文件，可能会覆盖别人上传的同名文件，就没有办法做到版本控制。<br/><br/>　　[PPT No.5]<br/>　　我们从图中可以看到，假如是程序员A和B都在Windows上开发代码，由于Nginx与PHP之间采用的是TCP FastCGI协议通讯，因此，两者可以分离到不同的服务器上。我们可以把Nginx安装在程序员各自的Windows PC机上，用本机的Nginx处理HTTP请求，用Linux测试服务器上的php-cgi程序，处理PHP请求。程序员在Windows上开发程序，保存之后，不用做任何上传操作，即可用Linux上的php-cgi调试程序。从图中这个流程可以看到，首先，两个程序员分别从SVN版本库，获取到一个项目的最新版本，各自进行一些修改。两人修改程序时，采用的是同一台Linux测试服务器的php-cgi，对各自PC机上的PHP程序进行调试。在PC机上本地测试没有问题，可以提交到SVN版本库。我们做了一个自动同步程序，利用SVN钩子，在每次发生svn commit提交时，在对应的测试服务器的对应项目路径内，执行svn update，将最新修改到文件同步到测试服务器。后来发现有一些问题，如果我们一个项目的目录、程序文件特别多的话，svn update需要遍历扫描目录列表，非常慢。因为我们的SVN是和Apache结合起来使用的，Apache可以记录日志，于是，我们进行了改进，将SVN提交日志记录到Linux下的命名管道内，再用一个程序从命名管道内读取日志，只svn update每次修改的几个文件，这样，速度就非常快了。设置hosts为Linux测试服务器的IP，就可以测试多位程序员代码合并后的效果了。<br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/httpsqs_1_6/</link>
<title><![CDATA[轻量级开源简单队列服务 HTTPSQS 1.6 版本发布]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[Cache与存储]]></category>
<pubDate>Thu, 21 Apr 2011 10:12:37 +0000</pubDate> 
<guid>http://blog.s135.com/httpsqs_1_6/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2011.04.21 转载请注明原文链接：<a href="http://blog.s135.com/httpsqs_1_6/" target="_blank">http://blog.s135.com/httpsqs_1_6/</a>]<br/><br/>　　HTTPSQS（HTTP Simple Queue Service）是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务，使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。<br/><br/>　　<span style="font-size: 14px;"><span style="color: #FF0000;">项目网址</span>：<a href="http://code.google.com/p/httpsqs/" target="_blank">http://code.google.com/p/httpsqs/</a></span><br/>　　<span style="font-size: 14px;"><span style="color: #FF0000;">使用文档</span>：<a href="http://blog.s135.com/httpsqs/" target="_blank">http://blog.s135.com/httpsqs/</a></span><br/>　　<span style="font-size: 14px;">使用环境：</span>Linux（同时支持32位、64位操作系统，推荐使用64位操作系统）<br/>　　<span style="font-size: 14px;">软件作者：</span>张宴<br/><br/>　　队列（Queue）又称先进先出表（First In First Out），即先进入队列的元素，先从队列中取出。加入元素的一头叫“队头”，取出元素的一头叫“队尾”。利用消息队列可以很好地异步处理数据传送和存储，当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据，就可采取消息队列来异步插入。另外，还可以将较慢的处理逻辑、有并发数量限制的处理逻辑，通过消息队列放在后台处理，例如FLV视频转换、发送手机短信、发送电子邮件等。<br/><br/>　　<strong>HTTPSQS 具有以下特征：</strong><br/><br/>　　● 非常简单，基于 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支持HTTP协议的编程语言均可调用。<br/>　　● 非常快速，入队列、出队列速度超过10000次/秒。<br/>　　● 高并发，支持上万的并发连接，<a href="http://www.kegel.com/c10k.html" target="_blank">C10K</a>不成问题。<br/>　　● 支持多队列。<br/>　　● 单个队列支持的最大队列数量高达10亿条。<br/>　　● 低内存消耗，海量数据存储，存储几十GB的数据只需不到100MB的物理内存缓冲区。<br/>　　● 可以在不停止服务的情况下便捷地修改单个队列的最大队列数量。<br/>　　● 可以实时查看队列状态（入队列位置、出队列位置、未读队列数量、最大队列数量）。<br/>　　● 可以查看指定队列ID（队列点）的内容，包括未出、已出的队列内容。<br/>　　● 查看队列内容时，支持多字符集编码。<br/>　　● 源代码不超过800行，适合二次开发。<br/><br/><hr/><br/>　　<strong>HTTPSQS 1.6 版本更新内容：</strong><br/><br/>　　<strong>一、服务器端：</strong><br/><br/>　　<strong>1、修正了定时将内存缓冲区内容同步到磁盘，有时候出现段错误，导致进程崩溃的BUG。</strong>感谢以下网友的反馈：<br/><br/>　　<a href="http://blog.s135.com/attachment/201104/httpsqs_bug1_1.png" target="_blank"><img src="http://blog.s135.com/attachment/201104/httpsqs_bug1_1.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201104/httpsqs_bug1_2.png" target="_blank"><img src="http://blog.s135.com/attachment/201104/httpsqs_bug1_2.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201104/httpsqs_bug1_3.png" target="_blank"><img src="http://blog.s135.com/attachment/201104/httpsqs_bug1_3.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　<strong>2、修正了判断队列已满，遗漏的一种情况。</strong>感谢以下网友的反馈：<br/><br/>　　<a href="http://blog.s135.com/attachment/201104/httpsqs_bug2_1.png" target="_blank"><img src="http://blog.s135.com/attachment/201104/httpsqs_bug2_1.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<a href="http://blog.s135.com/attachment/201104/httpsqs_bug2_2.png" target="_blank"><img src="http://blog.s135.com/attachment/201104/httpsqs_bug2_2.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　<strong>3、改为父子进程模式，生产环境稳定性更高。</strong><br/><br/>　　<strong>4、改进了 ps 命令查看 httpsqs 的用户体验：</strong><br/><br/>　　<a href="http://blog.s135.com/attachment/201104/httpsqs_m_w.gif" target="_blank"><img src="http://blog.s135.com/attachment/201104/httpsqs_m_w.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　<strong>5、增加了密码校验功能（通过以下启动参数设置密码，通过URL参数“/?auth=密码”访问）：</strong><br/><br/>　　<a href="http://blog.s135.com/attachment/201104/httpsqs_auth.gif" target="_blank"><img src="http://blog.s135.com/attachment/201104/httpsqs_auth.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　<strong>6、改为静态编译，编译完成后的 HTTPSQS 二进制文件，运行不再依赖 Libevent、Tokyocabinet 动态链接库。</strong><br/><br/><hr/><br/>　　<strong>7、HTTPSQS 旧版本如何升级到 HTTPSQS 1.6 版本：</strong><br/><br/>　　HTTPSQS 1.6 版本完全兼容以前版本：编译安装 HTTPSQS 1.6，替换旧的 HTTPSQS，然后“kill httpsqs的进程ID”，按原来的启动参数启动 HTTPSQS 即可，数据完全兼容。<br/><br/><hr/><br/>　　<strong>二、客户端：</strong><br/><br/>　　<strong>1、客户端代码不再集成在 HTTPSQS 源码包中，可通过链接自行查看。</strong> <br/><br/><hr/><br/>　　<span style="font-size: 14px;"><span style="color: #FF0000;">HTTPSQS 1.6 版本的详细使用说明，请访问：</span> <a href="http://blog.s135.com/httpsqs/" target="_blank">http://blog.s135.com/httpsqs/</a></span><br/><br/><br/>Tags - <a href="http://blog.s135.com/tags/httpsqs/" rel="tag">httpsqs</a> , <a href="http://blog.s135.com/tags/http/" rel="tag">http</a> , <a href="http://blog.s135.com/tags/queue/" rel="tag">queue</a> , <a href="http://blog.s135.com/tags/queues/" rel="tag">queues</a> , <a href="http://blog.s135.com/tags/sqs/" rel="tag">sqs</a> , <a href="http://blog.s135.com/tags/memcacheq/" rel="tag">memcacheq</a> , <a href="http://blog.s135.com/tags/memcachedb/" rel="tag">memcachedb</a> , <a href="http://blog.s135.com/tags/activemq/" rel="tag">activemq</a> , <a href="http://blog.s135.com/tags/starling/" rel="tag">starling</a> , <a href="http://blog.s135.com/tags/amazonsqs/" rel="tag">amazonsqs</a> , <a href="http://blog.s135.com/tags/tokyocabinet/" rel="tag">tokyocabinet</a> , <a href="http://blog.s135.com/tags/simple/" rel="tag">simple</a> , <a href="http://blog.s135.com/tags/service/" rel="tag">service</a> , <a href="http://blog.s135.com/tags/%25E9%2598%259F%25E5%2588%2597/" rel="tag">队列</a> , <a href="http://blog.s135.com/tags/%25E7%25AE%2580%25E5%258D%2595%25E9%2598%259F%25E5%2588%2597/" rel="tag">简单队列</a> , <a href="http://blog.s135.com/tags/%25E6%25B6%2588%25E6%2581%25AF%25E9%2598%259F%25E5%2588%2597/" rel="tag">消息队列</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/samba_linux_windows/</link>
<title><![CDATA[快速配置 Samba 将 Linux 目录映射为 Windows 驱动器，用于跨平台编程]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[其他Unix技术]]></category>
<pubDate>Fri, 08 Apr 2011 00:53:45 +0000</pubDate> 
<guid>http://blog.s135.com/samba_linux_windows/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2011.04.08 转载请注明原文链接：<a href="http://blog.s135.com/samba_linux_windows/" target="_blank">http://blog.s135.com/samba_linux_windows/</a>]<br/><br/>　　<strong>一、局域网内的 Linux 服务器上操作步骤：</strong><br/><br/>　　1、安装samba（CentOS Linux）：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">yum install samba system-config-samba samba-client samba-common</div><br/><br/>　　2、创建www账号<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">/usr/sbin/groupadd www<br/>/usr/sbin/useradd -g www www<br/><br/>mkdir -p /data0/knose/<br/>chmod 777 /data0/knose/<br/><br/>mkdir -p /data0/htdocs/<br/>chown -R www:www /data0/htdocs/<br/>chmod 777 /data0/htdocs/<br/><br/>cat /etc/passwd &#124; mksmbpasswd.sh> /etc/samba/smbpasswd</div><br/><br/>　　3、创建samba配置文件<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">mv -f /etc/samba/smb.conf /etc/samba/smb.conf.bak<br/>vi /etc/samba/smb.conf</div><br/>　　输入以下内容：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">[global]<br/>server string = Samba Server<br/>security = user<br/>encrypt passwords = yes <br/>smb passwd file = /etc/samba/smbpasswd<br/><br/>[knose]<br/>workgroup = root<br/>netbios name = root<br/>path = /data0/knose<br/>browseable = yes<br/>writeable = yes<br/><br/>[web]<br/>workgroup = www<br/>netbios name = www<br/>path = /data0/htdocs<br/>browseable = yes<br/>writeable = yes</div></div><br/><br/>　　4、为samba用户www、root设立一个密码：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">smbpasswd -a www<br/>smbpasswd -a root</div><br/><br/>　　5、启动samba：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">/sbin/service smb start</div><br/><br/><hr/><br/>　　<strong>二、局域网内的 Windows 服务器上操作步骤：</strong><br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/samba/" rel="tag">samba</a> , <a href="http://blog.s135.com/tags/linux/" rel="tag">linux</a> , <a href="http://blog.s135.com/tags/windows/" rel="tag">windows</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/libevent_windows/</link>
<title><![CDATA[Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[Windows相关]]></category>
<pubDate>Wed, 30 Mar 2011 00:40:22 +0000</pubDate> 
<guid>http://blog.s135.com/libevent_windows/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2011.03.30 转载请注明原文链接：<a href="http://blog.s135.com/libevent_windows/" target="_blank">http://blog.s135.com/libevent_windows/</a>]<br/><br/>　　本文介绍了如何在 Windows 操作系统中，利用微软 Visual Studio 2005 编译生成 <a href="http://monkey.org/~provos/libevent/" target="_blank">Libevent</a> 2.0.10 静态链接库，并利用 <a href="http://monkey.org/~provos/libevent/" target="_blank">Libevent</a> 静态链接库，实现一个简单的 HTTP Web服务器程序：httpd.exe。<br/><br/>　　假设 Visual Studio 2005 的安装路径为“D:&#92;Program Files&#92;Microsoft Visual Studio 8&#92;”，<a href="http://monkey.org/~provos/libevent/" target="_blank">Libevent</a> 2.0.10 解压后的路径为“D:&#92;libevent-2.0.10-stable”。<br/><br/><hr/><br/>　　<strong>一、编译生成 Libevent 2.0.10 静态链接库。</strong><br/>　　<br/>　　1、修改“D:&#92;libevent-2.0.10-stable&#92;event_iocp.c”、“D:&#92;libevent-2.0.10-stable&#92;evthread_win32.c”、“D:&#92;libevent-2.0.10-stable&#92;listener.c”三个文件，在文件开头分别加上一行：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">#define _WIN32_WINNT 0x0500</div><br/><br/>　　2、鼠标点击Windows左下角的【开始】-【所有程序】，找到【Microsoft Visual Studio 2005】，执行下图中的脚本：<br/><br/>　　<a href="http://blog.s135.com/attachment/201103/libevent/libevent1.png" target="_blank"><img src="http://blog.s135.com/attachment/201103/libevent/libevent1.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>　　3、按照下图中的方法编译Libevent 2.0.10：<br/><br/>　　<a href="http://blog.s135.com/attachment/201103/libevent/libevent2.png" target="_blank"><img src="http://blog.s135.com/attachment/201103/libevent/libevent2.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>　　4、生成的“libevent.lib”、“libevent_core.lib”、“libevent_extras.lib”三个文件就是我们需要的 Libevent 静态链接库。<br/><br/>　　<a href="http://blog.s135.com/attachment/201103/libevent/libevent3.png" target="_blank"><img src="http://blog.s135.com/attachment/201103/libevent/libevent3.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><hr/><br/>　　<strong>二、利用 Libevent 静态链接库，实现一个简单的 HTTP Web服务器程序</strong><br/><br/>　　1、打开 Visual Studio 2005，新建一个项目<br/><br/>　　<a href="http://blog.s135.com/attachment/201103/libevent/libevent4.png" target="_blank"><img src="http://blog.s135.com/attachment/201103/libevent/libevent4.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/libevent/" rel="tag">libevent</a> , <a href="http://blog.s135.com/tags/windows/" rel="tag">windows</a> , <a href="http://blog.s135.com/tags/vs2005/" rel="tag">vs2005</a> , <a href="http://blog.s135.com/tags/visual/" rel="tag">visual</a> , <a href="http://blog.s135.com/tags/studio/" rel="tag">studio</a> , <a href="http://blog.s135.com/tags/lib/" rel="tag">lib</a> , <a href="http://blog.s135.com/tags/%25E9%259D%2599%25E6%2580%2581%25E9%2593%25BE%25E6%258E%25A5%25E5%25BA%2593/" rel="tag">静态链接库</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/459/</link>
<title><![CDATA[Windows 和 Linux 下生成以当前时间命名的文件]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Mon, 28 Feb 2011 07:33:09 +0000</pubDate> 
<guid>http://blog.s135.com/post/459/</guid> 
<description>
<![CDATA[ 
	　　在 Windows、Linux 操作系统，分别利用BAT批处理文件和Shell脚本，生成类似“20110228_082905.txt”以“年月日_时分秒”命名的文件。<br/><br/>　　Windows BAT批处理文件：<br/><div class="code">@echo off<br/>set time_hh=%time:~0,2%<br/>if /i %time_hh% LSS 10 (set time_hh=0%time:~1,1%)<br/>set filename=%date:~,4%%date:~5,2%%date:~8,2%_%time_hh%%time:~3,2%%time:~6,2%<br/>echo test &gt;&gt; %filename%.txt<br/></div><br/><br/>　　Linux Shell 脚本：<br/><div class="code">#!/bin/sh<br/>echo test &gt;&gt; $(date -d &quot;today&quot; +&quot;%Y%m%d_%H%M%S&quot;).txt<br/></div><br/>
]]>
</description>
</item>
</channel>
</rss>
