亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

CI框架源碼閱讀筆記7 配置管理組件 Config.php

2020-03-22 20:28:35
字體:
供稿:網(wǎng)友
  • 一個靈活可控的html' target='_blank'>應(yīng)用程序中,必然會存在大量的可控參數(shù)(我們稱為配置),例如在CI的主配置文件中(這里指Application/Config/Config.php文件),有如下多項配置:

    $config['base_url']   = 'http://test.xq.com';$config['index_page'] = '';$config['uri_protocol']     = 'AUTO';$config['url_suffix'] = '.html';$config['language']  = 'english';$config['charset'] = 'UTF-8';$config['enable_hooks'] = FALSE;…………………………

    不僅如此,CI還允許你將配置參數(shù)放到主配置文件之外。例如,你可以定義自己的配置文件為Config_app.php, 然后在你的應(yīng)用程序控制器中這樣加載你的配置文件:

    $this->config->load('config_app');

    如此紛繁多樣的配置項和配置文件,CI是如何進行管理的?這便是我們今天要跟蹤的內(nèi)容:CI的配置管理組件-Config.php.

    先看該組件的類圖:

    其中:

    _config_paths:要搜索的配置文件的路徑,這里指APPPATH目錄,你的配置文件也應(yīng)該位于APPPATH下。

    Config: 這個數(shù)組用于存放所有的配置項的item

    Is_loaded: 存放所有的已經(jīng)加載的配置文件列表。

    _construct: 組件的構(gòu)造函數(shù),主要是配置base_url

    _assign_to_config: 允許index.php中的配置項覆蓋主配置文件中的設(shè)置

    _uri_string,site_url,base_url,system_url: URI, 項目路徑等相關(guān)處理。

    load: 加載配置文件。

    item:獲取配置項

    slash_item:同item,不同的是,在最后加了”/”分隔符,一般只有site_url,base_url等會需要slash_item

    下面我們?nèi)テ饰龈鱾€方法的具體實現(xiàn):

    1.  組件初始化 _construct

    之前我們在分析Common.php全局函數(shù)的時候提到過,在Config組件實例化之前,所有的組配置文件的獲取都是由get_config()函數(shù)來代理的。在Config組件實例化時,要將所有的配置存放到自己的私有變量$config中,便于之后的訪問和處理:

    $this->config =& get_config();

    由于我們應(yīng)用程序很多時候需要獲取base_url的值,而這個值并不是必填項(config中base_url可以設(shè)置為空),但我們又不希望獲取到的base_url的值為空。因此,CI在Config組件初始化的時候,對base_url做了一定的處理。這主要出現(xiàn)在Config.php中base_url設(shè)置為空的情況:

    (1). 如果設(shè)置了$_SERVER[‘HTTP_HOST’],則base_url被設(shè)置為Protocal(http或者https) + $_SERVER['HTTP_HOST'] + SCIRPT_PATH的形式:

    $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';$base_url .= '://'. $_SERVER['HTTP_HOST'];$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);

    (2). 否者,直接被設(shè)置為http://localhost/:

    $base_url = 'http://localhost/';

    (3). 同時將base_url配置項映射到配置數(shù)組中,方便之后的訪問(set_item方法我們稍后會將,這里只需要知道,它是添加到配置項且會覆蓋舊值):

    $this->set_item('base_url', $base_url);

    之后我們會看到,base_url這個配置項對于很多組件都是必須的,因此,CI花費一定的精力來保證base_url的正確性,也是可以理解的。

    2.  加載配置文件 load

    這是Config組件中較核心的方法之一,該函數(shù)的簽名:

    function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)

    所有的參數(shù)都是可選參數(shù)。

    我們這里簡單解釋一下各形參的含義:

      $file 需要加載的配置文件,可以包含后綴名也不可以不包含,如果未指定該參數(shù),則默認加載Config.php文件

      $user_sections: 是否為加載的配置文件使用獨立的section,這么說可能還是不明白,試想,如果你定義了自己的配置文件,而你的配置文件中的配置項可能與Config.php文件中的配置項沖突,通過指定$section為true可以防止配置項的覆蓋。

      $fail_gracefully: 要load的配置文件不存在時的處理。Gracefully意為優(yōu)雅的,如果該參數(shù)設(shè)置為true,則在文件不存在時只會返回false,而不會顯示錯誤。

    下面看該方法的具體實現(xiàn):

    (1). 配置文件名預(yù)處理:

    $file = ($file == '') ? 'config' : str_replace('.php', '', $file);

    這個$file最后只包含文件名,而不包含擴展名。如果該參數(shù)為空,則默認加載Config.php配置文件。這同時也說明,我們加載自己的配置文件時:

    $this->config->load("");與

    $this->config->load("config")效果是一樣的,而:

    $this->config->load("config_app")與

    $this->config->load("config_app.php")的效果也是一樣的。

    如果啟用了$use_sections,這個$file會作為config的主鍵。

    (2). 查找和加載配置文件。

    在跟蹤實現(xiàn)之前,先解釋幾個查找和加載過程中比較重要的參數(shù):

    $found 這個參數(shù)實際上是個flag,用于標識配置文件是否查找到,一旦查找到配置文件,則停止任何搜索。$loaded 同$found參數(shù)類似,這個$loaded也是一個flag,用于標識請求的配置文件是否被加載。一般情況下,被加載的配置文件會被CI_Config:: is_loaded變量追蹤$_config_path 要查找的配置路徑,這個變量由于是寫死在Config組件中的,且沒有提供添加或者更改的接口。因此我們可以認為_config_path就是APPPATH.也就是,配置文件的load一定是在APPPATH目錄下查找的。$check_locations 這個參數(shù)是要查找的位置(具體文件)。同樣,如果定了ENVIRONMENT且存在相應(yīng)ENVIRONMENT下的配置文件,優(yōu)先加載該文件。

    (3).具體的查找過程是一個雙重的foreach循環(huán):

    /*  對于config_paths中的路徑循環(huán)查找 */foreach ($this->_config_paths as $path){	  /* 對每個location查找,也就是分別對ENVIRONMENT/config/ 和 config/ 目錄查找  */  foreach ($check_locations as $location)  {	/* 實際的配置文件名 */	$file_path = $path.'config/'.$location.'.php';	
    /* 如果已經(jīng)加載,則跳至最外層循環(huán),事實上,由于_config_paths的設(shè)定,會跳出整個循環(huán) */ if (in_array($file_path, $this->is_loaded, TRUE)) {   $loaded = TRUE;   continue 2; } /* 若文件存在,跳出當前循環(huán) */ if (file_exists($file_path)) {   $found = TRUE;   break; }  }  /* 如果沒有找到配置文件,繼續(xù)下一次循環(huán)。同樣,由于_config_path的設(shè)定,會跳出整個循環(huán) */  if ($found === FALSE)  { continue;  }}

    (4).引入配置文件

    到這里,如果配置文件不存在,則$found和$loaded都為false,CI會根據(jù)fail_gracefully參數(shù)決定文件不存在的處理方式;如果文件存在,則需要對配置文件的格式檢查:

    /* 引入配置文件 */include($file_path);/* 配置文件的格式檢查,這同時也說明,配置文件中最起碼應(yīng)該包含$config數(shù)組 */if ( ! isset($config) OR ! is_array($config)){  if ($fail_gracefully === TRUE)  {	return FALSE;  }  show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');}

    (5).對use_sections參數(shù)的處理

    前面說過,use_secitons參數(shù)如果為true,則CI_Config會對該配置文件啟用獨立的key存儲。例如,我們在controller中這樣加載配置文件:

    $this->config->load("config_app",true);

    則config數(shù)組是這樣的格式:

    [config] => Array(    [base_url] => http://test.xq.com    [index_page] =>    [uri_protocol] => AUTO    [url_suffix] => .html    [proxy_ips] =>    [web_akey] => yyyyyyyyyyyy    [config_app] => Array        (            [web_akey] => xxxxxxx            [web_skey] => xxxxxxxxxxxxxxxxxxx            [web_callback_url] => http://test.xq.com/            [sess_pre] => WEB_APP            [cart_min] => 1            [cart_max] => 999        ))

    相反,如果我們不指定use_sections,則數(shù)組是這樣存儲的:

    [config] => Array(    [base_url] => http://test.xq.com    [index_page] =>    [uri_protocol] => AUTO    [url_suffix] => .html    [web_akey] => xxxxxxx    [web_skey] => xxxxxxxxxxxxxxxxxxx    [web_callback_url] => http://test.xq.com/    [sess_pre] => WEB_APP    [cart_min] => 1    [cart_max] => 999)

    這也意味著,在不啟用user_secitons的情況下,如果你的配置文件中有與主配置文件Config.php相同的鍵,則會覆蓋主配置文件中的項:

    /* 啟用單獨的key存放加載的config */if ($use_sections === TRUE){  if (isset($this->config[$file]))  {	$this->config[$file] = array_merge($this->config[$file], $config);  }  else  {	$this->config[$file] = $config;  }}else{  /* 執(zhí)行merge,更改CI_Config::config */  $this->config = array_merge($this->config, $config);}

    (6).錯誤處理

    雙層循環(huán)完成后,如果loaded為false,也就是未成功加載任何配置,則根據(jù)fail_gracefully做相應(yīng)的錯誤處理:

    /* 未成功加載任何配置 */if ($loaded === FALSE){  if ($fail_gracefully === TRUE)  {	return FALSE;  }  show_error('The configuration file '.$file.'.php does not exist.');}
    3.  獲取配置項item,slash_item

    item方法用于在配置中獲取特定的配置項,改方法的簽名:

    function item($item, $index = '')

    注意,如果你在load配置文件的時候啟用了use-sections,則在使用item()獲取配置項的時候需要指定第二個參數(shù),也就是加載的配置文件的文件名(不包含后綴)。為了更清楚這一點,我們假設(shè)現(xiàn)在Config/目錄下有配個配置文件:config.php和config_app.php,這兩個配置文件中含有一個相同的鍵web_akey, 在config.php中,該配置為:

    $config['web_akey']  = 'yyyyyyyyyyyy';

    而config_app.php中,該配置為:

    $config['web_akey'] = 'xxxxxxx';

    現(xiàn)在,通過use-sections的方法加載config_app配置文件(config.php會在Config組件初始化的時候被加載):

    $this->config->load("config_app",true);

    然后在控制器中獲取web_akey配置項:

    echo "config_app:web_akey => ",$this->config->item("web_akey","config_app"),"<br/>";echo "config    :web_akey => ",$this->config->item("web_akey");

    實際的獲取結(jié)果:

    config_app:web_akey => xxxxxxxconfig :web_akey => yyyyyyyyyyyy

    了解原理之后,該方法的實現(xiàn)就比較簡單了:

    function item($item, $index = ''){	  /* 沒有設(shè)置use_sections的情況,直接在config中尋找配置項 */  if ($index == '')  {	if ( ! isset($this->config[$item]))	{	  return FALSE;	}	$pref = $this->config[$item];  }  else  {	if ( ! isset($this->config[$index]))	{	  return FALSE;	}	if ( ! isset($this->config[$index][$item]))	{	  return FALSE;	}	$pref = $this->config[$index][$item];  }  /* 統(tǒng)一的return出口 */  return $pref;}

    slash_item實際上與item()方法類似,但他不會去用戶的配置中尋找,并且,他返回的是主配置文件中的配置項,并在配置項最后添加反斜杠.這個方法,通常用于base_url和index_page這兩個配置項的處理:

    該方法的實現(xiàn)源碼:

    function slash_item($item){	  /* 不存在配置項 */  if ( ! isset($this->config[$item]))  {	return FALSE;  }  /* 配置項為空 */  if( trim($this->config[$item]) == '')  {	return '';  }	  /* 去除最后的多余的"/",并在結(jié)尾添加一個"/" */  return rtrim($this->config[$item], '/').'/';}
    4.  獲取站點site_url, base_url,system_url

    這里先澄清這幾個含義的區(qū)別:

    echo "site_url  : ",$this->config->site_url("index/rain"),"</br>";echo "base_url  : ",$this->config->base_url("index/rain"),"<br/>";echo "system_url: ",$this->config->system_url();

    的結(jié)果分別是:

    site_url : http://test.xq.com/index/rain.htmlbase_url : http://test.xq.com/index/rainsystem_url: http://test.xq.com/system/

    可以看出,site_url是添加了suffix(在Config/config.php中配置)后的url地址(呵呵,如果你的uri中有query string,則Ci總是在最后添加suffix:http://test.xq.com/index/rain?w=ss.html 是不是很奇怪.)

    base_url則是沒有添加suffix的url地址。

    而system_url這個東西很奇怪,是獲取系統(tǒng)的url路徑。但實際上,由于system路徑并沒有直接執(zhí)行的腳本,所以這個方法的實際用途是什么,暫時不知。有知道的童鞋麻煩告知。

    具體的方法實現(xiàn),這里不贅述了。直接貼出源碼:

    function site_url($uri = ''){	/* 沒有設(shè)置uri,使用base_url + index_page */	if ($uri == '')	{		return $this->slash_item('base_url').$this->item('index_page');	}		/* enable_query_strings未啟用,可以添加suffix后綴 */	if ($this->item('enable_query_strings') == FALSE)	{		$suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');		return $this->slash_item('base_url').$this->slash_item('index_page').$this->_uri_string($uri).$suffix;	}	/* 否者不添加suffix后綴 */	else	{		return $this->slash_item('base_url').$this->item('index_page').'?'.$this->_uri_string($uri);	}}/* 獲取base_url,注意與site_url的區(qū)別 */function base_url($uri = ''){	return $this->slash_item('base_url').ltrim($this->_uri_string($uri), '/');}/* 獲取system url */function system_url(){       /* 獲取系統(tǒng)目錄.   BASEPATH:/search/xx/phpCode/CI/system/ */    $x = explode("/", preg_replace("|/*(.+?)/*$|", "http://1", BASEPATH));    return $this->slash_item('base_url').end($x).'/';}
    5.  獲取URI String: _uri_string

    site_url和base_url都調(diào)用了_uri_string。這個函數(shù)是做什么用的呢?

    按理來說, _uri_string的功能應(yīng)該由URI組件來完成,這里卻放在了Config組件中,似乎有些不妥(實際上,_uri_string是為base_url和site_url專屬服務(wù)的)。

    對于這樣的uri:

    array(    'p1' => 'param1',    'p2' => 'param2')

    如果enable_query_string為false,則_uri_string處理過后是這樣的形式:

    param1/param2

    而enable_query_string為true,則處理后的形式是這樣的:

    p1=param1&p2=param2

    這是我們常見(雖然很難看且SEO不好)的形式。改方法的實現(xiàn)源碼:

    protected function _uri_string($uri){		/* enable_query_strings 為false,直接implode */	if ($this->item('enable_query_strings') == FALSE)	{		if (is_array($uri))		{			$uri = implode('/', $uri);		}		$uri = trim($uri, '/');	}	/* 否者,拼接成類似param1=param1&param2=param2的形式 */	else	{		if (is_array($uri))		{			$i = 0;			$str = '';			foreach ($uri as $key => $val)			{					/* 第一個參數(shù)前面不需要加& */				$prefix = ($i == 0) ? '' : '&';				$str .= $prefix.$key.'='.$val;				$i++;			}			$uri = $str;		}	}    return $uri;}
    6.  設(shè)置配置項 set_item _assign_to_config

    與item()相反,set_item用于設(shè)置配置項。如果配置項已經(jīng)存在,則會被覆蓋:

    $this->config[$item] = $value;

    _assign_to_config同set_item,該方法提供了數(shù)組的設(shè)置方式(調(diào)用set_item。我們之前在解釋CodeIgniter.php文件的時候提到過:改方法允許在index.php中設(shè)置獨立的配置項,且index.php中的配置具有更高的優(yōu)先權(quán)(會覆蓋主配置文件中的配置):

    function _assign_to_config($items = array()){	if (is_array($items))	{		foreach ($items as $key => $val)		{			$this->set_item($key, $val);		}	}}

    到這里,Config組件的基本解析就算是完成了,我們再次回顧下該組件的基本功能:

    set_item和item是Config組件的基本對外接口。也就是常見的setter 和getter,_assign_to_config算是批量的setter,slash_item則是特殊處理的getterload方法是加載配置文件,如果你自定義了自己的配置文件,需要先load使得你的配置納入CI_Config的管理之下。system_url,base_url,site_url,用于獲取特定的配置項。_uri_string是CI_Config中唯一一個Protected的方法。這個方法主要是處理uri,提供給site_url和base_url使用

    最后感慨一下,一個好的Config組件,會省不少事啊。

    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    蜜桃av一区二区三区电影| 日本不卡一区在线| 亚洲专区一区二区三区| 久久久久久一区二区三区四区别墅| 四虎永久在线精品无码视频| 日本一区二区免费在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 九九九在线视频| 456成人影院在线观看| xxxxwwww欧美| 亚州av中文字幕在线免费观看| 不卡av播放| 精品成人在线| 成人网欧美在线视频| 青青草免费av| 日韩第一页在线观看| 精品卡一卡卡2卡3网站| 天天综合久久| sesexxxx| 一级片免费观看视频| 欧美高清视频在线观看mv| 人妻少妇精品久久| 精品一二三四区| 人在线成免费视频| 免费在线a视频| 丰满少妇一区二区三区| 欧美日韩中文字幕日韩欧美| 亚洲91精品在线观看| 51精品国产人成在线观看| 99视频有精品高清视频| 懂色aⅴ精品一区二区三区| 亚洲国产精品久久不卡毛片| 成人免费黄色小视频| 精品人妻少妇嫩草av无码| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩啪啪电影网| 亚洲成年电人电影网站| 黄动漫视频高清在线| 国产suv精品一区二区| 免费av高清| 天堂网av2018| 少妇人妻精品一区二区三区| 日韩人妻精品一区二区三区| 天堂av中文在线资源库| 久久久久国产一区二区| 免费在线成人网| 男人天堂资源在线| 在线免费观看一区| 精品国精品国产自在久国产应用| 亚洲综合国产激情另类一区| 亚洲天堂久久新| 国产suv精品一区二区| 精品国产第一国产综合精品| h版电影在线播放视频网站| 偷拍国模大尺度视频在线播放| 国产乱色在线观看| 欧美另类videosbestsex日本| 欧美精品总汇| 欧美精品v国产精品v日韩精品| 开心九九激情九九欧美日韩精美视频电影| 国产精品无遮挡| 韩日中文字幕第一页| 欧美中文字幕一区二区三区| 17c国产在线| 91在线观看免费| 国产精品入口免费视| 在线一区二区三区做爰视频网站| 高清视频国产| 国产不卡一区二区视频| 久久高清无码视频| 青青一区二区| 性做久久久久久| 希岛爱理av一区二区三区| 亚洲精品suv精品一区二区| 国产精品久久精品牛牛影视| www.4hu95.com四虎| 91在线免费看| 欧美精彩视频一区二区三区| 国产成人精品免费看在线播放| 日韩黄色一级片| 中文字幕欧美精品日韩中文字幕| 污视频网站在线看| 亚洲av无码专区在线播放中文| 久热中文在线| 欧美日韩破处| 日韩成人中文电影| 国产高清在线观看免费不卡| 日韩在线视频一区二区三区| 成人国产精品免费| 免费黄色网址网站| 久久国产88| 久久久久久久电影一区| 亚洲最大成人| 欧美国产一区在线| 日本特级黄色片| 色中色一区二区| 色婷婷一区二区三区四区| 日韩欧美在线影院| 韩国日本不卡在线| 国产精品高清亚洲| 国产女优在线播放| 性猛交xxxx乱大交孕妇印度| 网站一区二区三区| 亚洲精品一区二区三区影院忠贞| www在线免费观看视频| 亚洲第一区中文字幕| 亚洲看片免费| 妺妺窝人体色WWW精品| 国产伦精品一区二区三区妓女| 成人性做爰aaa片免费看不忠| 日韩久久一级片| 国产又大又黄又爽| 国产免费内射又粗又爽密桃视频| 999精品在线| 国产伦精品一区二区三区妓女| 国产亚洲综合色| 国产又大又长又粗又黄| 欧美成人高清视频| 亚洲黄色片免费| 国产欧美一区二区三区在线看| 秋霞一区二区三区| 国产黄色一级网站| 国产xxx免费观看| 日韩在线一区视频| 日韩av中文字幕一区二区| 亚洲精品欧美一区二区三区| 免费一级欧美片在线观看网站| 免费看的www视频网站视频| 国产伦精品一区二区免费| 久久免费在线观看| 欧美69精品久久久久久不卡| 蜜桃久久久久久| 欧美三级午夜理伦三级老人| 波多野结衣电车痴汉| 国产精品区一区二区三区| 国产精品国产三级国产在线观看| 久久99国产精一区二区三区| 国产一区日韩二区欧美三区| 中文字幕av片| 亚洲免费在线| 国产喷水在线观看| 欧美一级大片在线视频| 成年人网站大全| 国产精品极品在线| 无需播放器亚洲| 围产精品久久久久久久| 欧美风情第一页| 欧美视频在线免费播放| 色欲狠狠躁天天躁无码中文字幕| 亚洲区一区二区| 污视频网站免费在线观看| 日本高清一区二区视频| 免费黄色av片| 欧美jjzz| 一区两区小视频| 精品国产老师黑色丝袜高跟鞋| 国产精品免费91| 久久亚区不卡日本| 777精品久无码人妻蜜桃| 亚洲午夜久久久久久久国产| 视频一区二区免费| 亚洲激情文学| 69视频在线播放| 麻豆精品视频入口| 国产色产综合色产在线视频| 一级黄色片在线| 欧美午夜精品一区二区三区电影| av官网在线播放| 国产精品被窝福利一区| 成人啊v在线| www.youjizz.com亚洲| 亚洲午夜精品久久久久久app| 欧美老女人第四色| xxx亚洲日本| 后进极品白嫩翘臀在线视频| caopon在线免费视频| 亚洲人成网站在线| 亚洲人成网亚洲欧洲无码| aiai在线| 欧美日韩国产一区二区| 女人又爽又黄免费女仆| 欧美乱xxxxxxxxx| 日本影音先锋电影| 成人免费毛片男人用品| 中文字幕人妻熟女人妻a片| 日韩欧美一级二级三级| 婷婷久久综合九色综合绿巨人| 亚洲天堂黄色片| 日av在线播放中文不卡| 中文字幕国产精品一区二区| 免费在线午夜视频| 日本高清不卡一区| caoporn视频在线观看| 青草在线视频在线观看| h片在线免费看| 国产精品国产三级国产aⅴ浪潮| 周于希免费高清在线观看| 捆绑凌虐一区二区三区| 日韩国产网站| xxxx.国产| 中文字幕国产日韩| 蜜桃在线一区二区三区精品| 成人写真视频福利网| 手机在线成人免费视频| 国产久卡久卡久卡久卡视频精品| 黄色一级视频免费| 精品亚洲成a人| 午夜精品成人在线| 337p日本欧洲亚洲大胆张筱雨| 亚洲影院理伦片| 国产精品亚洲第一区| 国产91成人在在线播放| 久久久久.com| 日本成本人片免费观看| 精品999视频| av影院在线播放| 136国产福利精品导航| 99久久久无码国产精品不卡| 黄网站免费在线播放| 日韩欧美国产小视频| 国产福利91精品一区二区三区| 两个人hd高清在线观看| 国产精品日韩成人| 日本不卡免费在线视频| 久久久久久91亚洲精品中文字幕| 亚洲成av人片乱码色午夜| 亚洲精品一区二区在线观看| 成人精品免费看| 在线日韩一区二区| 国内精品偷拍视频| 欧美激情一区二区三区成人| 国产日韩av一区二区| 污视频网站免费看| 99re热这里只有精品免费视频| 欧美激情国内自拍| 性感美女极品91精品| 亚洲综合丁香| 日韩精品视频网站| 欧美日韩二区三区| 亚洲第一在线综合在线| 欧美a级片一区| 日韩成人高清| 国产精品被窝福利一区| 久久亚洲精品国产| 欧美一级一片| 午夜精产品一区二区在线观看的| 中文资源在线网| 日韩中文字幕av在线| 丁香高清在线观看完整电影视频| 国产午夜福利视频在线观看| 在线视频你懂得| 手机在线观看av网站| 成人免费无遮挡无码黄漫视频| 9.1成人看片免费版| 免费观看一区二区三区| 欧美伊人精品成人久久综合97| 日韩影院二区| 久热99视频在线观看| 精品国模一区二区三区| 国产一级黄色电影| 国产成人97精品免费看片| 天天综合网网欲色| av 日韩 人妻 黑人 综合 无码| 亚洲成av人片观看| 精品99久久| 国产剧情久久久| 国内外成人在线| 欧美激情综合亚洲一二区| 三级欧美日韩| 国产综合内射日韩久| 四虎久久影院| 精品国产18久久久久久二百| 国产色噜噜噜91在线精品| 深夜福利av你懂的| 天堂一区二区三区四区| www视频网站| 日韩女优视频免费观看| 中文字幕男人天堂| 最新日韩免费视频| 欧美亚洲日本一区二区三区| 亚洲成av人片在线观看| 国产精品无码久久久久成人app| 国产精品久久久久精k8| 日韩精品视频在线观看网址| 99久久婷婷国产综合| 7777狠狠狠琪琪电影| 日韩精品视频网| 蜜芽在线视频| 色婷婷国产精品综合在线观看| 涩涩视频在线观看下载| 亚洲午夜国产成人| 亚洲精品国产suv一区88| 亚洲国产精品va在线看黑人动漫| 成人在线视频福利| 久久综合毛片| 欧美国产乱子伦| 欧美日韩国产影片| 免费激情视频网站| 国产精品二线| 欧美色倩网站大全免费| 欧美精品国产精品日韩精品| 综合亚洲视频| 一起操在线视频| h片在线免费看| 成人羞羞国产免费网站| 国产精品一区二区在线观看网站| 色婷婷一区二区三区四区| 99久久免费精品国产72精品九九| 91在线视频导航| 欧美边添边摸边做边爱免费| 麻豆专区一区二区三区四区五区| 久久国产精品免费精品3p| 亚洲国产av一区二区| 色一情一区二区| 欧美久久久久久| 香蕉久久夜色精品国产更新时间| 天天做天天爱天天综合网| 久久久久久久久久久久国产精品| 91成人精品视频| 黄色免费网站在线| 久久中文字幕无码| 黄色成人在线观看| 99久久综合狠狠综合久久止| 免费看片91| 欧美一级免费在线观看| 日韩欧美一区电影| 国产精品视频在线看| 亚洲成a人片77777在线播放|