精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

PHP與MySQL通訊那點事

開發(fā) 開發(fā)工具 后端
在我們的一款WebGame的生產環(huán)境中,一次無意的strace抓包時,發(fā)現(xiàn)了php與mysql大量通訊的數(shù)據。這種情況,在游戲服務器剛啟動時,是正常的,但如果是運行一段時間之后,出現(xiàn)大量SELECT的SQL查詢,絕對是有問題的,而且,所操作的數(shù)據庫并不是配置庫,那意味著,我們程序員的程序出現(xiàn)了違規(guī)的操作。

在我們的一款WebGame的生產環(huán)境中,一次無意的strace抓包時,發(fā)現(xiàn)了php與mysql大量通訊的數(shù)據。這種情況,在游戲服務器剛啟動時,是正常的,但如果是運行一段時間之后,出現(xiàn)大量SELECT的SQL查詢,絕對是有問題的,而且,所操作的數(shù)據庫并不是配置庫,那意味著,我們程序員的程序出現(xiàn)了違規(guī)的操作。具體結果大約如下:

 

如上圖所示,php持續(xù)接收讀取進程內描述符為3的響應包數(shù)據,描述符為3的為php與mysql建立的TCP通訊鏈接,這點也可以從313行的SELECT語句來確認。(原始數(shù)據丟失了,我模仿了一條。所以是配置庫的SQL語句)

這是什么程序,想實現(xiàn)什么邏輯?為何要取這么多數(shù)據?

