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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
php实现源代码加密的方法
Jul 11 PHP
php中使用GD库做验证码
Mar 31 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
PHP读取word文档的方法分析【基于COM组件】
Aug 01 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
学习jquery之一
2007/04/27 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python简单商城购物车实例代码
2018/03/15 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
python 连续不等式语法糖实例
2020/04/15 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
40岁生日感言
2014/02/15 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
公司放假通知范文
2015/04/14 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
详解OpenCV曝光融合
2022/04/29 Python
讲解MySQL增删改操作
2022/05/06 MySQL