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 相关文章推荐
header中Content-Disposition的作用与使用方法
Jun 13 PHP
php模板原理讲解
Nov 13 PHP
php去除字符串换行符示例分享
Feb 13 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
如何解决PHP无法实现多线程的问题
Sep 25 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 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
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
js模仿hover的具体实现代码
2013/12/30 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
python 重命名轴索引的方法
2018/11/10 Python
如何利用python进行时间序列分析
2020/08/04 Python
python如何设置静态变量
2020/09/07 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
python excel多行合并的方法
2020/12/09 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
英文留学推荐信范文
2014/01/25 职场文书
赡养老人协议书
2014/04/21 职场文书
我爱我家教学反思
2014/05/01 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
幼师中班个人总结
2015/02/12 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
导游词之山东红叶谷
2019/10/31 职场文书