手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

Web应用中的轻量级消息队列

这个,又是老王的文章,队列,确实还是需要用到的。不过,我倒真没有想过用专业的队列消息数据库等来处理。我最初只是想把一些要队列的信息用SQLITE来处理,一边是往里推,一边是往外拉。拉一条删除一条。等到数据量太大的时候,就清除掉。

老王还是有介绍的,我在PHPRPC群里也听缘起缘灭和廖羽雷他们谈过专业的队列处理,但,我目前做的事情,还是用不了专业的队列处理,所以也就没有放在心上,不过,既然老王有介绍,也可以稍看看【原本我计划做个短信定时发送也就是准备用队列处理的,但最后没做,因为139邮箱里居然有类似功能,NND,抢我饭碗】

Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update 之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。在Web2.0的时代,高并发的情况越来越常见,从而使消息 队列有成为居家必备的趋势,相应的也涌现出了很多实现方案,像Twitter以前就使用RabbitMQ实现消息队列服务,现在又转而使用Kestrel来实现消息队列服务,此外还有很多其他的选择,比如说:ActiveMQZeroMQ等。

上述消息队列的软件中,大多为了实现AMQP,STOMP,XMPP之类的协议,变得极其重量级,但在很多Web应用中的实际情况是:我们只是想找到一个缓解高并发请求的解决方案,不需要杂七杂八的功能,一个轻量级的消息队列实现方式才是我们真正需要的。

第一感觉是能不能使用memcached来 实现消息队列?稍加考虑后就会发现它不合适,因为memcached仅仅支持键值方式的操作,没有排序之类的功能,所以如果要用它来实现消息队列,则必须 自己通过某个键来保存数组形式的队列,不过这样的话,在操作队列的时候很容易丢失数据,比如说我们要添加一个消息,则需先取出现有队列,然后把消息保存到 队列尾部,最后保存队列,单纯使用memcached的话,由于我们无法保证整个过程的原子性,所以当处理若干个并发请求时,各个请求间可能会互相覆盖, 丢失数据就在所难免。另外,memcached只是内存键值缓存而已,一旦宕机,数据就消失了。

memcacheq的出现解决了上面的问题,它在memcached的基础上实现了消息队列,以php客户端为例:

消息从尾部入栈:memcache_set
消息从头部出栈:memcache_get

memcacheq依附于memcached之上,所以你可以通过现有的memcached工具来操作它,这无疑是它的一大优势,但它也有一个很大的缺点,那就是memcacheq本身的开发维护似乎并不活跃,如果遇到问题的话,你很可能需要自己动手解决。

目前看来,我更推荐下面这种解决方案,那就是redis,如果不了解,可以参考我以前的文章,表面上看,redis和memcached差不多,也是键值操作,但是redis本身实现了list,相关操作也可以保证是原子的,所以可以很自然的通过list来实现消息队列:

消息从尾部入栈:RPUSH
消息从头部出栈:LPOP

redis本身虽然是一个新项目,但很有朝气,开发维护也很活跃,如果你的下一个Web应用里需要使用轻量级的消息队列,不妨使用它。

此外,还有不少其他的选择可供尝试,比如说MySQL第三方的Q4M引擎,通过扩展SQL语法来操作消息队列,也是一个不错的选择。

套用网络流行语:那些重量级软件实现的不是你要的功能,而只是独在高处不胜寒的寂寞,所以不必迷恋其中,它们只是传说而已。

--EOF--

原文链接:http://hi.baidu.com/thinkinginlamp/blog/item/27a18202578f3d054bfb511f.html

怎样学PHP

在一些PHP的群内,很多人在提问前,都说,我刚学PHP,遇到一点问题,能不能帮我解决,然后刷刷刷的就是几屏代码。
在这种情况下,如果有人有精力有欲望回答他们的问题,估计才真的是奇怪。

网上流传的那篇:《提问的艺术》,估计很多人看过,但有多少人是这样提问的呢?至少我在遇到自己不会的情况下,先找手册,然后问google、百度,最后才问群里或者MSN中的高手们,即使这样,我也很把我遇到的问题和解决的方式说出来,这样,他们在回答的时候,也不会多次尝试。当然或许我一 说出来,他们就知道问题的解决方案了。但你不能保证每个人都是这样的高手吧?

以上都是废话。但还是有点参考价值。以下才是肉戏。

1、IBM的网站,http://www.ibm.com/developerworks

2、ZEND的网站:http://devzone.zend.com/,这里还有为新手写的文章 :http://devzone.zend.com/tag/PHP101

3、PHP官方网站,如果遇到点问题,发现代码好象没问题,但结果就是不正确,很去搜索一下buglist,或许就是你发现了这个BUG也有可能啊?

4、曾经的PHPE.net,没落的网站

5、喜悦村,也在逐步走向没落,大多数情况下,也是被这种无聊的提问而使得很多人不愿意回答问题吧?

6、phpchina。知名PHP网站,可惜吵架贴远多于知识贴

7、PHP100,在开发工具上提供了一些便 利,还有一些视频可以参考

8、本人的网站,哇哈哈哈。其实本人网站真的只属于一般,但我会努力转贴,当然也不是随便就乱转了。。。技术型的,一般总要看一遍再转的。

其实,你还可以搜索google reader之类的订阅网站,然后以某个关键字为搜索,并订阅这些内容,恐怕也可以让你达到一些效果,但订阅这个玩意,还是以少而精为主,否则,你还是没有精力去一篇篇看,走马观花的,反而会让你错过很多。