跟著這里的SELECT的sql語句,我定位到了相應的程序段:

  1. /*  
  2. **  業(yè)務邏輯的代碼  
  3. */  
  4. public function SItem($roleId,$baseId) {  
  5.     //...  
  6.     // ############寫出下面這種代碼的人都得死.##################  
  7.     $this->dbrRole->select('*');  
  8.     $this->dbrRole->from('role_items');  
  9.     $this->dbrRole->where('role_id',$roleId);  
  10.     $this->dbrRole->where('baseId',$baseId);  
  11.     $result = $this->dbrRole->get()->row(); //看上去,這里好像正常,我們都以為框架會給我們只取一條。  
  12.     //...  

我們從代碼上來看,好像明白程序員想根據對應的role_id到role_items表里取一條想符合的數(shù)據,所以,他調用了row方法,來取一條。看上去,這里好像正常,我們都以為框架會給我們只取一條。但實際上,框架是如何處理的呢?

我們來看下框架的對應row方法的實現(xiàn)過程。對了,我們是CodeIgniter框架的一個較老的版本。

  1. /*  
  2. **  框架中,DB drive中,row相關方法的代碼  
  3. **  
  4. */ 
  5. public function row($n = 0,$type = 'array'){  
  6.     if(!is_numeric($n)){  
  7.         if(! is_array($this->_rowData)){  
  8.             $this->_rowData = $this->rowArray(0);  
  9.         }  
  10.         if(isset($this->_rowData[$n])){  
  11.             return $this->_rowData[$n];  
  12.         }  
  13.         $n = 0;  
  14.     }  
  15.     return ($type == 'object') ? $this->rowObject($n) : $this->rowArray($n);  
  16. }  
  17.  
  18. //繼續(xù)跟進rowArray方法  
  19. public function rowArray($n = 0){  
  20.     $result = $this->resultArray();  
  21.     if(count($result) == 0){  
  22.         return $result;  
  23.     }  
  24.  
  25.     if($n != $this->_current && isset($result[$n])){  
  26.         $this->_current = $n;  
  27.     }  
  28.  
  29.     return $result[$this->_current];  
  30. }  
  31.  
  32. //繼續(xù)跟進resultArray方法 ###這個方法是重點###  
  33. public function resultArray(){  
  34.     if(count($this->resultArray) > 0){  
  35.         return $this->resultArray;  
  36.     }  
  37.  
  38.     if(false === $this->resulter || 0 == $this->recordCount()){  
  39.         return array();  
  40.     }  
  41.  
  42.     $this->_dataSeek(0);  
  43.     while($row = $this->_fetchAssoc()){  
  44.         $this->resultArray[] = $row;    //###########這個數(shù)組每次都增加_fetchAssoc()結果的內存大小數(shù)量#########################  
  45.     }  
  46.     return $this->resultArray;  
  47. }  
  48.  
  49. //繼續(xù)跟進_fetchAssoc方法  
  50. /*  
  51. ** 對應driver的_fetchAssoc方法的代碼  
  52. */ 
  53. protected function _fetchAssoc(){  
  54.     return mysql_fetch_assoc($this->resulter);  
  55. }  

我們可以看到CodeIgniter框架的resultArray方法使用mysql(我們的php調用mysql的api用的是mysql函數(shù),有點繞,后面解釋)的mysql_fetch_assoc函數(shù)對緩沖區(qū)的數(shù)據進行遍歷轉換。將所有緩沖區(qū)的數(shù)據全部復制給$this->resultArray屬性,再判斷row方法中所需要的key的結果是否存在,再與返回的。

也就是說,框架層并沒有只從mysql server(潛意識上的mysql server)那邊取一條給我們調用者,而是取了所有結果,再返回一條。(先別噴,后面解釋) 當然,CI這種做法,也不是錯。但我覺得有更好的改進方法。

這個問題,我們組的dietoad (征婚) 發(fā)現(xiàn)了這個問題,并給了修復方案。有些同學認為,這是程序員的錯,程序員的SELECT語句沒有加limit來限制條數(shù)。這我絕對贊同,而且,覺得寫出這種代碼的人都得死。

  1. 業(yè)務層:為這種業(yè)務需求的SQL語句加上limit限制
  2. 框架層:框架對于這種需求,自動控制,發(fā)現(xiàn)這種情況,直接返回1條

對于解決方案1,我寫了一個正則,匹配select()方法被調用之后,row()方法被調用之前,中間沒有使用limit()方法的所有代碼,結果,發(fā)現(xiàn)量并不小。后來,我們決定兩種方案同時實施,防止第二種出現(xiàn)漏掉的情況。

#p#

dietoad給出如下改進:

  1. /*  
  2. **  //改進為當_rowData不存在時,從_rowData的數(shù)量開始取,取小于$n條記錄,避免 上面 resultArray方法中從緩沖區(qū)取所有數(shù)據,復制雙倍數(shù)據,占用內存的情況  
  3. */ 
  4. public function row ($n = 0, $type = 'array')  
  5. {  
  6.     if(isset($this->_rowData[$n]))  
  7.     {  
  8.         return $this->_rowData[$n];  
  9.     }  
  10.     if (! is_numeric($n))  
  11.     {  
  12.         return $this->rowObject($n);  
  13.     }  
  14.  
  15.     $ln=count($this->_rowData);  
  16.     //繼續(xù)上次位置  
  17.     while($ln++<=$n&&$r=$this->_fetchAssoc())  
  18.     {  
  19.        $this->_rowData[]=$r;  
  20.     }  
  21.     //需要幾條就讀幾條  
  22.     //防止記錄集為空報warning  
  23.     return isset($this->_rowData[$n])?$this->_rowData[$n]:array();  
  24. }  

在今年的4月末,鄙人寫過另一篇關于CodeIgniter框架的設計缺陷問題,給我們游戲項目帶來較大的影響,后來提交到github issues,并沒得到回復,想了想,雖然官方的2.1.3版本中,也存在這個小問題。不過我覺得,這就不提交了,或許,我們的做法也符合他們的設計初衷。不過,我們還是在我們的項目中改進了。

如此改進之后,我們使用php的memory_get_usage()函數(shù)觀察前后兩個row()方法的結果時,果然發(fā)現(xiàn)內存使用情況有較大改善(改善幅度取決于SELECT的返回數(shù)據量)。

似乎,到這里就應該結束了,問題就這么被發(fā)現(xiàn),被解決了。

但,我總覺得少了些什么呢?當我再次strace抓包時,發(fā)現(xiàn)仍然存在大量的數(shù)據通訊,就像文章開頭的那副截圖一模一樣。然而,這又是什么原因呢?

我順手寫了個內存占用的測試代碼如下:

  1. $db = mysql_connect('192.168.xx.xx','xxxx','xxxx');  
  2. $sql = 'SELECT * from items';  
  3. mysql_select_db('jv01',$db);  
  4. echo 'SELECT_DB: ',convert(memory_get_usage()),"\n";     //619.26 kb  
  5.  
  6. $r = mysql_query($sql,$db);  
  7. echo 'QUERY_SQL: ',convert(memory_get_usage()),"\n";    //619.98 kb  ###什么?查詢完之后,內存大小居然只增加了不到1k?我那個表可是幾十M的數(shù)據啊  
  8.  
  9. //sleep(50);  // hold住進程,別銷毀,留著看當前進程的內存分配1  
  10. $arr = array();  
  11. while ($rs = mysql_fetch_assoc($r))  
  12. {  
  13.     $arr[]=$rs;  
  14. }  
  15. echo 'FETCH_RS: ',convert(memory_get_usage()),"\n";    //27.11 mb  ###什么?剛剛不是只增加了1k嗎?這里的遍歷的結果集怎么突增幾十M啊?尼瑪這到底是什么情況?  
  16.  
  17. unset($arr);  
  18. echo 'UNSET: ',convert(memory_get_usage()),"\n";    //620.12 kb  #### $arr z占了 幾十M  
  19.  
  20. mysql_free_result($r);  
  21. echo 'FREE_R: ',convert(memory_get_usage()),"\n";    //620 kb    ### 結果集居然只有0.12 k?這不扯淡么? 莫非。。。莫非緩沖區(qū)的數(shù)據php統(tǒng)計不到?莫非不是調用zend 內存申請函數(shù)來申請內存的?  
  22.  
  23.  
  24. //sleep(50);  // hold住進程,別銷毀,留著看當前進程的內存分配2  
  25. function convert($size)  
  26. {  
  27.  $unit=array('b','kb','mb','gb','tb','pb');  
  28.  return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];  
  29. }  
  30. /*  
  31. //返回結果如下:  
  32. SELECT_DB: 619.26 kb  
  33. QUERY_SQL: 619.98 kb  
  34. FETCH_RS: 27.11 mb  
  35. UNSET: 620.12 kb  
  36. FREE_R: 620 kb  
  37. */ 

