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 array_intersect()函数使用代码
Jan 14 PHP
ajax+php打造进度条 readyState各状态
Mar 20 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
May 14 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
Dec 22 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
PHP实现数组array转换成xml的方法
Jul 19 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
PHP抽象类基本用法示例
Dec 28 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 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实现监控varnish缓存服务器的状态
2014/12/30 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
详解js的六大数据类型
2016/12/27 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Django中处理出错页面的方法
2015/07/15 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
python实现京东秒杀功能
2018/07/30 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
使用python3构建文件传输的方法
2019/02/13 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
运动会入场解说词
2014/02/07 职场文书
超市创业计划书
2014/09/15 职场文书
2014年度个人工作总结
2014/11/07 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript