Yaf - 一个扩展形式的PHP框架

PHP框架有很多,比如Zend Framework、Yii、CI、CakePHP、ThinkPHP等,它们都被广泛地使用在各种项目里,但是它们都是用PHP实现的,不可避免地有性能损耗,而且功能越强大性能越弱。今天偶然发现了一个用PHP扩展方式实现的框架Yaf(Yet Another Framework),眼前一亮,看这个性能对比图可见一斑:

ab2.png

这个框架使用方式也很简单,从官方网站下载相应版本的dll文件放到php扩展目录下,在php.ini文件中加上相应的extension设置就好了。更多信息可以查看官方文档

这个框架基本是参照zend framework实现的接口,容易上手,但是也带来一个问题,就是不容易定制,如果要修改源码得有c基础还得对Zend API很熟悉才行。

php设置多级目录session的问题

php默认会把session保存在 /tmp 下,但是当session文件过多时会对性能造成很大影响,设置分级目录是个好办法。

在 php.ini 中找到 session.save_path 将值设置为 session.save_path = '3;/tmp/session'; 即可开启三级目录保存session。但是php不会自动生成目录结构,这时可以借助源码包 ext/session 目录下的 mod_files.sh 来生成目录

$ bash mod_files.sh /tmp/session 3

生成完成后发现仍然不能生成session,纠结了半天,打开mod_files.bat才发现玄机,原来后面还需要带一个参数,对应于 php.ini 中的 session.hash_bits_per_character ,这个值默认是4,development和production版本的默认配置里是5,于是用下面的命令从新生成目录

$ bash mod_files.sh /tmp/session 3 5

终于可以登录了。

小处用心成大事

今天查PHP手册,无意中看到delete这个条目,我知道php中是没有这个delete函数的,那这个是干什么的呢?

php_delete.jpg

中文的意思是:

这是一个虚构的条目,用来给那些本来是找 unlink() 或者 unset() 的人提供一些有用的信息。

多么贴心的一个细节。当人们想要删除文件或者变量的时候,自然会想到去手册里找一下delete这个函数,没有,怎么办?这里给你列出来了,噢,你要找的可能是 unlink() 或者 unset() 吧。

记得《结网》里说,一件产品要打动用户,只需要一个细微的感动点,这一处让用户感动了,就留住了用户。

做产品,细节决定成败。

配置Nginx支持ThinkPHP的URL重写和PATHINFO

ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,只需要在配置文件中设置 'URL_MODEL' => 2 即可。在Apache下只需要开启mod_rewrite模块就可以正常访问了,但是Nginx中默认是不支持PATHINFO的,所以我们需要修改nginx.conf文件。

网上搜了很多方法都不奏效,研究了一天,发现通过以下的配置可以完美支持 'URL_MODEL' => 2 的情况了

location /project/ {
	index  index.php;
	if (!-e $request_filename) { 
		rewrite  ^/project/(.*)$  /project/index.php/$1  last;
		break;
	}
}

location ~ .+\.php($|/) {
	set $script	$uri;
	set $path_info  "/";
	if ($uri ~ "^(.+\.php)(/.+)") {
		set $script     $1;
		set $path_info  $2;
	 }
		 
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_index  index.php?IF_REWRITE=1;
	include /APMServ/nginx/conf/fastcgi_params;
	fastcgi_param PATH_INFO $path_info;
	fastcgi_param SCRIPT_FILENAME  $document_root/$script;
	fastcgi_param SCRIPT_NAME $script;
}

这里先把project下的请求都转发到index.php来处理,亦即ThinkPHP的单一入口文件;然后把对php文件的请求交给fastcgi来处理,并且添加对PATH_INFO的支持。

重启Nginx以后,http://localhost/project/Index/insert, http://localhost/project/index.php/Index/delete 这样的URL都可以正确访问了。

还有一个地方需要注意的是,Nginx配置文件里 if 和后面的括号之间要有一个空格,不然会报unknown directive错误。这个害我调了很久

让Aptana支持cx标签库

ThinkPHP是一个优秀的国产PHP框架,内置了一套性能卓越的模板引擎ThinkTemplate,并且默认导入cx标签库,这样我们就可以像使用JSTL一样通过<volist>, <foreach>, <switch>等标签来完成复杂的操作。

遗憾的是,当我们在Aptana里写了如下的代码时,编辑器会报错,告诉我们<volist>标签无法识别

<volist name='list' id='vo'>
	编号:{$vo.id}<br/>
	标题: {$vo.title}<br/>
	内容: {$vo.content}
	<hr>
</volist>

aptana error.jpg

虽说项目一样可以正常运行,但是这红叉叉看起来那么刺眼,真是让人不爽。通过html validation配置,我们可以让编辑器忽略掉这类“不是错误的错误”。

打开Window -> Preferences,定位到Aptana -> Editors -> HTML -> Validation,这里有两种选择

1. 直接去掉Tidy Html Validator复选框前的勾。这样编辑器就不会检查语法,带来的副作用就是你其它的错误它也发现不了了

2. 保持Tidy Html Validator被选中,在下面的filter区域里用正则表达式来添加需要过滤的错误。

html validation.jpg

当然这样也有缺点,就是需要手工把所有的cx标签都加进去,比较麻烦。查看ThinkPHP 2.0完全开发手册的第7章模板指南,发现一共有如下这些标签:

include, import, volist, foreach, switch, case, default, if, elseif, else, eq, neq, gt, egt, lt, elt, heq, nheq, in, notin, range, present, notpresent, empty, notempty, defined, notdefined, literal, php

配置完成后确定,红叉叉去无踪~