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生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
php单链表实现代码分享
Jul 04 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
php socket方式提交的post详解
2008/07/19 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
Python 字符串操作方法大全
2014/03/11 Python
Python实现截屏的函数
2015/07/25 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
python实现控制COM口的示例
2019/07/03 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
哈弗商学院毕业生求职信
2014/02/26 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB
Python 文字识别
2022/05/11 Python