看到結果時,我不禁XX一緊,什么?這你媽什么情況?查詢完之后,內存大小居然只增加了不到1k?我那個表可是幾十M的數(shù)據啊?遍歷結果集之后,怎么突增幾十M啊?尼瑪這到底是什么情況?strace返回的大量數(shù)據到底存在哪的?算不算php進程申請的?

后來,我再次執(zhí)行如上程序,再定時用free、/proc/PID/maps 之類系統(tǒng)工具,查看系統(tǒng)的內存使用情況,確認了當前進程的內存占用確實存在。那么可能的情況就是memory_get_usage()函數(shù)并沒有獲取到 mysql_query之后的內存占用情況。由于比較懷疑,末學跟進了memory_get_usage()函數(shù)的源碼,該函數(shù)直接交給 zend_memory_usage函數(shù)處理。

  1. //這個是php的memory_get_usage()函數(shù)的 相關代碼,見Zend_alloc.c  line:2640  
  2. ZEND_API size_t zend_memory_usage(int real_usage TSRMLS_DC)  
  3. {  
  4.     if (real_usage) {  
  5.         return AG(mm_heap)->real_size;  
  6.     } else {  
  7.         size_t usage = AG(mm_heap)->size;  
  8. #if ZEND_MM_CACHE  
  9.         usage -= AG(mm_heap)->cached;  
  10. #endif 
  11.         return usage;  
  12.     }  
  13. }  
  14.  
  15.  
  16.  
  17.  
  18. //這個是Zend內存分配函數(shù)的代碼  
  19. //Zend_alloc.c  line:2418  
  20. ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)  
  21. {  
  22.     TSRMLS_FETCH();  
  23.  
  24.     if (UNEXPECTED(!AG(mm_heap)->use_zend_alloc)) {  
  25.         return AG(mm_heap)->_malloc(size);  
  26.     }  
  27.     return _zend_mm_alloc_int(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);  
  28. }  

php的內存管理 (中文地址:php-zend的內存管理中文版)這塊,對于末學來說,太復雜了,只是稍微看懂直接 返回了mm_heap結構體的real_size/size的值。(兩篇都是鳥哥寫的,中文的地址也就是鳥哥博客最近一直打不開,抽風得厲害)

那mysql_query的結果集,存在哪的呢?如何申請內存的,莫非不是調用zend的_emalloc內存分配函數(shù)的?這得先明確mysql客戶端類庫問題,也就是我們使用哪個類庫?libmysql還是mysqlnd,通過查看編譯參數(shù),發(fā)現(xiàn)(我的虛擬機)是libmysql,編譯參數(shù)是這樣的

  1. ./configure'  '--prefix=/services/php_5.3.19' '--with-config-file-path=/services/php_5.3.19/etc' '--with-pdo-mysql=/usr/bin/mysql_config' '--with-mysql=/usr/bin/mysql_config' '--with-mysqli=/usr/bin/mysql_config' '--enable-bcmath' '--enable-fpm  
  2.  
  3. //生產服務器如下:  
  4. ./configure'  '--prefix=/services/php' '--with-config-file-path=/services/php/etc' '--with-pdo-mysql=mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--enable-bcmath' '--enable-fpm 

有點亂:

mysql、mysqli、pdo-mysql、libmysql、mysqlnd 好多名詞,有點亂,沒關系,一張圖讓你清晰起來:

 

mysql、mysqli、pdo-mysql、libmysql、mysqlnd之間關系

mysqlnd跟libmysql一樣,都是直接與mysql server通訊的驅動類庫。 而php程序員使用的mysql、mysqli、pdo-mysql是面向程序員調用的API接口。。

