CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析


Posted in PHP onMay 18, 2016

本文实例讲述了CI框架URI.php中_fetch_uri_string()函数用法。分享给大家供大家参考,具体如下:

APPPATH/config/config.php中对于url 格式的拟定。

$config['uri_protocol'] = 'AUTO';

这个配置项目定义了你使用哪个服务器全局变量来拟定URL。
默认的设置是auto,会把下列四个方式轮询一遍。当你的链接不能工作的时候,试着用用auto外的选项。

'AUTO'            Default - auto detects
'PATH_INFO'        Uses the PATH_INFO
'QUERY_STRING'            Uses the QUERY_STRING
'REQUEST_URI'        Uses the REQUEST_URI
'ORIG_PATH_INFO'    Uses the ORIG_PATH_INFO 

CI_URI中的几个成员变量

$keyval = array(); //List  of cached uri segments
$uri_string; //Current  uri string
$segments //List  of uri segments
$rsegments = array() //Re-indexed  list of uri segments

获取到的current uri string 赋值到 $uri_string ,通过function _set_uri_string($str)。

获取到$str有几个选项,也就是_fetch_uri_string()的业务流程部分了

一、默认

$config['uri_protocol'] = 'AUTO'

时,程序会一次轮询下列方式来获取URI

(1)当程序在CLI下运行时,也就是在命令行下php文件时候。ci会这么获取URI

private function _parse_cli_args()
{
  $args = array_slice($_SERVER['argv'], 1);
  return $args ? '/' .implode('/',$args) : '';
}

$_SERVER['argv'] 包含了传递给脚本的参数 当脚本运行在CLI时候,会给出c格式的命令行参数

截取到$_SERVER['argv']中除了第一个之外的所有参数 

如果你在命令行中这么操作

php d:\wamp\www\CodeIgniter\index.php\start\index

_parse_cli_args() 返回一个 /index.php/start/index的字符串

(2)默认使用REQUEST_URI来探测url时候会调用 私有函数  _detect_uri()

(3)如果上面的两种方式都不能获取到uri那么会采用$_SERVER['PATH_INFO']来获取

$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO']  : @getenv('PATH_INFO');
if (trim($path, '/')  != '' && $path != "/".SELF)
{
  $this->_set_uri_string($path);
  return;
}

(4)如果上面三种方式都不能获取到,那么就使用

$_SERVER['QUERY_STRING']或者getenv['QUERY_STRING']

$path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
if (trim($path, '/') != '')
{
  $this->_set_uri_string($path);
  return;
}

(5)上面四种方法都不能获取到URI,那么就要使用$_GET数组了,没招了

if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
{
  $this->_set_uri_string(key($_GET));
  return;
}

二、在config.php中设定了:

$config['uri_protocol']

那么 程序会自动执行相应的操作来获取uri

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php数字转汉字代码(算法)
Oct 08 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 PHP
php格式化日期实例分析
Nov 12 PHP
PHP合并数组+号和array_merge的区别
Jun 25 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
Jan 08 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
Laravel ORM 数据model操作教程
Oct 21 PHP
Laravel 6.2 中添加了可调用容器对象的方法
Oct 22 PHP
PHP正则表达式入门教程(推荐)
May 18 #PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 #PHP
CI框架文件上传类及图像处理类用法分析
May 18 #PHP
CI框架实现cookie登陆的方法详解
May 18 #PHP
浅析php静态方法与非静态方法的用法区别
May 17 #PHP
php关闭warning问题的解决方法
May 17 #PHP
XHProf报告字段含义的解析
May 17 #PHP
You might like
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
PHP 验证登陆类分享
2015/03/13 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
简单的编程0基础下Python入门指引
2015/04/01 Python
详解Python中的各种函数的使用
2015/05/24 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
深入了解Django中间件及其方法
2019/07/26 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
Python-opencv 双线性插值实例
2020/01/17 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
软件测试工程师笔试题带答案
2015/03/27 面试题
工程资料员岗位职责
2014/03/10 职场文书
个人委托书怎么写
2014/09/17 职场文书
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技