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中的日期及时间
Nov 23 PHP
实现了一个PHP5的getter/setter基类的代码
Feb 25 PHP
php面向对象全攻略 (十五) 多态的应用
Sep 30 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
php传值赋值和传地址赋值用法实例分析
Jun 20 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
php实现的顺序线性表示例
May 04 PHP
关于laravel5.5的定时任务详解(demo)
Oct 23 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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
JAVA/JSP学习系列之六
2006/10/09 PHP
php中常用编辑器推荐
2007/01/02 PHP
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
javascript常用方法总结
2015/05/14 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
python数据结构之二叉树的遍历实例
2014/04/29 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
python简单实现获取当前时间
2016/08/27 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
Python input函数使用实例解析
2019/11/22 Python
Python如何安装第三方模块
2020/05/28 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
中文教师求职信
2014/02/22 职场文书
伏羲庙导游词
2015/02/09 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server