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版(2)
Oct 09 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
PHP中include和require的区别实例分析
May 07 PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 PHP
基于PHP实现发微博动态代码实例
Dec 11 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
用php+mysql一个名片库程序
2006/10/09 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
php多文件上传实现代码
2014/02/20 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
js解析json读取List中的实体对象示例
2014/03/11 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
python实现KNN分类算法
2019/10/16 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
AURALog面试题软件测试方面
2013/10/22 面试题
幼儿园大班新学期寄语
2014/01/18 职场文书
销售顾问岗位职责
2014/02/25 职场文书
工程管理英文求职信
2014/03/18 职场文书
食品安全承诺书
2014/05/22 职场文书
应届生找工作求职信
2014/06/24 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS
css3新特性的应用示例分析
2022/03/16 HTML / CSS
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫
Redis实现短信验证码登录的示例代码
2022/06/14 Redis