PHP实现一个简单url路由功能实例


Posted in PHP onNovember 05, 2016

什么是php的路由机制

1、路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数。举个例子,如:http://main.test.com/article/1  其中:/article/1  -> ?_m=article&id=1。

2、然后将拥有对应参数的URL转换成特定形式的URL结构,是上面的过程的逆向过程。

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染。很多时候可能是这样子写:xxx.com/xx?c=x&m=x&t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:)

如果我们访问一下不存在的游戏应用,例如game.weibo.com/ilovecoffee222,则会输出如下的错误提示:PHP实现一个简单url路由功能实例

game.weibo.com后面匹配到的项,指向了某个php页面,然后根据参数获取要访问的游戏应用标识,后数据库或者缓存里查询该应用标识,如果不存在则输出错误提示,如果应用存在则加载游戏应用链接地址。

 现在写一个php例子,假设我的ip为192.168.0.33,我加了一层名为router的路径,之后跟随的是 “/模块名/方法名/参数1的key/参数1的value/….”

类似这样的地址:

192.168.0.33/router/Hello/router/a/b/c/d/abc/index.html?id=3&url=http:………………

也就是要调用Ha这个模块中的router方法,并传入url后面的参数/a/b/c/d/index………….

 第一步,首先要在服务器的配置上对/router/路径进行拦截PHP实现一个简单url路由功能实例
调用某个文件夹目录下的index.php页面,假定现在所有模块使用单独的文件存放于class目录下,该目录与router平级,如下图所示:
PHP实现一个简单url路由功能实例

第二步,路由分发器的实现(index.php)

<!Doctype html>
 <html>
 <head>
 <title>路由测试~~</title>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 </head>
<body>
<?php
date_default_timezone_set("Asia/Shanghai");
 define("MODULE_DIR", "../class/");
 $_DocumentPath = $_SERVER['DOCUMENT_ROOT'];
 $_FilePath = __FILE__;
 $_RequestUri = $_SERVER['REQUEST_URI']; 
 $_AppPath = str_replace($_DocumentPath, '', $_FilePath);  //==>\router\index.php
 $_UrlPath = $_RequestUri;  //==>/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 $_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);
 
 /**
 * http://192.168.0.33/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 * 
 * /hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 */ 
 for ($i = 0; $i < count($_AppPathArr); $i++) {
   $p = $_AppPathArr[$i];
   if ($p) {
    $_UrlPath = preg_replace('/^\/'.$p.'\//', '/', $_UrlPath, 1);
   }
 }
 
 $_UrlPath = preg_replace('/^\//', '', $_UrlPath, 1);
 
 $_AppPathArr = explode("/", $_UrlPath);
 $_AppPathArr_Count = count($_AppPathArr);
 
 $arr_url = array(
  'controller' => 'index',
   'method' => 'index',
   'parms' => array()
 );
 
 $arr_url['controller'] = $_AppPathArr[0];
 $arr_url['method'] = $_AppPathArr[1];
 
 if ($_AppPathArr_Count > 2 and $_AppPathArr_Count % 2 != 0) {
   die('参数错误');
 } else {
   for ($i = 2; $i < $_AppPathArr_Count; $i += 2) {
     $arr_temp_hash = array(strtolower($_AppPathArr[$i])=>$_AppPathArr[$i + 1]);
     $arr_url['parms'] = array_merge($arr_url['parms'], $arr_temp_hash);
   }
 }
 
 $module_name = $arr_url['controller'];
 $module_file = MODULE_DIR.$module_name.'.class.php';
 $method_name = $arr_url['method'];
 
 if (file_exists($module_file)) {
   include $module_file;
   
   $obj_module = new $module_name();
   
   if (!method_exists($obj_module, $method_name)) {
     die("要调用的方法不存在");
  } else {
     if (is_callable(array($obj_module, $method_name))) {
       $obj_module -> $method_name($module_name, $arr_url['parms']);
       
       $obj_module -> printResult();
     }
   }
   
 } else {
   die("定义的模块不存在");
 }
  
 ?>
 
</body>
 </html>

 获取请求的uri,然后拿到要加载的模块名、调用方法名,对uri参数进行简单的判断..

第三步,模块的编写

根据上述的uri,我们要调用的是Hello模块下的router方法,那么可以在class目录下定义一个名为Hello.class.php的文件(注意linux下是区分大小写的)

<?php
class Hello {
 private $_name;
private $_varValue;
   
   function __construct() {
     
   }
   
   function router() {
     $this->_name = func_get_arg(0);
     $this->_varValue = func_get_arg(1);
   }   
   function printResult() {
    echo $this->_name;
    echo "<p>";
    echo var_dump($this->_varValue);
     echo "</p>";
  }
 }
 ?>

同理,我们可以编写Ha模块..

这算是实现了很简单的url路由分发功能了…

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
给php新手谈谈我的学习心得
Feb 25 PHP
php读取mysql乱码,用set names XXX解决的原理分享
Dec 29 PHP
PHP输入流php://input介绍
Sep 18 PHP
基于Zend的Config机制的应用分析
May 02 PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 PHP
PHP实现搜索相似图片
Sep 22 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
PHP 自动加载的简单实现(推荐)
Aug 12 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 #PHP
php foreach如何跳出两层循环(详解)
Nov 05 #PHP
PHP不使用递归的无限级分类简单实例
Nov 05 #PHP
php  单例模式详细介绍及实现源码
Nov 05 #PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 #PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 #PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 #PHP
You might like
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python定时任务 sched模块用法实例
2019/11/04 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
详细分析Python collections工具库
2020/07/16 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
介绍一下Java中的static关键字
2012/05/12 面试题
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
普通党员对照检查材料
2014/09/24 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
公司市场部岗位职责
2015/04/15 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
2016年父亲节寄语
2015/12/04 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
七年级作文之环保作文
2019/10/17 职场文书