月度归档:2013年09月

构建一个属于你的PHP MVC 框架—-1.URL路由配置

可以说一个漂亮的URL对于一个MVC框架而言不是必须的。
你可以run你自己的framework,然后,在URL后边自己添加自己的参数,比如:index.php?c=a&m=b等等。
不过这种URL对于浏览器而言,看起来不太友好,对于搜索引擎而言也不是太过友好,对于SEO还会有一定的影响。

所以,最好你的MVC框架是一个单入口程序,所谓的单入口程序就是所有的请求都会通过一定的规则,然后有一定的bootstrap引导,这样我们就可以在bootstrap中加入一些扩展点。当然,可以明白的说,扩展点不是给我们用的,是给一些对于我们的框架不是很满意,然后想加入一些改造的人来用的,这样就加强了MVC框架的灵活性。

OK,步入正题:

搜索引擎比较喜欢的URL方式是域名直接跟斜线,然后隔离各种参数,比如上边我们用GET方式传递的c和m等。就是类似http://a.com/index/hello这种方式。这种方式要想变成我们需要的形式就需要借助于web服务器的一种工具来重写URL。作者用的服务器是apache,apache里边的这个模块叫做rewrite。开启rewrite,这部分属于apache服务器配置的问题,在此不做描述。

这里主要介绍简单的URL规则。rewrite模块是利用正则的方式来匹配浏览到的URL然后,可以把匹配到的部分重新拼接成一个新的URL。

框架的URL,rewrite规则定义如下:

<IfModule mod_rewrite.c>
RewriteEngine On

#路由规则,除了*.php static robots.txt 以外的所有请求
RewriteCond $1 !^([a-z]+\.php|static|robots\.txt|uploads|unionhotel)

#路由默认的首页
RewriteRule ^()?$ index.php?%{QUERY_STRING} [L]

#路由某些特殊的规则,这里是以beta开头的规则
RewriteRule ^(beta)/(.+)?$ $1.php/$2?%{QUERY_STRING} [L]

#路由其余的请求
RewriteCond $1 !^([a-z]+\.php|static|robots\.txt|uploads|betasns|unionhotel)
RewriteRule ^([a-z]+)/(.+)?$ index.php/$1/$2?%{QUERY_STRING} [L]
RewriteRule ^([a-z]+)?$ index.php/$1?%{QUERY_STRING} [L]

</IfModule>

把这个文件保存为.htaccess然后,注意开启你的apache的rewrite模块,然后允许在htaccess中设置,就可以生效了。

当你访问localhost/a/b的时候就会被改写为localhost/index.php/a/b
然后我们就可以在index.php中做文章了,其中可以获取到a/b然后定义路由规则。

域名后边的URL字段可以通过$_SERVER[‘path’] 来获得,一个简单的入口文件定义如下:

//定义默认调用index控制器的index方法
$controller_name = 'index';
$method_name = 'index';

//定义路由函数,第一部分作为控制器的名字,第二部分作为控制器的方法
function route_request(){
    global $controller_name,$method_name;
    $uri = $_SERVER['PATH_INFO'];
    $uri = trim($uri,'/');
    $uri_arr = explode('/',$uri);
    if(count($uri_arr) >= 2 ) {
       $controller_name = $uri_arr[0];
       $method_name = $uri_arr[1];
    }
    return;
}
route_request();

保存以上文件为index.php
然后附加上我们的测试打印代码:

   var_dump($controller_name,$method_name);

这样我们访问当前目录localhost/a/b
将会看到我们解析出的控制器名,方法名

构建一个属于你的PHP MVC 框架—-0.简单介绍

文章属于构建一个属于你的PHP MVC 框架[目录]

谈谈关于MVC:

MVC是一种通用的设计模式,其实各种语言中都有各自的MVC结构,不要把MVC这个东西限制到某一种语言,更不要把某些OOP的结构就当成是MVC。MVC其实就是一种把数据视图控制分离的一种思想。

并不是所有的地方都适合用MVC,也就是MVC有他适合的地方。

适合的系统有这些特点:

其一,某些数据概念模糊,数据可能来源数据库,可能来源于缓存,可能来源于网络层,那么我们就可以定义出自己的模型层,把整个数据的交互获取部分,跟整个系统隔离开来,这样非常有利于系统后期的维护和扩展。

其二,视图的形式不确定,或者是灵活多变的,需要支持多种数据格式等。这种情况下就可以把从数据层(也可以称之为模型层)的数据,组织成各种个样的形式,而不依赖于后边的数据如何获取。举个例子,我们做一个系统接口,可能需要把数据用html的形式展现在浏览器上,这个是需求1,其次,可能需要做成一个手机app,这个时候需要json或者xml格式的数据,再继续,我们这个东西做大了,我们需要做一个API,这个时候就更可以根据不同的需求组织不同的数据形式。

其三,灵活应变各种逻辑,因为数据与显示被完全的哥离开,所以中间的控制层,必然能够灵活的控制,比如加入权限控制,访问限制,流量控制等等。

最后讲一下不适用的地方把,某些特别小的东西,可能只是自己写的一段测试代码,那就没必要折腾这个结构了,也没有意义。其实特别小的东西呢,不用任何框架的纯过程绝对是最灵活的方式。

ab测试工具的简单用法

ab是apache自带的压力测试工具:介绍集中简单的用法:

1.很简单的用法
ab -c10 -n100 URL
并发10个用户,请求100次

2.-t1等待服务器的最长时间
附加已经验证的用户的操作,比如已经登陆用户的读取操作,读取日志列表等,
-C附加cookie信息

ab -c10 -n100 -t1 -C “a=b” URL

3.测试POST请求,测试不可重复的操作类,比如多用户同时发表评论。

测试POST请求
-p post.data -T application/x-www-form-urlencoded
发送的数据在post.data中其中a=b&c=d的形式

4.可以改变application/x-www-form-urlencoded的形式,顺便决定post.data中的内容形式