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 5.0 Pear安装方法
Dec 06 PHP
一篇入门的php Class 文章
Apr 04 PHP
php 404错误页面实现代码
Jun 22 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
php创建sprite
Feb 11 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
php的一个登录的类 [推荐]
2007/03/16 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
英语自荐信范文
2013/12/11 职场文书
广告学毕业生求职信
2014/01/30 职场文书
婚庆司仪主持词
2014/03/15 职场文书
表彰大会主持词
2014/03/26 职场文书
市场营销工作计划书
2014/05/06 职场文书
2014年残联工作总结
2014/11/21 职场文书
晚会开场白和结束语
2015/05/29 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
Python装饰器详细介绍
2022/03/25 Python