php实现替换UTF-8 BOM(feff)

这段代码我最早是在boblog里看到,那时候他有一个批量去除BOM的程序,就是用的这个方法,代码如下:

PHP代码
  1. function replace_utf8bom($str)  
  2. {  
  3.     $charset[1] = substr($str,0,1);  
  4.     $charset[2] = substr($str,1,1);  
  5.     $charset[3] = substr($str,2,1);  
  6.     if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191)  
  7.     {  
  8.         return substr($str,3);  
  9.     }  
  10.     else  
  11.     {  
  12.         return false;  
  13.     }  
  14. }  

很明显,这就是前面三个字符是固定的原因,当然可以这样判断了。。。说白了很简单,但如果不知道就真的很痛苦了。顺便说一下,它来自:http://www.phptext.net/technology.php?vid=53

王者归来?

说起PHP的模版引擎,大多数人第一个就会想起smarty,但是随着PHP的发展,而smarty一直在兼顾着老版本的PHP,慢慢的,慢慢的也就没落了。。。

 

如今,他好象又准备回来了。你看:
Yes, yes I know. The Smarty 3 beta is taking much longer than expected, but we wanted to be sure we had everything right. Our preliminary performance tests are already showing us very promising speed improvements over Smarty 2 (2-5x on average), and we're not done! To recap, Smarty 3 is a 100% rewrite from the ground up, and it is PHP 5 only. We will be getting a feature list up with the Beta, but let me give a quick summary:

 

  • PHP5 OO design
  • SPEED
  • Object Chaining
  • Exception Error Handling
  • Assigned Data Objects
  • Multiple Template Objects
  • Static Object Access
  • Pure PHP Template Option
  • Powerful Parser/Lexer
  • Tons of Template Syntax Enhancements
  • Improved Data Scoping Features
  • Variable Filters (ie. auto-html-escape)
  • In-template Functions (easy recursion)
  • Template Inheritance
  • PHP Streams Support (per template/variable/include)
  • Smart javascript/css handling (no more {literal} tags)
  • Improved Cache handling (per template/variable/function)
  • Many other things too numerous!

There are many folks using the Alpha in production, and with this feedback we feel the Beta is going to be very stable to begin with. Feel free to grab the Alpha and give it a test! We want feedback!

You can checkout Smarty 3 Alpha with SVN:
svn checkout http://smarty-php.googlecode.com/svn/branches/Smarty3Alpha/

想知道更多的信息?去http://www.smarty.net去看吧。也可以订阅他们的maillist哦。

征服缓存引发的难题

这次转载的文章讲的是CSs缓存的问题。CSS一般情况下,我们都会做一定的缓存,毕竟这玩意很少会动它,但对于一个稍大一点的网站来说,它就可能会经常变动了。
然而,CSS对于浏览器来说,一般情况下是会被自动缓存的,所以我在导入CSS的时候,都会制定一个版本号放在文件后面如:xxx.css?20091010,下次更新的时候,把这个日期改一下。用户在加载的时候会认为这是一个新文件 。。。

以下是博客园的用户写的文章 :

如何平衡的使用浏览器缓存?平时我们借助缓存来减少用户加载页面文件(比如js,css,image等)的时间和带宽,同时我们要确保用户访问的上述文件时最新的。而后者是我们常常头疼的问题。
本文主要介绍一些小的技巧来确保在网站文件被缓存的同时,又可以得到良好的性能和最新的更新的网站内容。
问题描述
比如我们在某页面加载了css文件,
<link rel="stylesheet" href="/css/styles.css" type="text/css" />
如何优化页面访问的性能呢?
手段1、使用缓存。通常我们希望此文件被浏览器缓存一定的时间,这样可以用户访问此页面的时候不必每次都向服务器请求下载此文件。我们也可以配置服务器在页面添加”Expires”头信息,从而告诉浏览器缓存此文件的时间。
手段2、我们使用yuicompressor等压缩工具对css文件进行压缩,减小文件的大小。
问题是当因版面风格的更新,此css已经做了更新,但是用户可能仍然使用的是旧的页面主题,甚至错乱的页面。这样对用户的体验非常不好。
解决之道:
根本原理:欺骗浏览器,让它认为它加载的文件跟缓存的文件不一样。
方法一、修改文件名
<link rel="stylesheet" href="/css/styles.1234.css" type="text/css" />
方法二、增加Query string
<link rel="stylesheet" href="/css/styles.css?v=1234" type="text/css" />
方法三、修改引用文件路径
这里最好的是在服务器配置文件中进行配置来实现文件路径映射(url mapping)。
<link rel="stylesheet" href="/css.1234/styles.css" type="text/css" />
以上我们以css为例进行了说明,我们来看看图片和js文件。
Images
由于图片的引用一般写在css文件中,并采用相对路径,所以当css的引用路径发生变化的时候,根据重写规则,图片被解析的路径自然会同步发生更新。
JS
适用于css的方法同样都适用于JS。
结束语
当然web站点性能的优化,除了缓存之外,还有许多的方法。比如我们可以借助YSlow来帮助用户得到最好的体验。

 

作者:MingleLui
出处:http://mingle.cnblogs.com/

其实方法都差不多。为了所谓的 yahoo 的N条军规,大家都在互相折腾。
之所以是N,是因为以前是14条,后来加过两次。就忘了几条了。firebug的插件yslow也可以做简单的测试哦