距离上一次发布的《制作类似ThinkPHP框架中的PATHINFO模式功能》(文章地址:http://www.cnblogs.com/phpstudy2015-6/p/6242700.html)已经过去好多天了,今晚就将剩下的一些东西扫尾吧。

  上一篇文章已经实现了PATHINFO模式的URL,即我们访问MVC模式搭建的站点时,只需要在域名后面加上(/module/controller/action)即可,很智能化。并且通过new Object时的自动触发函数实现类文件的自动载入,因此只要我们搭建好基础的框架就可以不需要担心文件访问路径的问题啦,当然前提是要有合理有规律的命名方式。

一、本文章实现目标

  上一篇文章已经实现具体的功能啦,那么我这一次还要写什么呢?还有什么要注意的么?

  作为程序猿钻研琢磨精神是必不可少的,所以这一次我就将上一篇文章改造成文件保存版本的,即将$routes里面的正则规则存入文件中去,然后getRoute需要用的时候再将其取出来。然后再通过apache的ab压力测试一下二者的效率问题等。

二、核心知识

  这篇文章所涉及的核心知识不多。

  1、存与取文件,我这次使用的是file_put_contents()与file_get_contents()。当然还有很所的选择啦。

  2、存与取文件之前当然要先序列化与反序列化啦,使用的函数就是:serialize()与unserialize()。

  3、apache的ab并发测试。(并发测试这种高深的玩意,刚接触还不太了解,有熟悉这块的哥们,如果允许,请给小弟一些建议)

三、环境说明

Linux虚拟机、PHP5.3.6、域名www.test2.com

四、代码实例

/Framework/Core/Url2.class.php

 <?php
/*
*@制 者:壹叶随风
*@博 客 :http://www.cnblogs.com/phpstudy2015-6/
*@时 间 :2017.1.10
*@版 本 :文件保存版
*/
class Url2
{
//定义正则表达式常量
const REGEX_ANY="([^/]+?)"; #非/开头任意个任意字符
const REGEx_INT="([0-9]+?)"; #数字
const REGEX_ALPHA="([a-zA-Z_-]+?)"; #字母
const REGEX_ALPHANUMERIC="([0-9a-zA-Z_-]+?)"; #任意个字母数字_-
const REGEX_STATIC="%s"; #占位符
const ANY="(/[^/]+?)*"; #任意个非/开头字符 #保存文件式
public function addRoute($route,$int)
{
if($int==1)
{
$routes=file_get_contents('./routes.txt');
$routes=unserialize($routes);
}
$routes[]=$this->_ParseRoute($route);
$routes=serialize($routes);
file_put_contents('./routes.txt', $routes);
} /*private
@input :$route 输入路由规则
@output:return 返回路由正则规则
*/
private function _ParseRoute($route)
{ $parts=explode("/", $route); #分解路由规则
$regex="@^"; #开始拼接正则路由规则
if(!$parts[0])
{
array_shift($parts); #除去第一个空元素
}
foreach ($parts as $part)
{
$regex.="/";
$args=explode(":",$part);
if(!sizeof($args)==2)
{
continue;
}
$type=array_shift($args);
$key=array_shift($args);
$this->_normalize($key); #使参数标准化,排除其他非法符号
$regex.='(?P<'.$key.'>'; #为了后面preg_match正则匹配做铺垫
switch (strtolower($type))
{
case 'int': #纯数字
$regex.=self::REGEX_INT;
break;
case 'alpha': #纯字母
$regex.=self::REGEX_ALPHA;
break;
case 'alphanum': #字母数字
$regex.=self::REGEX_ALPHANUMBERIC;
break;
default:
$regex.=$type; #自定义正则表达式
break;
}
$regex.=")";
}
$regex.=self::ANY; #其他URL参数
$regex.='$@u';
return $regex;
} /*public,将输入的URL与定义正则表达式进行匹配
@input :$request 输入进来的URL
@output :return 成功则输出规则数组数据 失败输出false
*/
public function getRoute($request)
{
#处理request,进行参数处理,不足M、C、A,则自动补为home、index、index,即构建MVC结构URL
$request=rtrim($request,'/'); #除去右边多余的斜杠/
$arguments=explode('/',$request);
$arguments=array_filter($arguments); #除去数组中的空元素
$long=sizeof($arguments); #数组中的个数
switch ($long) #判断个数,不足就补够
{
case '0':
$request='/home/index/index';
break;
case '1':
$request.='/index/index';
break;
case '2':
$request.='/index';
break;
}
$matches=array(); #定义匹配后存贮的数组
$temp=array(); #中间缓存数组 #保存文件式
$routes=file_get_contents('./routes.txt');
$routes=unserialize($routes);
foreach ($routes as $v) #开始匹配
{
preg_match($v, $request, $temp); #需要重点理解这个数组
$temp?$matches=$temp:'';
}
if($matches) #判断$matches是否有数据,无返回false
{
foreach ($matches as $key => $value) #筛选
{
if(is_int($key))
{
unset($matches[$key]); #除去数字key元素,保留关联元素。与上面的preg_match一起理解
}
}
$result=$matches;
if($long > sizeof($result)) #URL参数超过后的处理
{
$i=1;
foreach ($arguments as $k => $v)
{
if($k > sizeof($result))
{
if($i==1)
{
$result[$v]='';
$temp=$v;
$i=2;
}
else
{
$result[$temp]=$v;
$i=1;
}
}
}
}
return $result;
}
return false;
}
#使参数标准化,不能存在符号,只能是a-zA-Z0-9组合
private function _normalize(&$param)
{
$param=preg_replace("/[^a-zA-Z0-9]/", '', $param);
}
}
/*使用实例:
#1、保存则正
载入本类文件
include './Url.class.php';
$router=new Url();
$router->addRoute("/alpha:module/alpha:controller/[0-9]+?:a1a",0); #0代表清空文件中所有内容,从新保存
$router->addRoute("/alpha:module/alpha:controller/alpha:action",1); #1代表在文件后面添加正则规则
$router->addRoute("/alpha:module/alpha:controller/alpha:action/(www[0-9]+?):id",1);
#2、注释上面的开始访问
include './Url.class.php';
$router=new Url();
$url=$_SERVER['REQUEST_URI'];
$urls=$router->getRoute($url);
echo "<pre>";
print_r($urls);
echo "</pre>";die;
*/
?>

以上是更改后的类文件,主要更改有三处地方。

  1、将原本定义的$routes(protected $routes=array())去除。因为采用文件保存后,此定义任何意义。

  2、方法addRoute()进行大改。如下图:

更改为:

  3、getRoute()将正则规则去除的地方

更改为:

开始访问:

1、存规则

index.php

 <?php
include './Framework/Core/Core.php';
#第一步,存正则规则
$router=new Url2();
$router->addRoute("/alpha:module/alpha:controller/[0-9]+?:a1a",0);
$router->addRoute("/alpha:module/alpha:controller/alpha:action",1);
$router->addRoute("/alpha:module/alpha:controller/alpha:action/(www[0-9]+?):id",1);

访问:www.test2.com即可

立即在根目录生成  routes.txt

vi里面是已经序列化的内容

2、正式访问

index.php文件更改如下

 <?php
include './Framework/Core/Core.php'; $router=new Url2();
$url=$_SERVER['REQUEST_URI'];
$urls=$router->getRoute($url);
$_GET['urls']=$urls;
$m=$urls['module'];
$c=$urls['controller'];
$a=$urls['action'];
if($m&&$c)
{
$autoload=new Autoload($m,$c);
$autoload->putFile();
}
$object=new $c;
$object->$a(); ?>

访问:http://www.test2.com/Home/Test/action/

结果如下:

更改成功!

五、二者压力测试

使用apache的ab对二者进行压力测试。(我使用window本机的apache的ab进行测试)

ab中参数有很多,这里主要使用 -c 与 -n

  -c:一次产生的请求个数

  -n:在测试会话中所执行的请求个数

ab性能指标:

  1、吞吐率(Requests per second)

  服务器并发处理能力的量化描述,单位是reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。吞吐率是基于并发用户数的,因此不同并发用户下,吞吐率一般不一样。

  计算公式:总请求数/处理完成这些请求所花费的时间,即 Request per second=Complete requests/Time taken for tests

  注意:此值代表当前机器的整体性能,值越大越好。

  2、并发用户数(Concurrency Level)

  3、用户平均请求等待时间(Time per request)

  计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即:Time per request=Time taken for tests/(Complete requests/Concurrency Level)

  4、服务器平均请求等待时间(Time per request:across all concurrent requests)  

  计算公式:处理完成所有请求数所花费的时间/总请求数,即:Time taken for/testsComplete requests

测试路径:http://www.test2.com/Home/Test/action/var1/vaule1/var2/value2

-n 2000 -50

执行2000个请求,最快使用50个并发连接

一、先对第一个(非文件版本)进行测试:

结果如下图所示:

二、对第二个版本(文件存贮)进行测试:

结果如下图所示:

以上两个测试数据比较,结果显示,各个数据都很接近。

本人更改-n、-c已经var/value等参数,进行多次的压力测试,最终结果表明,这两个类文件的吞吐率、并发用户数、用户平均请求等待时间、服务器平均请求等待时间等等数据几乎差不多,即两个类文件效率性能差不多。

(以上是自己的一些见解,若有不足或者错误的地方请各位指出)

作者:那一叶随风

声明:本博客文章为原创,只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接。

制作类似ThinkPHP框架中的PATHINFO模式功能(二)的更多相关文章

  1. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  2. 浅析Thinkphp框架中运用phprpc扩展模式

    浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...

  3. thinkphp 框架中的一部分方法解析

     1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致    首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> &l ...

  4. Thinkphp框架中自定义修改success和error页面

    Thinkphp框架中自定义修改success和error页面 Thinkphp框架的默认success和error太难看,可以自定义设置,步骤如下: (注意:TP原框架中的success跳转有问题, ...

  5. thinkPHP框架中执行原生SQL语句的方法

    这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...

  6. element框架中表格的筛选功能使用说明(转载)

    一.element框架中表格的筛选功能使用说明 转载:https://blog.csdn.net/liangxhblog/article/details/80513030 在element ui 框架 ...

  7. ThinkPHP中的pathinfo模式和URL重写

    语文一直不太好,要我怎么解释这个pathinfo模式还真不知道怎么说,那就先来一段代码说下pathinfo模式吧 http://serverName/appName/module/action/id/ ...

  8. nginx中配置pathinfo模式示例

    要想让nginx支持PATH_INFO,首先需要知道什么是pathinfo,为什么要用pathinfo? pathinfo不是nginx的功能,pathinfo是php的功能. php中有两个path ...

  9. thinkphp框架中session常识

    在看别人代码时候,发现他,在tp框架中使用session没有些session_start();然后我去查看了手册初始化设置方法 无需手动调用,在App类的初始化工作结束后会自动调用,通常项目只需要配置 ...

随机推荐

  1. MySQL replace into 说明(insert into 增强版)

    MySQL replace into 说明(insert into 增强版) 在插入数据到一个表时,通常是这种情况:1. 先推断数据是否存在: 2. 假设不存在,则插入:3.假设存在,则更新. 在 S ...

  2. C#中调用Outlook API 发起会议

    原文:C#中调用Outlook API 发起会议 在我上一篇博文中曾提到了 SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件 但是,里面的方法只能用于发送普通电子邮件.如果要发起会 ...

  3. JTAG应该如何接线

    下面是某个ARM9评估板的原理图: 注意: 1. Vref和Vtarget可以直接连在一起,由被调试板提供3.3V或5V电源: 2. nTRST,最好上拉: 3. TDI,最好上拉 4. TMS,最好 ...

  4. javascript 日期对象(date)详解

    Date 对象 Date 对象用于处理日期和时间. 创建 Date 对象的语法: var myDate=new Date(); 注释:Date 对象会自动把当前日期和时间保存为其初始值. 1.date ...

  5. Unity Container

    Unity Container中的几种注册方式与示例 2013-12-08 22:43 by 小白哥哥, 22 阅读, 0 评论, 收藏, 编辑 1.实例注册 最简单的注册方式就是实例注册,Unity ...

  6. JavaScript模板引擎原理

    JavaScript模板引擎原理,几行代码的事儿 2013-12-03 16:35 by BarretLee, 650 阅读, 6 评论, 收藏, 编辑 一.前言 什么是模板引擎,说的简单点,就是一个 ...

  7. 使用LFM(Latent factor model)隐语义模型进行Top-N推荐

    最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...

  8. MongoDB的.Net驱动

    mongo的驱动主要使用了两个,即samus和官方驱动. 个人感觉差别不大,且官方驱动也支持了LinQ.但在使用DBRef的时候,发现samus的驱动似乎不太好用,并没有达到想要的效果,也许是我的使用 ...

  9. SublimeText编辑器替代notepad++了

    可以考虑使用SublimeText编辑器替代notepad++了   内容目录: 插件安装配置 配置打包下载 大概是去年吧,这款编辑器神一般的出现在我面前,经过我小心翼翼的试用后发现并不是那么太顺手, ...

  10. C#做的颜色工具

    常常会用到绘制以及配色,每次看到 framework 里边的 KnowColor.xxx 我就一阵......到底啥颜色啊,干脆做一个一劳永逸的工具吧.功能包含: 可以实现枚举所有系统颜色 圆形.矩形 ...