#p#

 

繼續(xù):

libmysql類庫是MYSQL官方提供的類庫,每次PHP編譯都是指定參數(shù)來確定mysql\mysqli\pdo-mysql所使用的連接驅動是哪個。并且,前提你的得先裝好mysql的客戶端(libmysql類庫),以確保有l(wèi)ibmysqlclient.so ,

末學抱著試試看的心態(tài),心情沉重的打開了libmysql的源碼,終于在Safemalloc.c的line:120附近找到類似libmysqlclient申請內存的代碼

  1. //libmysql客戶端庫Safemalloc.c  line:120  
  2. /* Allocate some memory. */ 
  3.  
  4. void *_mymalloc(size_t size, const char *filename, uint lineno, myf MyFlags)  
  5. {  
  6.   ...    
  7.   /*  
  8.     Test for memory limit overrun.  
  9.     If compiled with DBUG, test for error injection. Described in my_sys.h.  
  10.   */ 
  11.   if ((size + sf_malloc_cur_memory > sf_malloc_mem_limit)  
  12.       IF_DBUG(|| my_malloc_error_inject))  
  13.   {  
  14.     IF_DBUG(if (my_malloc_error_inject)  
  15.               errno= ENOMEM;  
  16.             my_malloc_error_inject= 0);  
  17.     irem= 0;  
  18.   }  
  19.   else 
  20.   {  
  21.     /* Allocate the physical memory */ 
  22.     irem= (struct st_irem *) malloc (ALIGN_SIZE(sizeof(struct st_irem)) +  
  23.                      sf_malloc_prehunc +  
  24.                      size + /* size requested */ 
  25.                      4 +    /* overrun mark */ 
  26.                      sf_malloc_endhunc);    //系統(tǒng)的內存分配函數(shù) malloc  
  27.   }  
  28.   ...  
  29.   }  
  30.  
  31.  
  32.  
  33. //下面是mysqlnd驅動的代碼,為了省的再弄一個代碼高亮的區(qū)塊,特意放一起了.  
  34. // Mysqlnd客戶端庫Mysqlnd_alloc.c line:77  
  35. /* {{{ _mysqlnd_emalloc */ 
  36. void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D)  
  37. {  
  38. ...  
  39.         ret = _emalloc(REAL_SIZE(size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_ORIG_RELAY_CC);    //調用zend的內存分配函數(shù) _emalloc  
  40. ...  
  41.     if (ret && collect_memory_statistics) {  
  42.         *(size_t *) ret = size;  
  43.         MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EMALLOC_COUNT, 1, STAT_MEM_EMALLOC_AMOUNT, size);  
  44.     }  
  45.     TRACE_ALLOC_RETURN(FAKE_PTR(ret));  
  46. }  
  47. /* }}} */ 

也就是說,libmysql沒有調用zend的內分分配函數(shù)_emalloc,就沒法將內存的使用情況記錄到mm_heap結構體中,也就是PHP的memory_get_usage()函數(shù)統(tǒng)計不到的原因。好了,雖然末學不是很能讀懂源碼,但似乎符合問題發(fā)生的現(xiàn)象了。

好像,末學又想到一個問題,如果libmysql保存的結果集所占用的內存的話,那么php的配置文件中的memory_limit也就無法限制他的內存使用情況了?也就是說,如果我們很理想的根據系統(tǒng)剩余內存分配了若干個php-fpm進程來啟動運行的話,如果發(fā)生這情況,將會出現(xiàn)內存不夠用的情況,libmysql占用的內存沒有被統(tǒng)計到。。。結果是顯然的,果然限制不了它。

 
libmysql與mysqlnd跟memory_limit之間的關系

那mysqlnd可以嗎?mysqlnd的內存分配是使用zend的_emalloc函數(shù)嗎?是的,沒錯mysqlnd 是我們的大救星。Mysqlnd_alloc.c line:77里代碼中,明確看到了。各位SA在編譯php時,一定要使用mysqlnd作為php連接mysql server的類庫驅動哦。

Mysqlnd的好處可不止這么一點點啊。

內存還是內存:

末學苦于薄弱的英語,冒死翻過GFW,終于在“萬惡的資本主義”國家的網站上找到了這些資料,mysqlnd將比libmysql節(jié)省將近40%的內存占用哦。如圖:

 

mysqlnd比libmysql節(jié)省40%的內存占用

,而且,memory_limit參數(shù)可以管的了它哦…

#p#

 

速度,速度:

國外友人給了一份測試結果,比較的API是mysql\mysqli,比較的驅動是libmysql\mysqlnd

  1. 使用mysqlnd驅動的ext\mysqli接口速度最快
  2. 使用libmysql驅動的ext\mysqli接口慢了6%
  3. 使用libmysql驅動的ext\mysql接口慢了3%

