Saturday, September 5th, 2009
之前看到robbin基于资源的HTTP Cache的实现介绍,想到这是一个很有意思的功能,原理很简单,但很多人都会忽略,于是乎打算集成到ColaPHP框架中来,让浏览器缓存动态内容,对于一些由动态脚本生成、更新不频繁但又会被用户重复访问的页面内容,还是很有意义的。
如果在服务器端设置了Etag、lastModified和Expires之后,下次再访问同一资源的时候,一个典型的HTTP头是这样的:
Host 127.0.0.1
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 QQDownload/1.7
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
If-Modified-Since Sat, 05 Sep 2009 12:44:56 GMT
If-None-Match foobar
Cache-Control max-age=0
关于lastModified、Etag和Expires的工作原理,可以参看http://longrujun.name/index.php/2009/03/04/etag%E5%92%8Cexpires/,简单来说:
lastModified:设定一个最后修改时间,浏览器下次访问的时候,发送一个"If-Modified-Sinc"的头信息,如果内容在这个时间之后没有更新,服务器直接返回一个304 Not Modified而不传输详细内容,可以节省带宽。
Etag:设定一个标记,浏览器下次访问时,发送一个"If-None-Match"的头信息,如果服务器内容还是这个标记没变,也直接返回一个304 Not Modified而不传输详细内容,同样可以节省带宽。
Expires:设定一个过期时间,如果当前请求在这个过期时间之类,则不发送HTTP请求,不仅可以节约服务器带宽,还可以减少服务器HTTP请求数。
主要通过header函数来发送,比较简单,直接上代码:
public static function etag($etag, $notModifiedExit = true)
{
...
Posted in PHP | 2 Comments »
Friday, June 19th, 2009
非常简陋的一个PHP框架,只是把架子搭起来了,地址:http://code.google.com/p/colaphp/
现在PHP框架已经很多了,为什么还要去"重复的发明轮子"?
你和我一样不想重新学习一门"框架语言"
你和我一样希望规范的MVC开发
你和我一样希望一个高性能的框架
你和我一样不希望改变已有的PHP开发方式
现在,ColaPHP还很不成熟,暂且当做一个"玩具"试试,有兴趣的可以阅读一下代码,品味好的代码和指出坏味道的代码都是一个好的过程。
文档方面现在还很不全,我希望只用一个Tutorial就能讲明白,以后也不会有别的新的文档(文档越多,表明系统越复杂,学习成本也越高),当然,Tutorial会是一个持续完善的过程。
ColaPHP是写给PHP程序员的一个框架,信奉KISS的同学可以试试。
Posted in PHP | 2 Comments »
Saturday, February 28th, 2009
一、PHP SESSION原理
我们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得数据可以客户端跨页面交换,那么服务器是如何记住众多用户的会话数据呢?
首先要将客户端和服务器端建立一一联系,每个客户端都得有一个唯一标识,这样服务器才能识别出来。建议唯一标识的方法有两种:cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫"PHPSESSID"的cookie(可以通过php.ini修改session.name值指定),如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器(修改php.ini中session.use_trans_sid等参数)。
我们查看服务器端session.save_path目录会发现很多类似sess_vv9lpgf0nmkurgvkba1vbvj915这样的文件,这个其实就是session id "vv9lpgf0nmkurgvkba1vbvj915"对应的数据。
真相就在这里,服务器将session id传递到服务器,服务器根据session id找到对应的文件,读取的时候对文件内容进行反序列化就得到session的值,保存的时候先序列化再写入。
事实就是这样,所以如果服务器不支持session或者你想自定义session,完全可以DIY,通过PHP的uniqid生成永不重复的session id,然后找个地方存储session的内容即可,你也可以学flickr把session存储在MySQL数据库中。
二、使用session之前为什么必须先执行session_start()?
了解的原理之后,所谓的session其实就是客户端一个session id服务器端一个session file,新建session之前执行session_start()是告诉服务器要种一个cookie以及准备好session文件,要不然你的session内容怎么存;读取session之前执行session_start()是告诉服务器,赶紧根据session id把session文件反序列化。
只有一个session函数可以在session_start()之前执行,session_nam():读取或指定session名称(比如默认的就是"PHPSESSID"),这个当然要在session_start之前执行。
三、session影响系统性能
session在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时,PHP支持session目录hash,我们可以通过修改php.ini中session.save_path = "2;/path/to/session/dir",那么session将存储在两级子目录中(修订:参见david回复),不过好像PHP session不支持创建目录,你需要事先把那么些目录创建好 。
还有一个问题就是小文件的效率问题,一般我们的session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率肯定会很差,PHP手册上建议使用Reiserfs文件系统,不过Reiserfs的前景堪忧,Reiserfs的作者把媳妇给杀了,SuSE也抛弃了Reiserfs。
其实还有很多中存储session的方式,可以通过php -i|grep "Registered save handlers"查看,比如Registered save handlers => files user sqlite eaccelerator可以通过文件、用户、sqlite、eaccelerator来存,如果服务器装了memcached,还有会mmcache的选项。当然还有很多,比如MySQL、PostgreSQL等等。都是不错的选择。
四、session的同步
我们前端可能有很多台服务器,用户在A服务器上登录了,种下了session信息,然后访问网站的某些页面没准跳到B服务器上去了,如果这个时候B服务器上没有session信息又没有做特殊处理,可能就会出问题了。
session同步有很多种,如果你是存储在memcached或者MySQL中,那就很容易了,指定到同样的位置即可,如果是文件形式的,你可以用NFS统一存储。
还有一种方式是通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无session,如果有当然没问题,如果没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。这种方法其实很有用,如果网站有很多个子频道,服务器也不在一个机房,session没办法同步又想做统一登录那就太有用了。
当然还有一种方法就是在负载均衡那一层保持会话,把访问者帮定在某个服务器上,他的所有访问都在那个服务器上就不需要session同步了,这些都是运维层面的东西。
就说这么多吧,根据自己的应用来选择使用session,不要因为大家都说session影响系统性能就畏首畏尾,知道问题,解决问题才是关键,惹不起躲得起不适合这里。
Posted in PHP | 2 Comments »
Thursday, February 5th, 2009
早期的PHP开发者发现把PHP代码和HTML代码混在一起,维护起来非常的费劲,于是Smarty应运而生,将PHP代码和HTML代码分离,把MVC模式中的V(View显示)首先剥离,大大提高了程序的可阅读性和可维护性,于是有一大批的使用者,甚至到现在,如果你去找一份PHP的工作,如果不了解Smarty,估计够呛能拿到offer.
Smarty,这个PHP模板引擎曾经的代名词,最近的日子貌似不太好过,3.0Alpha出来了,不过很多人认为换汤不换药,更有甚者用回光返照来形容,真是英雄末路。
国外甚至有个No Smarty的网站,数典Smarty的种种"罪行",然后给出了很多种替代方案(基本上是主流的PHP框架),个人觉得不太公平,一个PHP模板引擎和一个完备的MVC框架能有可比性?
一个纯粹的PHP模板引擎在当前MVC当道的年代,难免不那么叫好,而且Smarty开发年代久远,有些设计确实不是太好,Smarty最早开发的时候估计是给页面制作人员(builder)来用的,以至于它的语法都和PHP不兼容,比如foreach语句,在Smarty里面就要用{foreach from=$foo item=bar},可是套模板的工作基本上都是PHP程序员在做,不兼容PHP语法还需要重新去学习Smarty,而两种不同的风格足够让人抓狂。
如果是因为效率的问题放弃使用Smarty,大可不必,很多的网站还在用,比如我们,瓶颈不会出现在Smarty模板上,Smarty会把模板代码编译成PHP代码,下次调用的时候检测如果模板没有改动直接调用编译好的PHP代码,应该和原生的PHP代码差别不太大。而且Smarty自带了很多很有用的函数,比如转义,用起来还是很舒服的。
不过,最近Smarty项目已经从PHP官方移除了,访问http://smarty.php.net,提示Smarty is no longer a subproject of the PHP project, and has subsequently moved to its own domain: www.smarty.net,真是祸不单行。
Posted in PHP | No Comments »
Friday, September 12th, 2008
About OpenSlopeOne
OpenSlopeOne is an implementation of Slope One based on PHP&MySQL, it's an open source project under GPL V3.
It aims to a fast way to use Slope One with PHP&MySQL, and it can handle tons of data.
It's localed on Google Code:
http://code.google.com/p/openslopeone/
You can get the latest code here:
svn checkout ...
Posted in Data Mining, MySQL, Open Source, PHP | No Comments »