Archive for the ‘PHP’ Category

Mediawiki扩展编写实战

Thursday, July 22nd, 2010

Wikipedia大家都很熟悉,而Mediawiki则是Wikipedia背后的功臣,整个Wikipedia都构建在mediawiki之上,mediawiki的稳定性和高效性值得信赖,同时Mediawiki非常易于扩展,可以通过Extension的方式添加非常多的功能,而且Mediawiki的Extension社区也非常活跃,大家可以到Mediawiki Extension目录下去下载自己需要的扩展程序。 上周末,帮朋友写了一些Mediawiki的扩展,立即被Mediawiki的强大扩展性折服,主要实现的功能有:增加Google Analytics统计、自定义标题、增加Google Adsense广告之类,写Mediawiki的扩展,最好的参考是Mediawiki扩展手册:http://www.mediawiki.org/wiki/Manual:Extensions。 Mediawiki的扩展主要有Tag Extension、Parser Functions、Hooks、Special Pages、Skins、Magic Words,对应的中文是:标签扩展(自定义wiki标签,比如xxxx)、解析扩展(和标签类似,不过呈现方式稍有不通,为{{#foo : bar}})、钩子、特殊页面、皮肤、魔术关键字,我这里演示的是Parser Functions和Hooks,其他的差不多类似。 一、增加Google Analytics统计和Google Adsense广告 原理很简单,我们在页面显示之前,把Google Analytics和Google Adsense的代码append到要显示的内容即可,代码:

ColaPHP 0.8beta发布

Saturday, July 3rd, 2010

代号:Mini,bugfix版本,改善框架易用性,代码重构。 下载ColaPHP 0.8beta,阅读ColaPHP文档,访问ColaPHP项目。 ColaPHP 0.8beta已经很稳定,可以在生产环境使用。

PHP导出MySQL数据到Excel文件

Wednesday, May 12th, 2010

经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限。这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件。

ColaPHP 0.7beta发布

Saturday, April 3rd, 2010

ColaPHP的2010.3月度发布计划版本,稍微晚了几天,代号Recode,和0.6beta相比,框架结构有比较大的变化,主要修改如下: 精简框架核心,除FrontController、Router、MVC外,其他功能组件化 Cola_Db、Cola_Cache、Cola_Log、Cola_Yaml已组件化成Cola_Com_Db、Cola_Com_Cache、Cola_Com_Log、Cola_Com_Yaml Controller中可直接使用$this->com->db($config)之类的接口来调用组件 少量代码重构以及bug fix 下载ColaPHP 0.7beta,阅读ColaPHP文档,访问ColaPHP项目。 由于0.7beta做框架架构上变化有点大,不建议立即采用,生产环境中建议使用稳定的0.6beta,下一个版本0.8beta开发代号:Mini,主要对架构、代码做进一步重构优化。

ColaPHP 0.6beta发布

Sunday, February 28th, 2010

ColaPHP月度发布计划版本,代号:Easy,和0.5beta相比变化不大,主要修改如下: 增加Yaml处理,底层调用symfony yaml包处理 增加自定义异常类,后续准备将框架中的异常细分(好处是将来可以对异常做针对性处理) 少量代码重构以及bug fix 下载ColaPHP 0.6beta,阅读ColaPHP文档,访问ColaPHP项目。 下一个版本0.7beta开发代号:Recode,主要对代码做进一步重构优化。

ColaPHP-0.4-alpha发布

Wednesday, December 23rd, 2009

ColaPHP月度发布计划,基本上每月发一个release,相比较0.3alpha,比较大的修改如下: 增加了动态路由模式,可不用定义URL规则 增加对MySQL Master-Slave支持,可以由单数据库无缝迁移到主从模式 去除框架中Smarty模板的绑定,可以在Controller中自行调用Smarty模板 Helper中增加了性能测试模块Benchmark.php 增加对MongoDB的简单绑定Mongo.php 性能进一步提升 大量的代码重构以及bug fix 访问ColaPHP官方网站,下载0.4alpha,不过建议随时跟进我们的svn://colaphp.googlecode.com/svn/trunk/,ColaPHP一直在活跃开发。 ColaPHP 0.4alpha已完成预期目标,所有的函数都控制在20行以内。下一个版本0.5alpha版本开发代号:Practice,ColaPHP已经在一些实际项目中使用,0.5alpha将得到更多的实践优化 招募PHP极客加入ColaPHP,联系fuchaoqun#gmail.com。

ColaPHP-0.3-alpha发布

Saturday, November 7th, 2009

开发工作很久以前就基本完成了,一直没来得及整理,今天发布0.3alpha,相比较0.2alpha,比较大的修改如下: Helper中增加了验证码模块Captcha.php、HTTP访问模块Http.php、数据校验模块Validate.php 修订DB模块中result($sql)函数,如果$sql是select语句则返回结果集,如果是insert语句则返回最后插入ID,如果是update或者delete语句,则返回受影响行数(有可能为0行),其他语句则返回query句柄 完善框架的易用性:增加了统一配置文件;可以指定models、views、controllers目录;支持默认模版名称 大量的代码重构以及bug fix 下载0.3alpha,不过建议随时跟进我们的SVN://colaphp.googlecode.com/svn/trunk/,ColaPHP一直在活跃开发。 0.4alpha版本开发代号:20 lines,目标是把所有的函数都控制在20行以内以及代码的持续重构。 继续招募PHP极客加入Cola,联系fuchaoqun#gmail.com。

PHP处理Etag、lastModified和Expires

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) { ...

ColaPHP-0.1-alpha发布

Friday, June 19th, 2009

非常简陋的一个PHP框架,只是把架子搭起来了,地址:http://code.google.com/p/colaphp/ 现在PHP框架已经很多了,为什么还要去"重复的发明轮子"? 你和我一样不想重新学习一门"框架语言" 你和我一样希望规范的MVC开发 你和我一样希望一个高性能的框架 你和我一样不希望改变已有的PHP开发方式 现在,ColaPHP还很不成熟,暂且当做一个"玩具"试试,有兴趣的可以阅读一下代码,品味好的代码和指出坏味道的代码都是一个好的过程。 文档方面现在还很不全,我希望只用一个Tutorial就能讲明白,以后也不会有别的新的文档(文档越多,表明系统越复杂,学习成本也越高),当然,Tutorial会是一个持续完善的过程。 ColaPHP是写给PHP程序员的一个框架,信奉KISS的同学可以试试。

PHP SESSION解惑

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影响系统性能就畏首畏尾,知道问题,解决问题才是关键,惹不起躲得起不适合这里。