并且給出了mysqli在兩個驅動下的執(zhí)行時間:

 

mysqli_select_varchar_buffered

還有,還有哦…mysqlnd還支持各種debug調試哦,各種strace跟蹤哦…還支持….算了,你自己下載mysqlnd相比libmysql的優(yōu)點看吧。末學可是搜了很久才搜到這個ppt。

推薦:

1,再推薦一片關于mysqlnd持久鏈接的文章:PHP 5.3: Persistent Connections with ext/mysqli

2,你的應用的cache的存儲是程序員自己根據DB數(shù)據結果,查詢條件,hash取值,存到memcache中的嗎?想不想嘗試下自動實現(xiàn)的?mysqlnd的插件可以嘗試下:PHP: Client side caching for all MySQL extensions ,支持memcached,apc,sqlit哦。

回到開始:

有人說,當php調用mysql_query時,mysql server會返回本次查詢的結果到php所在服務器的緩沖區(qū)中。當程序調用mysql_fetch_assoc/mysql_fetch_row /mysql_fetch_array/mysql_fetch_object之類函數(shù)時,都是調用php_mysql_fetch_hash函數(shù)去緩沖區(qū)讀取數(shù)據的。我要是用mysql_unbuffered_query()函數(shù)呢?讓結果集不直接在查詢之后返回,當調用mysql_fetch_x函數(shù)時,再拉回來呢? 這…你讓mysql server的緩沖區(qū)來存儲這些數(shù)據么?你以為客戶端就你自己么?其他的客戶端也要連的啊,尤其是php,如果用 mysql_unbuffered_query()函數(shù),他們都會將結果集放到mysql server的緩沖區(qū)的,mysql server的內存占用豈不是成本增長…你想讓DBA砍死你?
手冊上也說了,mysql_unbuffered_query返回的結果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。我?guī)缀鯖]用過這個函數(shù),這算非主流的函數(shù)么?

有人說我們方案1節(jié)省了從結果集取出,遍歷賦值給新數(shù)組的內存占用,并沒有減少網絡數(shù)據的傳輸。沒錯,你說的對,一點都沒錯。也就是說,我們的解決方案2只能稍微緩解這種問題的負面效果,徹底解決的話,還得程序層上去正確的調用,取回該要的數(shù)據。(其實,如果使用mysqlnd驅動的話,我們的改動基本沒有優(yōu)勢,節(jié)省不了內存。mysqlnd時,結果集的讀取只是引用緩沖區(qū)的數(shù)據。libmysql的話,有明顯效果。)我更加鑒定的贊同的那句話“寫出這種代碼的人都得死”。不使用mysqlnd作為php連接驅動的SA都是耍流氓

結論:

api推薦mysqli,驅動推薦mysqlnd.

溫故而知新?

在回家之后,末學刷了幾局《保衛(wèi)蘿卜》,除了幾個需要養(yǎng)成才解鎖的關卡之外,均可恥的”全清”+”金蘿卜”,玩著玩著,突然想起一件事情,就是末學在去年寫過一篇博客php5.3.8中編譯pdo_mysql的艱難歷程中, 之前運維的編譯參數(shù)中,mysqli使用的是mysqlnd,而mysql使用的是libmysql,后來再裝的pdo-mysql也使用了 libmysql了….3個api,指定兩個連接驅動,莫非上次的錯誤是因為這個?而末學的編譯參數(shù)雖然巧合的解決了問題,當初并沒有理解真正的原因?下周驗證一下… [2012/12/15 23:31更新]

知恥而后勇?

今天剛寫完這篇學習筆記后,回家玩游戲時,想起鳥哥曾提到過mysqlnd,再次回去看看,看鳥哥如何講解mysqlnd的,我理解的是否有誤,才發(fā)現(xiàn)鳥哥這里已經有了個Ulf Wendel博客的鏈接,末學卻在網絡搜索N久才找到那篇文章,同時,發(fā)現(xiàn)其blog上有大量mysqlnd的文章,還暗自偷笑,以為自己發(fā)現(xiàn)了大金礦,現(xiàn)在才發(fā)現(xiàn)….哎,慚愧慚愧…[2012/12/15 23:58更新]

末學對于本次學習經歷中遇到的知識點,有大量的盲區(qū),將會在以后的時間里,慢慢摸索熟悉,也歡迎各位前輩的點撥。

好像…好像…末學的問題太多了…

原文鏈接:http://www.cnxct.com/libmysql-mysqlnd-which-is-best-and-what-about-mysqli-pdomysql-mysql/

