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的FTP学习(一)
Oct 09 PHP
PHP面向对象法则
Feb 23 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
php图像处理函数大全(推荐收藏)
Jul 11 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
一个PHP的ZIP压缩类分享
May 04 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
10条php编程小技巧
Jul 07 PHP
浅谈COOKIE和SESSION区别
Jul 19 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
thinkPHP线上自动加载异常与修复方法实例分析
Dec 01 PHP
php+redis实现商城秒杀功能
Nov 19 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
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
php fread函数使用方法总结
2019/05/28 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
初识Node.js
2015/03/20 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
联谊会主持词
2014/03/26 职场文书
住宅质量保证书
2014/04/29 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
云冈石窟导游词
2015/02/04 职场文书
导游词之山东八大关
2019/12/18 职场文书
吃通javascript正则表达式
2021/04/21 Javascript