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 selectradio和checkbox默认选择的实现方法详解
Jun 29 PHP
phpmyadmin config.inc.php配置示例
Aug 27 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
微信公众平台开发实现2048游戏的方法
Apr 15 PHP
php结合正则获取字符串中数字
Jun 19 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
php连接mysql数据库最简单的实现方法
Sep 24 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
用php如何解决大文件分片上传问题
Jul 07 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电台频率大全 - 1 北京市
2020/03/11 无线电
PHP时间戳使用实例代码
2008/06/07 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
销售自荐信
2013/10/22 职场文书
测绘工程个人的自我评价
2013/11/10 职场文书
教育学专业毕业生的自我评价
2013/11/21 职场文书
公务员转正考察材料
2014/02/07 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
药店促销活动策划方案
2014/08/24 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
教师节简报
2015/07/20 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python
对Golang中的FORM相关字段理解
2021/05/02 Golang
python获取对象信息的实例详解
2021/07/07 Python