責任編輯:林師授 來源: 莿鳥棲草堂
相關推薦

2018-04-02 15:10:17

ToastSnackbarAndroid

2018-03-15 15:12:00

潤乾報表集成

2011-04-14 14:23:06

軟件測試測試

2012-02-22 09:32:58

云計算微軟Azure

2011-05-25 19:37:47

2021-07-30 07:28:15

Kafka消息引擎

2009-07-03 14:16:30

JSP Servlet

2010-08-10 15:08:17

UPS電源評測

2013-10-12 13:26:08

設計加載

2015-09-01 15:12:45

JavaHashMap那點事

2023-12-21 20:53:15

2012-06-11 15:02:53

ASP.NET

2011-08-31 10:15:48

桌面管理軟件

2019-07-01 14:55:44

應用安全web安全滲透測試

2010-06-07 14:07:18

IPv4與IPv6

2011-08-30 14:59:34

Qt數(shù)據庫

2015-05-29 09:37:04

2013-04-09 10:03:29

iOS6.0旋轉兼容

2013-11-01 14:33:32

王軍Testin手游KPI

2019-10-30 09:56:56

內存屏障變量
點贊
收藏

51CTO技術棧公眾號

91精品国产乱码在线观看| 曰韩不卡视频| 日韩欧美国产另类| 欧美高清在线| 欧美mv日韩mv亚洲| 国模无码视频一区二区三区| 国产高清免费av在线| 蜜桃久久精品一区二区| 久久久久一本一区二区青青蜜月 | 国产精品一区二区三区网站| 国产综合在线看| 一级片黄色录像| 99re8这里有精品热视频免费| 色欧美片视频在线观看| 日韩中文字幕亚洲精品欧美| 欧美成人免费| 成人午夜网址| 蜜臀a∨国产成人精品| 精品国内产的精品视频在线观看| 污污免费在线观看| 欧美性生活一级| 一本一道久久a久久精品| 老司机午夜免费福利视频| 国内精品在线视频| av福利精品导航| 亚洲自拍偷拍网址| 最新中文字幕免费| 裸体素人女欧美日韩| 高清欧美一区二区三区| 中文字幕另类日韩欧美亚洲嫩草| 经典一区二区| 日韩电影中文字幕| 插我舔内射18免费视频| 亚洲图色一区二区三区| 9191久久久久久久久久久| 欧美综合在线观看视频| 九色porny丨国产首页在线| 亚洲男同1069视频| 中文字幕制服丝袜在线| √天堂资源地址在线官网| 久久精品在线观看| 久久久久久a亚洲欧洲aⅴ| 亚洲国产精品久久人人爱潘金莲| 国内成人免费视频| 国产欧美日韩精品丝袜高跟鞋| 欧美超碰在线观看| 久久电影一区| 国产成人精品视| 不卡av电影在线| 久久国产99| 人人爽久久涩噜噜噜网站| 亚洲伊人成人网| 99热这里只有成人精品国产| 久久久久久久国产精品| 久久中文字幕无码| 国一区二区在线观看| 欧美激情视频在线观看| 特级片在线观看| 亚洲天堂男人| 97超碰色婷婷| 免费的毛片视频| 日韩精品1区2区3区| 国产精品久久久久久久久久小说| 奴色虐av一区二区三区| 麻豆精品在线播放| 91中文字幕一区| 亚洲免费成人网| 91免费看片在线观看| 手机看片福利永久国产日韩| 性开放的欧美大片| 亚洲欧美日韩国产一区二区三区| 高清无码一区二区在线观看吞精| 久久青青色综合| 狠狠色噜噜狠狠狠狠97| 亚洲一区二区蜜桃| 激情视频亚洲| 日韩大陆欧美高清视频区| 中文字幕在线观看免费高清| 99热在线成人| 午夜精品一区二区三区在线播放 | 国产一区久久精品| 亚洲一区免费观看| 日韩在线第三页| 91嫩草国产线观看亚洲一区二区| 欧美成人精品3d动漫h| 国产艳俗歌舞表演hd| 成人羞羞在线观看网站| 欧美韩日一区二区| 免费视频网站在线观看入口| 韩国一区二区三区| 久久久久一区二区| 波多野结衣精品久久| 亚洲一级视频在线观看| 国产精品99久久久久久久女警| 韩国成人一区| 日本黄色片在线观看| 亚洲成年人影院| 精品日韩久久久| 成人偷拍自拍| 精品国产一区二区三区久久久狼| 四虎永久在线精品| 久久精品国产免费看久久精品| 国产精品久久久久久久小唯西川| 成人在线高清视频| 亚洲一区二区在线观看视频| 爆乳熟妇一区二区三区霸乳| 大桥未久女教师av一区二区| 综合136福利视频在线| 免费一级特黄特色大片| 美国一区二区三区在线播放 | 国产精品久久久久一区二区国产| 亚洲女人小视频在线观看| 日韩视频在线免费看| 亚洲一区二区三区在线免费| 中文在线不卡视频| 天天操天天爽天天干| 国产一区二区网址| 日本精品国语自产拍在线观看| h片在线观看视频免费免费| 欧美日韩成人综合天天影院 | 欧美一区二区视频97| 国产三级精品在线观看| 欧美激情一区二区在线| 国产免费毛卡片| 国产一区二区三区亚洲| 久久在线观看视频| 一级爱爱免费视频| 欧美精彩视频一区二区三区| 黄色片网址在线观看| 午夜电影一区| 操人视频在线观看欧美| 91tv国产成人福利| 国产精品久久午夜| 黄色永久免费网站| 成人国产精品一级毛片视频| 欧美一二三视频| 色偷偷在线观看| 一区二区三区四区蜜桃| а 天堂 在线| 91精品高清| 92国产精品视频| 黄网站免费在线播放| 欧美精品久久一区二区三区| 亚洲熟女毛茸茸| 久久99精品国产.久久久久| 亚洲va久久久噜噜噜久久狠狠| 你懂得影院夜精品a| 亚洲偷熟乱区亚洲香蕉av| 国产性生活视频| 国产丝袜美腿一区二区三区| 99草草国产熟女视频在线| 亚洲色图丝袜| 国产精品大陆在线观看| 黄色片在线免费看| 欧美欧美欧美欧美| www欧美com| 国产成人精品影视| 日韩国产一级片| 在线日韩一区| 国产伦精品一区二区三区精品视频| yjizz视频网站在线播放| 欧美三级蜜桃2在线观看| 国精品人伦一区二区三区蜜桃| 国产真实乱子伦精品视频| 国产成人一区二区三区别| 国产欧美一区二区三区米奇| 欧美一级免费视频| av在线免费观看网| 日韩一级欧美一级| 日本三级欧美三级| 久久精品人人做人人综合| 黄色三级视频片| 久久久久免费av| 99久久自偷自偷国产精品不卡| 国产区美女在线| 亚洲欧美精品suv| 国产永久免费视频| 亚洲成人资源网| 怡红院一区二区三区| 韩国三级中文字幕hd久久精品| 无码 制服 丝袜 国产 另类| 夜夜春成人影院| 成人中文字幕在线观看 | 国产精品美女在线| av在线下载| 亚洲激情在线观看| 在线观看毛片视频| 精品久久久久久久久久久久久| 免费看91的网站| 国产福利一区在线| 日本va中文字幕| 国产一区视频在线观看免费| 日本亚洲自拍| caoporn成人| 国产精品狠色婷| www欧美xxxx| 最近2019中文字幕第三页视频| 亚洲毛片欧洲毛片国产一品色| 欧美调教femdomvk| 日韩欧美亚洲视频| 亚洲欧美视频一区| 欧美老女人性生活视频| 成人精品小蝌蚪| 午夜免费一级片| 日韩成人一区二区三区在线观看| 欧美狂野激情性xxxx在线观| 日韩免费看片| 免费成人深夜夜行视频| 亚洲欧美日本国产| 成人免费看片视频| 日韩中文视频| 91av免费观看91av精品在线| av大片在线| 中文字幕日本精品| 国产区在线视频| 亚洲精品av在线| 欧美一级做性受免费大片免费| 91精品国产乱| 91好色先生tv| 欧美在线影院一区二区| 亚洲另类在线观看| 亚洲1区2区3区视频| 欧美日韩三级在线观看| 国产精品久久久久久久裸模| 人妻大战黑人白浆狂泄| 不卡一区二区中文字幕| 无码国产精品久久一区免费| 精品一区二区三区久久| www.com操| 免费人成精品欧美精品| 无码人妻精品一区二区三区66| 国产亚洲精品自拍| 国产综合中文字幕| 亚洲精品美女| 日韩av综合在线观看| 亚洲毛片播放| 免费观看国产精品视频| 亚洲二区免费| 好吊妞无缓冲视频观看| 亚洲日韩成人| 欧美精品99久久| 亚洲影院免费| av免费在线播放网站| 日韩精品福利网| 中文字幕av不卡在线| 麻豆精品在线播放| 精品人妻一区二区三| 国产电影一区二区三区| 91精品国产高清91久久久久久| 国产不卡视频一区二区三区| 99riav国产精品视频| 成人a免费在线看| 蜜臀av一区二区三区有限公司| 91免费精品国自产拍在线不卡| 黄色在线观看av| 久久精品欧美日韩精品| 久久婷婷五月综合| 国产精品久久二区二区| 亚洲色图综合区| 亚洲一区二区三区国产| 天天操中文字幕| 欧美中文字幕一区二区三区亚洲| 国产精品高潮呻吟AV无码| 日韩午夜精品电影| 亚洲aaa在线观看| 尤物精品国产第一福利三区| 黄色在线观看网站| 97av在线视频| 欧美综合影院| 国产精品一 二 三| 欧美色图激情小说| 路边理发店露脸熟妇泻火| 亚洲激情社区| 91看片在线免费观看| 国产aⅴ精品一区二区三区色成熟| 国产精品福利导航| 欧美国产视频在线| 久久久久久久黄色| 91黄色免费观看| 国内精品偷拍视频| 亚洲欧美激情另类校园| 成年人网站在线| 91av视频导航| 国产亚洲字幕| 免费电影一区| 欧美日韩p片| av网址在线观看免费| 国产在线麻豆精品观看| 成人免费av片| 一区二区三区四区不卡视频| 激情视频网站在线观看| 欧美一区二区在线视频| 久蕉在线视频| 欧美黄网免费在线观看| a成人v在线| 国产一区二区三区四区五区在线| 日韩欧美精品| 丰满人妻中伦妇伦精品app| 国产一区二区三区av电影| 魔女鞋交玉足榨精调教| 一区二区成人在线| 在线观看视频中文字幕| 亚洲精品福利资源站| а√中文在线8| 国产精品免费视频久久久| 国产福利一区二区精品秒拍| 中文字幕制服丝袜在线| 青青草国产精品97视觉盛宴| 香港三日本8a三级少妇三级99| 亚洲欧美日韩电影| 一级黄色大片免费观看| 亚洲美女免费精品视频在线观看| 久久青青色综合| 亚洲一区二区中文字幕| 成人在线免费观看91| 情侣黄网站免费看| 99在线视频精品| 激情四射综合网| 69p69国产精品| av在线天堂播放| 国产成人精品久久久| 日韩欧美影院| 人妻av中文系列| 成人在线视频一区二区| avtt天堂在线| 欧美一区二区三区播放老司机| av电影在线观看一区二区三区| 日本精品中文字幕| 日本亚洲不卡| 18禁免费无码无遮挡不卡网站| av不卡一区二区三区| 久久av高潮av无码av喷吹| 3atv一区二区三区| 国产秀色在线www免费观看| 成人久久久久久| 亚洲成人免费| 亚洲高清av一区二区三区| 亚洲免费在线播放| 国产三级第一页| 欧美高清视频在线观看| 99这里只有精品视频| 成人免费观看在线| 99久久综合狠狠综合久久| www.av麻豆| 亚洲日韩欧美视频| 欧洲成人一区| 杨幂一区欧美专区| 国内精品写真在线观看| 欧美毛片在线观看| 亚洲丁香婷深爱综合| 在线毛片观看| 天堂社区 天堂综合网 天堂资源最新版 | 亚洲一级片在线看| 精品成人av| 中文字幕在线亚洲三区| 国产一区二区三区四区在线观看| 永久免费看黄网站| 亚洲国产精彩中文乱码av在线播放 | 免费a级片在线观看| 97在线免费观看视频| 免费精品国产的网站免费观看| 污污视频网站免费观看| 国产精品国产三级国产普通话三级| 国产精品探花视频| 久久久久久久电影一区| 啪啪亚洲精品| 中文字幕 欧美日韩| 亚洲国产日韩a在线播放性色| 色播色播色播色播色播在线| 国产精品永久免费在线| 欧美精品不卡| 中文字幕国产综合| 3d成人动漫网站| 国产直播在线| 亚洲欧洲另类精品久久综合| 国产精品2024| 日韩人妻精品中文字幕| www日韩中文字幕在线看| 动漫3d精品一区二区三区乱码| 欧美日韩在线视频一区二区三区| 国产精品久久久久久久裸模| 人妻无码一区二区三区久久99| 国产精品91久久久久久| 欧美日韩国产成人精品| 亚洲 欧美 日韩在线| 欧美日韩激情在线| 超碰91在线观看| 中文字幕久久一区| 91麻豆蜜桃一区二区三区| 97精品人妻一区二区三区在线| 91精品国产高清自在线看超| 91亚洲国产| 国产特黄级aaaaa片免| 日韩亚洲欧美成人一区| 日本成人伦理电影| 国产成人艳妇aa视频在线| 国产亚洲美州欧州综合国| 丰满人妻一区二区三区无码av| 国产精品久久久久久久久久| 日韩天天综合|