<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="Magike 1.1.1 Release" -->
<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/">
<channel>



<title><![CDATA[尼尔易]]></title>
<link>http://www.neilyi.cn</link>
<description>尼尔易的生活,尼尔易的世界,记录自己的点点滴滴,PHP,JS,jQuery等技术交流</description>
<language>zh-cn-utf8</language>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>Magike 1.1.1 Release</generator>
<webMaster></webMaster>
<item>
<title><![CDATA[我还能保持这种创意吗]]></title>
<link>http://www.neilyi.cn/archives/WoHaiNengBaoChiZheZhongChuangYiMa.html</link>
<comments>http://www.neilyi.cn/archives/WoHaiNengBaoChiZheZhongChuangYiMa.html#comments</comments>
<category><![CDATA[感  恩]]></category>
<guid>http://www.neilyi.cn/archives/WoHaiNengBaoChiZheZhongChuangYiMa.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Thu, 08 Dec 2011 22:22:17 -0700</pubDate>
<description><![CDATA[近期看到两个以前创意，别人做了，拿到不少投资。

一个三个前的想法，国内做了，拿到1000多万RMB投资。
另一个一个多前的想法，美国人刚做，拿到75万美元投资.

有些后悔当年自己为什么没动手。 真...]]></description>
<content:encoded><![CDATA[<p>近期看到两个以前创意，别人做了，拿到不少投资。</p><p>一个三个前的想法，国内做了，拿到1000多万RMB投资。<br />另一个一个多前的想法，美国人刚做，拿到75万美元投资.</p><p>有些后悔当年自己为什么没动手。 真怕随着年龄大了，自己没想法，没胆识了。</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/WoHaiNengBaoChiZheZhongChuangYiMa.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[nginx返回500状态]]></title>
<link>http://www.neilyi.cn/archives/nginxFanHui500ZhuangTai.html</link>
<comments>http://www.neilyi.cn/archives/nginxFanHui500ZhuangTai.html#comments</comments>
<category><![CDATA[PHP]]></category>
<guid>http://www.neilyi.cn/archives/nginxFanHui500ZhuangTai.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Mon, 12 Sep 2011 08:04:16 -0700</pubDate>
<description><![CDATA[很遇外，今天发现某站nginx返回500状态。 html源码看和200正常状态无异。

后分析后端php代码，断点排查后，是由于dede的模板上，某个用法不当。

对于dede模板机制一直不是很满意。...]]></description>
<content:encoded><![CDATA[<p>很遇外，今天发现某站nginx返回500状态。 html源码看和200正常状态无异。</p><p>后分析后端php代码，断点排查后，是由于dede的模板上，某个用法不当。</p><p>对于dede模板机制一直不是很满意。早放弃使用dedecms了。</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/nginxFanHui500ZhuangTai.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[人生哲理]]></title>
<link>http://www.neilyi.cn/archives/RenShengZheLi.html</link>
<comments>http://www.neilyi.cn/archives/RenShengZheLi.html#comments</comments>
<category><![CDATA[感  恩]]></category>
<guid>http://www.neilyi.cn/archives/RenShengZheLi.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Sun, 11 Sep 2011 18:10:51 -0700</pubDate>
<description><![CDATA[知人不必言尽，留三分余地于人，留些口德于己；
责人不必苛尽，留三分余地于人，留些肚量于己；
才能不必傲尽，留三分余地于人，留些内涵于己；
锋芒不必露尽，留三分余地于人，留些收敛于己；
有功不必邀尽，留...]]></description>
<content:encoded><![CDATA[<p>知人不必言尽，留三分余地于人，留些口德于己； <br />责人不必苛尽，留三分余地于人，留些肚量于己； <br />才能不必傲尽，留三分余地于人，留些内涵于己； <br />锋芒不必露尽，留三分余地于人，留些收敛于己； <br />有功不必邀尽，留三分余地于人，留些谦让于己； <br />得理不必抢尽，留三分余地于人，留些宽容于己； <br />得宠不必恃尽，留三分余地于人，留些后路于己； <br />气势不必倚尽，留三分余地于人，留些厚道于己； <br />富贵不必享尽，留三分余地于人，留些福择于己； <br />凡事不必做尽，留三分余地于人，留些余德于己。</p><p>面对失败和挫折，一笑而过是一种乐观自信，然后重振旗鼓，这是一种勇气心。 <br />面对误解和仇恨，一笑而过是一种坦然宽容，然后保持本色，这是一种达观心。 <br />面对赞扬和激励，一笑而过是一种谦虚清醒，然后不断进取，这是一种力量心。 <br />面对烦恼和忧愁，一笑而过是一种平和释然，然后努力化解，这是一种境界心。</p><p>用心写一个家字：一笔一划，点撇横捺，正好十笔，必得十全十美，才写出一个圆满。 <br />用情写一个家字：游子千里，总有牵挂，经经纬纬，编织一生凉热，才写好一个思念。 <br />用日子写一个家字：淡饭粗茶，酸甜苦辣，和美是暖，经过四季寒暑的心情日子，才写好一个春天。</p><p>人生八宝: <br />1，结交两个好友，运动场，图书馆； <br />2，配备两个医生，运动，乐观 <br />3，练好两项本事，做人，做事； <br />4，多吃两样东西，吃亏，吃苦； <br />5，构建两个支柱，人文知识，科学素养； <br />6，追求两个一致，兴趣和事业一致，爱情和婚姻一致； <br />7，记住两个秘诀，健康秘诀在早上，成功秘诀在晚上； <br />8，争取两个极致，把潜力发挥到极致，把生命延续到极致！！</p><p>生活三宝: <br />大自然三宝：阳光、空气、水。 <br />说话的三宝：请、谢谢、对不起。 <br />处世的三宝：谦虚、礼貌、赞叹。 <br />修养的三宝：安静、慈祥、沉稳。 <br />家庭的三宝：欢喜、幽默、体贴。 <br />齐家的三宝：和气、和乐、和平。 <br />饮食的三宝：均衡、节制、感恩。 <br />健康的三宝：步行、少欲、气和。</p><p>睡眠的三宝：要放下、不妄想、吉祥卧。 <br />旅行的三宝：增广见闻、安全欢喜、简朴节用。 <br />理财的三宝：确立预算、开源节流、勤俭正当。 <br />学问的三宝：活用、广博、实在。 <br />治学的三宝：勤读、勤写、勤思。 <br />学习的三宝：倾听、接受、思维。 <br />交友的三宝：诚信、正直、贡献。 <br />人心的三宝：真实、善良、宽容 面对失败和挫折，一笑而过是一种乐观自信，然后重振旗鼓，这是一种勇气心。</p><p>哭，并不代表我屈服；<br />退一步，并不象征我认输；<br />放手，并不表示我放弃； <br />微笑，并不意味我快乐! <br />我们总喜欢去验证别人对我们许下的诺言，却很少去验证自己给自己许下的诺言。<br />走向最远的方向——哪怕前路迷茫；<br />抱着最大的希望——哪怕山穷水尽；<br />坚持最强的意志——哪怕刀山火海；<br />做好最坏的打算——哪怕从头再来。 <br />别和我谈理想，戒了 ！ <br />曾经拥有的，不要忘记；<br />已经得到的，更要珍惜；<br />属于自己的，不要放弃；<br />已经失去的，留着回忆；<br />想要得到的，必须努力；</p><p>但最重要的，是好好爱惜自己!<br />去一个地方，想念一个地方，都是因为那里的人， 而不是那里的风景，一个城市会跟自己联系起來，也是因为那里有和自己相同的人，有你放不下的人，很多时候，我喜欢了别人，她却不知道；更多时候，我伤害了别人，我却不知道。<br />喜欢，是淡淡的爱；爱，是深深的喜欢…… <br />做错了——改正一下；<br />伤心了——痛哭一下；<br />厌倦了——回望一下；<br />活累了——休息一下；<br />绝望了——无奈一下。<br />在爱情没开始以前，你永远想象不出会那样地爱一个人； <br />在爱情没结束以前，你永远想象不出那样的爱也会消失；<br />在爱情被忘却以前，你永远想象不出那样刻骨铭心的爱也会只留淡淡痕迹；<br />在爱情重新开始以前，你永远想象不出还能再一次找到那样的爱情 。 <br />无论我在哪里，我离你只有一个转身的距离。 <br />孤独时，寂寞做伴……</p><p>时间可以筛选出真正留意的人... <br />在爱的世界里，没有谁对不起谁，只有谁不懂得珍惜谁！<br />爱，就大声说出来，因为你永远都不会知道，明天和意外，哪个会先来！ <br />恋爱就像口香糖，时间长了会平淡无味，觉得平淡了就想放弃，而无论丢在什麽地方，都会留下难以抹去的痕迹。 <br />最浪漫的三个字，不是“我爱你”，而是“在一起”。<br />因为想一个人而寂寞， 因为爱一个人而温柔；<br />因为有一个梦而执着， 因为等一个人而折磨；<br />想去履行曾经的诺言.....</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/RenShengZheLi.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[burst实惠便宜的vps,可加ip]]></title>
<link>http://www.neilyi.cn/archives/burstShiHuiBianYiDevps-KeJiaip.html</link>
<comments>http://www.neilyi.cn/archives/burstShiHuiBianYiDevps-KeJiaip.html#comments</comments>
<category><![CDATA[Freebsd/unix/linux]]></category>
<guid>http://www.neilyi.cn/archives/burstShiHuiBianYiDevps-KeJiaip.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Fri, 12 Aug 2011 07:43:40 -0700</pubDate>
<description><![CDATA[burst国内又称84,同时也做独服(毒妇)，国人比较多牛人站在那边,其vps的几大亮点:
1. 国际大idc公司，自己的机房
2. vps低价，并且洛杉矶机房有货(这是对做国内站的朋友是个宝，到国内...]]></description>
<content:encoded><![CDATA[<p>burst国内又称84,同时也做独服(毒妇)，国人比较多牛人站在那边,其vps的几大亮点:<br />1. 国际大idc公司，自己的机房<br />2. vps低价，并且洛杉矶机房有货(这是对做国内站的朋友是个宝，到国内的速度非常给力)<br />3. 加ip容易，价格差不多是最便宜的了 （1$不到。好像是3.5$能加5个一组）。</p><p>推荐几款，价格不错，可以直接点击购买。<br />1.强烈推荐款:<br /><a href="https://service.burst.net/aff2.php?aff=2762&affurl=5">月付5.59$(年付优惠送两个月)</a><br />特点: 512M内存，20G硬盘，2个IP。 非常给力</p><p>其它空了再写上来</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/burstShiHuiBianYiDevps-KeJiaip.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[用keelalived保证你的web以及数据库高可用性]]></title>
<link>http://www.neilyi.cn/archives/YongkeelalivedBaoZhengNiDewebYiJiShuJuKuGaoKeYongXing.html</link>
<comments>http://www.neilyi.cn/archives/YongkeelalivedBaoZhengNiDewebYiJiShuJuKuGaoKeYongXing.html#comments</comments>
<category><![CDATA[客户端技术]]></category>
<guid>http://www.neilyi.cn/archives/YongkeelalivedBaoZhengNiDewebYiJiShuJuKuGaoKeYongXing.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Wed, 08 Jun 2011 19:20:02 -0700</pubDate>
<description><![CDATA[在用lvs或者其它方案做了负载均衡后，还要保证你的服务具有高可用性，这时可以选择keelalived。

keelalived简介：

keepalived是一个类似于layer3, 4 & 5交换机...]]></description>
<content:encoded><![CDATA[<p>在用lvs或者其它方案做了负载均衡后，还要保证你的服务具有高可用性，这时可以选择keelalived。</p><p>keelalived简介：</p><p>keepalived是一个类似于layer3, 4 & 5交换机制的软件，也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态，如果有一台web服务器死机，或工作出现故障，Keepalived将检测到，并将有故障的web服务器从系统中剔除，当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中，这些工作全部自动完成，不需要人工干涉，需要人工做的只是修复故障的web服务器</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/YongkeelalivedBaoZhengNiDewebYiJiShuJuKuGaoKeYongXing.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[mongodb使用须知]]></title>
<link>http://www.neilyi.cn/archives/mongodbShiYongXuZhi.html</link>
<comments>http://www.neilyi.cn/archives/mongodbShiYongXuZhi.html#comments</comments>
<category><![CDATA[网络价值研究]]></category>
<guid>http://www.neilyi.cn/archives/mongodbShiYongXuZhi.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Thu, 26 May 2011 19:30:08 -0700</pubDate>
<description><![CDATA[这里为不完全总结，空了再整理以前的文档。

1: 修改默认端口
2：设置监听IP
3：一定装在64位操作系统时 （32位上，一个mongod进程所能管理的数据不超过2G，另有说法不能超过2.5G）

...]]></description>
<content:encoded><![CDATA[<p>这里为不完全总结，空了再整理以前的文档。</p><p>1: 修改默认端口<br />2：设置监听IP<br />3：一定装在64位操作系统时 （32位上，一个mongod进程所能管理的数据不超过2G，另有说法不能超过2.5G）</p><p>关于2G问题，请看这里 http://server.it168.com/server/2005-11-24/20051124122201.shtml</p><p>4：最好能在iptables等防火墙上，限制连接IP</p><p><a href="http://www.neilyi.cn">neilyi.cn</a></p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/mongodbShiYongXuZhi.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[memcached使用须知]]></title>
<link>http://www.neilyi.cn/archives/memcachedShiYongXuZhi.html</link>
<comments>http://www.neilyi.cn/archives/memcachedShiYongXuZhi.html#comments</comments>
<category><![CDATA[技术安全]]></category>
<guid>http://www.neilyi.cn/archives/memcachedShiYongXuZhi.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Thu, 26 May 2011 19:27:47 -0700</pubDate>
<description><![CDATA[1: 使用iptables等防火墙，限制可访问IP。 （最重要）
2： 修改默认端口
3： 使用-m参数设置使用最大内存上限 （默认64M）

其它，以后再补充
neilyi.cn]]></description>
<content:encoded><![CDATA[<p>1: 使用iptables等防火墙，限制可访问IP。 （最重要）<br />2： 修改默认端口<br />3： 使用-m参数设置使用最大内存上限 （默认64M）</p><p>其它，以后再补充<br /><a href="http://www.neilyi.cn">neilyi.cn</a></p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/memcachedShiYongXuZhi.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[【转】在中国做唱片怎么赚钱]]></title>
<link>http://www.neilyi.cn/archives/ZhuanZaiZhongGuoZuoChangPianZenMeZuanQian.html</link>
<comments>http://www.neilyi.cn/archives/ZhuanZaiZhongGuoZuoChangPianZenMeZuanQian.html#comments</comments>
<category><![CDATA[感  恩]]></category>
<guid>http://www.neilyi.cn/archives/ZhuanZaiZhongGuoZuoChangPianZenMeZuanQian.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Thu, 05 May 2011 01:01:43 -0700</pubDate>
<description><![CDATA[前两天，看到一博同学人人状态上写的，某歌手刚出了新专辑，没两天某人渣音乐网站上就可以下载到MP3了，他不禁感叹在中国做唱片如何赚钱。

我以为，他的理解大错特错了，有些事情是赚钱的，有些事情是赚吆喝的...]]></description>
<content:encoded><![CDATA[<code><span style="color: #000000">
前两天，看到一博同学人人状态上写的，某歌手刚出了新专辑，没两天某人渣音乐网站上就可以下载到MP3了，他不禁感叹在中国做唱片如何赚钱。<br /><br />我以为，他的理解大错特错了，有些事情是赚钱的，有些事情是赚吆喝的。在这片神奇的土地上，你指望着专心做好一件事情，是不可能“成功"的（这里的成功加了引号，是指这片土地上的普遍价值观的成功）。歌手出个专辑，卖的很贵阿，盗版不要钱阿。歌手虽然没有从盗版商那里直接得到Money，可盗版厂商比什么索尼阿、环球阿等鸟公司都更好的宣传了歌手，这下歌手火了，各种广告、商业演出应接不暇，前段时间看过一个对周杰伦的采访，周说现在做唱片根本不赚钱，就是赚个名声。显然周大侠境界更高一些，火了之后随便搞，赚钱的路子很多嘛。<br /><br />百度搜索是不要钱的，排在第一的假药是收费的；<br /><br />QQ聊天是不要钱的，赤橙黄绿青蓝紫钻是收费的；<br /><br />前两天，周鸿祎带着360去美国上市，管这叫中国式创新。<br /><br />几千年来各种外来侵略者对我大中华区局域网垂涎三尺，没有一个能得手的，最终搞死中国人的一定是中国人</span>
</code>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/ZhuanZaiZhongGuoZuoChangPianZenMeZuanQian.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[PHP服务端推送技术Long Polling]]></title>
<link>http://www.neilyi.cn/archives/PHPFuWuDuanTuiSongJiShuLong-Polling.html</link>
<comments>http://www.neilyi.cn/archives/PHPFuWuDuanTuiSongJiShuLong-Polling.html#comments</comments>
<category><![CDATA[PHP]]></category>
<guid>http://www.neilyi.cn/archives/PHPFuWuDuanTuiSongJiShuLong-Polling.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Fri, 29 Apr 2011 08:10:01 -0700</pubDate>
<description><![CDATA[Long Polling与Polling概述
服务端推送技术应用越来越普遍，应用范围也越来越宽广，技术解决方案也越来越成熟且丰富。很多SNS网站的chat功能就有用到了Long Polling技术。比...]]></description>
<content:encoded><![CDATA[<p>Long Polling与Polling概述<br />服务端推送技术应用越来越普遍，应用范围也越来越宽广，技术解决方案也越来越成熟且丰富。很多SNS网站的chat功能就有用到了Long Polling技术。比如fackebook, kaixin001。</p><p>Long Polling原理其实很简单，也很讨巧。与Polling相比，Long Polling客户端也许不会马上收到来自服务端的响应，需要等待一些时间(直到有新消息，或者连接timeout了等等)。同样的，客户端也不再需要定时向服务发送请求了，而是直到收到服务端响应之后，或者连接丢失之后，客户端接着马上请求客户端。这里，我打个比方，传统的Polling一般是由C向S 询问:”有我的信件吗？”。S接到询问之后，会立即查询，并且把查询结果告诉C，不管有没有C的信件，要码回复:”嗯，你有X封信。”，要码回复:”没，没有你的信”.而Long Polling更像是这样，C向S发出询问:”有我的信件吗？”，S开始查询，如果有则回复C:”嗯，有你x封信”。如果没有，则不作任何回复，而是让C 等着，自己一遍一遍地查询是否有订阅者的信。换句话说：当S收到C的查询请求之后，Polling则只查询一次，并且把查询结果告诉C;而Long Polling收到请求之后，则会一遍一遍地查询，直到有消息才会响应C，不然一直hold Client。</p><p>Long Polling相较传统的Polling而言，最大的实惠在于：减少了请求次数。举个例子，假定一个用户每2小时内，有可能收到2条新消息。如果采用传通的Polling方式，每30秒发向服务端发送一次查询请求的话。则在这2小时内，服务器需要处理240(60*60*2/30)次请求，其中至少有 238次请求是没有实际意义的。试想，如果是10000的并发量的话，这种浪费是很惊人的。相较而方，Long Polling没有那么浪费服务器资源来处理这些没有实际意义的请求。</p><p>Polling<br />传统的Polling实现方式比较单一，由客户端javascript脚本定时发送http请求。服务端脚本如下:</p><p>view plaincopy to clipboardprint?<br />header("Expires: Sun, 19 Nov 1978 05:00:00 GMT");   <br />header("Last-Modified: ". gmdate("D, d M Y H:i:s") ." GMT");   <br />header("Cache-Control: store, no-cache, must-revalidate");   <br />header("Cache-Control: post-check=0, pre-check=0", FALSE);   <br />    <br />$msg = get_msg();   <br />if ($msg) {   <br /> echo $msg;   <br />} else {   <br /> echo '0';   <br />}</p><p>上面是一个传统polling简单的服务端脚本。很简单，收到客户端请求后，服务端马上执行脚本查询，并且立即响应客户端。客户端等待的时间很短，客户端唯一要做的事情就是定时向服务端发出查询请求。下面是请求时，通过tcpdump抓到的包:</p><p>1>17:49:03.533760 IP 192.168.0.98.4383 > devhome.http: S 3235664319:3235664319(0) win 65535 <mss op,nop,sackOK><br />2>17:49:03.534336 IP devhome.http > 192.168.0.98.4383: S 2018732723:2018732723(0) ack 3235664320 win 5840 <mss 1460,nop,nop,sackOK><br />3>17:49:03.533841 IP 192.168.0.98.4383 > devhome.http: . ack 1 win 65535<br />4>17:49:03.534404 IP 192.168.0.98.4383 > devhome.http: P 1:781(780) ack 1 win 65535<br />5>17:49:03.534416 IP devhome.http > 192.168.0.98.4383: . ack 781 win 7020<br />6>17:49:03.535033 IP devhome.http > 192.168.0.98.4383: P 1:369(368) ack 781 win 7020<br />7>17:49:03.535110 IP devhome.http > 192.168.0.98.4383: F 369:369(0) ack 781 win 7020<br />8>17:49:03.535263 IP 192.168.0.98.4383 > devhome.http: . ack 370 win 65167<br />9>17:49:03.536105 IP 192.168.0.98.4383 > devhome.http: F 781:781(0) ack 370 win 65167<br />10>17:49:03.536111 IP devhome.http > 192.168.0.98.4383: . ack 782 win 7020</p><p>第1、2、3行，TCP三次握手，建立连接。<br />第4行，由192.168.0.98向服务端devhome发送httpd请求。<br />第5行，由服务端devhome确认收到了来自客户端192.168.0.98的http请求。<br />第6行，服务器响devhom响应客户端192.168.0.98刚才发的httpd请求。注意:特别注意一下第一列时间截，http请求与http响应的时间间隔很短，才0.001s<br />第7、8、9、10共4行，TCP四次挥手，断开连接。由服务端主动断开连接。</p><p>Long Polling<br />Long Polling较之Polling稍微有些不一样，Long Polling持续执行，以此延迟对客户端的响应。请查看代码:</p><p>view plaincopy to clipboardprint?<br />header("Expires: Sun, 19 Nov 1978 05:00:00 GMT");   <br />header("Last-Modified: ". gmdate("D, d M Y H:i:s") ." GMT");   <br />header("Cache-Control: store, no-cache, must-revalidate");   <br />header("Cache-Control: post-check=0, pre-check=0", FALSE);   <br />//在$timeout之后，关闭连接，并且要求客户3秒后重新请求   <br />for ($i = 0, $timeout = 60; $i < $timeout; $i++ ) {   <br /> $msg = get_msg();   <br /> if ($msg) {   <br />     echo json_encode(array('t' => 'info' , 'c' => $msg));   <br />     flush();   <br />     exit(0);   <br /> }     <br /> usleep(3000000);   <br />}   <br />echo json_encode(array('t' => 'refresh', 'c' => 3000));   <br />flush();  <br />上面是Long Polling服务端代码。语意也很明了，如果有$msg，则会马上响应客户端请求，并且关闭该TCP连接。如果在$timeout之内，没有$msg，则会让客户端一直保持该TCP连接，不中断(关闭)。直到超过了$timeout(具体时间主要取决于$timeout * $usleep_time)，服务端会要求客户端重新请求(重新建立TCP连接)，同时关闭当前TCP连接。下面是通过 tcpdump抓到的包:</p><p>1>18:39:46.449563 IP 192.168.0.98.4407 > devhome.http: S 174149200:174149200(0) win 65535 <mss 1460,nop,nop,sackOK><br />2>18:39:46.449587 IP devhome.http > 192.168.0.98.4407: S 938669730:938669730(0) ack 174149201 win 5840 <mss 1460,nop,nop,sackOK><br />3>18:39:46.449692 IP 192.168.0.98.4407 > devhome.http: . ack 1 win 65535<br />4>18:39:46.450308 IP 192.168.0.98.4407 > devhome.http: P 1:793(792) ack 1 win 65535<br />5>18:39:46.450320 IP devhome.http > 192.168.0.98.4407: . ack 793 win 7128<br />6>18:42:46.521749 IP devhome.http > 192.168.0.98.4407: P 1:377(376) ack 793 win 7128<br />7>18:42:46.521825 IP devhome.http > 192.168.0.98.4407: P 377:412(35) ack 793 win 7128<br />8>18:42:46.521859 IP devhome.http > 192.168.0.98.4407: F 412:412(0) ack 793 win 7128<br />9>18:42:46.521997 IP 192.168.0.98.4407 > devhome.http: . ack 412 win 65124<br />10>18:42:46.522021 IP 192.168.0.98.4407 > devhome.http: . ack 413 win 65124<br />11>18:42:46.522965 IP 192.168.0.98.4407 > devhome.http: F 793:793(0) ack 413 win 65124<br />12>18:42:46.522970 IP devhome.http > 192.168.0.98.4407: . ack 794 win 7128</p><p>第1、2、3行，TCP三次握手，建立连接。<br />第4行，由192.168.0.98向服务端192.168.0.6发送http请求。<br />第5行，由192.168.0.6确认收到192.168.0.98刚刚发送的请求。<br />第6、7行，服务器host_6响应3分钟前客户端192.168.0.98发出的http请求。注意，第一列的时间截，第5行与第6行之差为3分钟。这与服务端脚本，客户端监控是相呼应的。<br />最后4行，TCP四次挥手，断开连接，同样由服务端devhome发起。</p><p>由上图可见(httpwatch绘制),正好验证了，响应客户端host_98的http请求，在3分钟之后。这也说明了，Long Polling与Polling的区别在于，客户端有可能需要等待更长时间才能收到服务端的响应。</p><p>NeiLyi注： long polling关键一定要设置超时，要不客户端已经退了，而服务端如果不知道，就一直在查询。（如：用户关闭浏览器）</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/PHPFuWuDuanTuiSongJiShuLong-Polling.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[php操作内存，共享内存，基于内存的消息队列操作]]></title>
<link>http://www.neilyi.cn/archives/phpCaoZuoNeiCun-GongXiangNeiCun-JiYuNeiCunDeXiaoXiDuiLieCaoZuo.html</link>
<comments>http://www.neilyi.cn/archives/phpCaoZuoNeiCun-GongXiangNeiCun-JiYuNeiCunDeXiaoXiDuiLieCaoZuo.html#comments</comments>
<category><![CDATA[PHP]]></category>
<guid>http://www.neilyi.cn/archives/phpCaoZuoNeiCun-GongXiangNeiCun-JiYuNeiCunDeXiaoXiDuiLieCaoZuo.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Thu, 28 Apr 2011 20:40:16 -0700</pubDate>
<description><![CDATA[php作为脚本程序，通常生命周期都很短，如在web应用中，一次请求就是php运行的一个周期，请求结束则生命周期截止。所以php在处理需要共享的资源时，一般会将共享数据保存在数据库或dbm之类的文件中，...]]></description>
<content:encoded><![CDATA[<p><p>php作为脚本程序，通常生命周期都很短，如在web应用中，一次请求就是php运行的一个周期，请求结束则生命周期截止。所以php在处理需要共享的资源时，一般会将共享数据保存在数据库或dbm之类的文件中，再者就是利用内存实现共享。你可以选择已有的工具辅助你，像memcache；也可以自己编写代码访问操作系统的共享内存段。</p><br /><p>php中对共享内存段的操作有两组函数：<a href="http://cn.php.net/manual/en/book.sem.php">System V IPC</a>和<a href="http://cn.php.net/manual/en/book.shmop.php">Shared Memory</a>。其中System V IPC系列函数能够更方便的操作数据，无需像Shared Memory那样必须自己掌握读写时的偏移量、长度等，也不用序列化/反序列化来回转换（因为Shared Memory函数只支持字符串格式的数据参数）。但是System V IPC系列不支持Windows，所以如果要在win环境下使用，只能选Shared Memory。</p><br /><p>因为php默认不支持这些函数，所以需要重编译php。如要使用：<br /><br />System V信号量，编译时加上 &#8211;enable-sysvsem<br /><br />System V共享内存，编译时加上 &#8211;enable-sysvshm<br /><br />System V消息队列，编译时加上 &#8211;enable-sysvmsg<br /><br />Shared Memory，编译时加上 &#8211;enable-shmop</p><br /><p>先写个Shared Memory的例子：</p><br /> <br /><div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #7F0055; font-weight: bold;">&lt;?php</span><br /><span style="color: #000088;">$key</span> <span style="color: #000000;">=</span> <span style="color: #990000;">ftok</span><span style="color: #009900;">&#40;</span><span style="color: #7F0055; font-weight: bold;">__FILE__</span><span style="color: #000000;">,</span> <span style="color: #0000ff;">'i'</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #000088;">$size</span> <span style="color: #000000;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #000000;">;</span><br /><span style="color: #000088;">$shm_h</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #990000;">shmop_open</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #000000;">,</span> <span style="color: #0000ff;">'c'</span><span style="color: #000000;">,</span> <span style="color: #208080;">0644</span><span style="color: #000000;">,</span> <span style="color: #000088;">$size</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #7F0055;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span> <span style="color: #000000;">===</span> <span style="color: #7F0055; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;shmop open failed&quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #990000;">exit</span><span style="color: #000000;">;</span><br /><span style="color: #009900;">&#125;</span><br /><span style="color: #000088;">$data</span> <span style="color: #000000;">=</span> <span style="color: #990000;">shmop_read</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #000000;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #000000;">,</span> <span style="color: #000088;">$size</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #000088;">$data</span> <span style="color: #000000;">=</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #666666; font-style: italic;">//如果没有数据则写一个</span><br /><span style="color: #7F0055;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;there is no data&quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #000088;">$data</span> <span style="color: #000000;">=</span> <span style="color: #0000ff;">&quot;imdonkey&quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #666666; font-style: italic;">//就算数据是文本，write时也要序列化</span><br />        <span style="color: #000088;">$write_size</span> <span style="color: #000000;">=</span> <span style="color: #990000;">shmop_write</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #000000;">,</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br />        <span style="color: #7F0055;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$write_size</span> <span style="color: #000000;">===</span> <span style="color: #7F0055; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;shmop write failed!&quot;</span><span style="color: #000000;">;</span><br /><span style="color: #009900;">&#125;</span><br /><span style="color: #666666; font-style: italic;">//如果有，显示出来，之后删掉</span><br /><span style="color: #7F0055;">else</span> <span style="color: #009900;">&#123;</span><br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;shared memory data: &quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br />        <span style="color: #990000;">shmop_delete</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #009900;">&#125;</span><br /><span style="color: #990000;">shmop_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div><br /> <br /><p>再写个System V shm的例子：</p><br /> <br /><div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #7F0055; font-weight: bold;">&lt;?php</span> <br /><span style="color: #000088;">$shm_key</span> <span style="color: #000000;">=</span> <span style="color: #990000;">ftok</span><span style="color: #009900;">&#40;</span><span style="color: #7F0055; font-weight: bold;">__FILE__</span><span style="color: #000000;">,</span> <span style="color: #0000ff;">'i'</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #000088;">$memsize</span> <span style="color: #000000;">=</span> <span style="color: #cc66cc;">120</span><span style="color: #000000;">;</span><br /><span style="color: #000088;">$shm_h</span> <span style="color: #000000;">=</span> <span style="color: #990000;">shm_attach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_key</span><span style="color: #000000;">,</span> <span style="color: #000088;">$memsize</span><span style="color: #000000;">,</span> <span style="color: #208080;">0644</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #7F0055;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span> <span style="color: #000000;">===</span> <span style="color: #7F0055; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;shmop open failed&quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #990000;">exit</span><span style="color: #000000;">;</span><br /><span style="color: #009900;">&#125;</span><br /><span style="color: #000088;">$var_key</span> <span style="color: #000000;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #000000;">;</span><br /><span style="color: #000088;">$data</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #990000;">shm_get_var</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #000000;">,</span> <span style="color: #000088;">$var_key</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #7F0055;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />        <span style="color: #000088;">$data</span> <span style="color: #000000;">=</span> <span style="color: #0000ff;">&quot;imdonkey&quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;there is no data, insert <span style="color: #006699; font-weight: bold;">$data</span>.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #990000;">shm_put_var</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #000000;">,</span> <span style="color: #000088;">$var_key</span><span style="color: #000000;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #009900;">&#125;</span> <span style="color: #7F0055;">else</span> <span style="color: #009900;">&#123;</span><br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;find data: <span style="color: #006699; font-weight: bold;">$data</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000000;">;</span><br />        <span style="color: #990000;">shm_remove_var</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #000000;">,</span> <span style="color: #000088;">$var_key</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #009900;">&#125;</span><br /><span style="color: #990000;">shm_detach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shm_h</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span><br /><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div><br /> <br /><p>可以看到，sysV对于每个数据都另外设立了对应的var_key，这样在同一内存区域可以保存多个数据，而不用像shmop中那样再申请另外一个共享内存区域，还免除了序列化的干扰（虽然数据最终还是以序列化的形式保存，但不用开发者去手动实现）。</p><br /><p>例子虽然简单，但也有一些需要注意的地方，不管是shm_attach还是shmop_open，所申请的内存的大小一定要满足后面数据的体积，这个体积包括数据本身序列化后的长，还有php添加的少量header信息。php官方文档中有人提出了一种计算要申请的内存大小的公式，这个公式可以保证所申请的内存足够存储<strong>一个</strong>指定的数据。公式如下：</p><br /> <br /><div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//当shm_attach第一次被调用时，php向共享内存写入一个header</span><br /><span style="color: #000088;">$shmHeaderSize</span> <span style="color: #000000;">=</span> <span style="color: #009900;">&#40;</span>PHP_INT_SIZE <span style="color: #000000;">*</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #000000;">+</span> <span style="color: #cc66cc;">8</span><span style="color: #000000;">;</span><br /><span style="color: #666666; font-style: italic;">//当shm_put_var调用时，php会在序列化后的数据前面，加一个header</span><br /><span style="color: #000088;">$shmVarSize</span> <span style="color: #000000;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$foo</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span> <span style="color: #000000;">*</span> PHP_INT_SIZE<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000;">/</span><span style="color: #cc66cc;">4</span> <span style="color: #009900;">&#41;</span> <span style="color: #000000;">*</span> <span style="color: #cc66cc;">4</span> <span style="color: #009900;">&#41;</span> <span style="color: #000000;">+</span> <span style="color: #cc66cc;">4</span><span style="color: #000000;">;</span><br /><span style="color: #000088;">$memsize</span> <span style="color: #000000;">=</span> <span style="color: #000088;">$shmHeaderSize</span> <span style="color: #000000;">+</span> <span style="color: #000088;">$shmVarSize</span><span style="color: #000000;">;</span></pre></div></div><br /> <br /><p>这个公式是否适用于所有情况，我不敢说，所以我想最好还是在程序中，将准备放入共享内存的数据结构设计好，尽量保证数据大小在某一范围内。</p><br /><p>还有就是为了防止共享内存被浪费，当数据无用时及时调用对应的remove方法释放资源。</p><br /><p>介绍完共享内存再顺带提一下消息队列Message Queue（也是在<a href="http://cn.php.net/manual/en/book.sem.php">System V IPC</a>函数组中），消息队列似乎可以视为另一种共享内存，只是数据存储的方式有些不同。简单来说，就是每个key对应一个队列，每个队列可以保存多个数据，数据间按照先进先出的原则进行操作。php文档中的例子很好的介绍了各函数的应用：</p><br /> <br /><div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #7F0055; font-weight: bold;">&lt;?php</span> <br /><span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$argv</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">&lt;</span><span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;Usage: <span style="color: #006699; font-weight: bold;">$argv[0]</span> stat|send|receive|remove msgType MSG [msg] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;   EX: <span style="color: #006699; font-weight: bold;">$argv[0]</span> send 1 <span style="color: #000099; font-weight: bold;">\&quot;</span>This is no 1<span style="color: #000099; font-weight: bold;">\&quot;</span> <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;       <span style="color: #006699; font-weight: bold;">$argv[0]</span> receive ID <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;       <span style="color: #006699; font-weight: bold;">$argv[0]</span> stat <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;       <span style="color: #006699; font-weight: bold;">$argv[0]</span> remove <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">;</span> <br />        <span style="color: #990000;">exit</span><span style="color: #000000;">;</span> <br /><span style="color: #009900;">&#125;</span> <br /> <br /><span style="color: #000088;">$MSGKey</span> <span style="color: #000000;">=</span> <span style="color: #0000ff;">&quot;123456&quot;</span> <span style="color: #000000;">;</span> <br /><span style="color: #000088;">$seg</span> <span style="color: #000000;">=</span> msg_get_queue<span style="color: #009900;">&#40;</span><span style="color: #000088;">$MSGKey</span><span style="color: #009900;">&#41;</span> <span style="color: #000000;">;</span> <br /> <br /><span style="color: #7F0055;">switch</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$argv</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />    <span style="color: #7F0055;">case</span> <span style="color: #0000ff;">&quot;send&quot;</span><span style="color: #000000;">:</span> <br />        msg_send<span style="color: #009900;">&#40;</span><span style="color: #000088;">$seg</span><span style="color: #000000;">,</span> <span style="color: #000088;">$argv</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #000000;">,</span> <span style="color: #000088;">$argv</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;msg_send done...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">break</span><span style="color: #000000;">;</span> <br /> <br />    <span style="color: #7F0055;">case</span> <span style="color: #0000ff;">&quot;receive&quot;</span><span style="color: #000000;">:</span> <br />        <span style="color: #000088;">$stat</span> <span style="color: #000000;">=</span> msg_stat_queue<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$seg</span> <span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">'Messages in the queue: '</span><span style="color: #000000;">.</span><span style="color: #000088;">$stat</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'msg_qnum'</span><span style="color: #009900;">&#93;</span><span style="color: #000000;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$stat</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'msg_qnum'</span><span style="color: #009900;">&#93;</span><span style="color: #000000;">&gt;</span><span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />            msg_receive<span style="color: #009900;">&#40;</span><span style="color: #000088;">$seg</span><span style="color: #000000;">,</span> <span style="color: #000088;">$argv</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #000000;">,</span> <span style="color: #000088;">$msgtype</span><span style="color: #000000;">,</span> <span style="color: #cc66cc;">1024</span><span style="color: #000000;">,</span> <span style="color: #000088;">$data</span><span style="color: #000000;">,</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">,</span> MSG_IPC_NOWAIT<span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span> <br />            <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msgtype</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span> <br />            <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span> <br />            <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000000;">;</span> <br />        <span style="color: #009900;">&#125;</span> <br />        <span style="color: #7F0055;">else</span> <span style="color: #009900;">&#123;</span> <br />            <span style="color: #7F0055;">echo</span> <span style="color: #0000ff;">&quot;No Msg...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000000;">;</span> <br />        <span style="color: #009900;">&#125;</span> <br />        <span style="color: #7F0055;">break</span><span style="color: #000000;">;</span> <br /> <br />    <span style="color: #7F0055;">case</span> <span style="color: #0000ff;">&quot;stat&quot;</span><span style="color: #000000;">:</span> <br />      <span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span> msg_stat_queue<span style="color: #009900;">&#40;</span><span style="color: #000088;">$seg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">break</span><span style="color: #000000;">;</span> <br /> <br />    <span style="color: #7F0055;">case</span> <span style="color: #0000ff;">&quot;remove&quot;</span><span style="color: #000000;">:</span> <br />        msg_remove_queue<span style="color: #009900;">&#40;</span><span style="color: #000088;">$seg</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span> <br />        <span style="color: #7F0055;">break</span><span style="color: #000000;">;</span> <br /><span style="color: #009900;">&#125;</span> <br /><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div><br /> <br /><p>消息队列中的数据同样受到大小的约束，具体约束范围可通过msg_stat_queue的msg_qbytes看到。这段代码唯一有点小改动的地方就在接受消息时，指定了MSG_IPC_NOWAIT，不然如果目标队列没有数据，默认会一直等待。</p><br /><p>一般会用到共享内存或消息队列的情况，都会涉及到多线程/进程，或跨语言的数据传递。如果是php脚本/进程间共享数据，那只要小心点操作就没什么问题。如果要求跨语言，那很可能遇到千奇百怪的问题，呵呵，我还没试过，但在网上看到别人发的苦水贴，以后有机会一定实验一下。</p><br /><p>在调试共享内存、信号量、消息队列时，可以配合Linux系统命令观察数据存储情况及信号量、消息队列资源分配情况，如ipcs, ipcrm命令。                </p></p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/phpCaoZuoNeiCun-GongXiangNeiCun-JiYuNeiCunDeXiaoXiDuiLieCaoZuo.html/feed/</wfw:commentRss>
</item>
</channel>
</rss>
