• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于正則表達(dá)式的高性能PHP路由

    2023-02-17 02:00:40張文豪陳平華
    計算機(jī)應(yīng)用與軟件 2023年1期
    關(guān)鍵詞:字符串分塊正則

    張文豪 陳平華

    (廣東工業(yè)大學(xué)計算機(jī)學(xué)院 廣東 廣州 510006)

    0 引 言

    PHP路由就是網(wǎng)頁請求地址與PHP應(yīng)用系統(tǒng)中的處理程序的映射關(guān)系,其最大的作用就是將一個網(wǎng)頁請求地址解析為調(diào)用的程序地址。正則表達(dá)式一般可應(yīng)用于字符串的檢索功能,市場主流的PHP路由就是利用正則表達(dá)式檢索網(wǎng)頁請求地址從而確定調(diào)用的程序地址。正則表達(dá)式路由分為獨(dú)立的正則表達(dá)式和組合的正則表達(dá)式。獨(dú)立的正則表達(dá)式路由由于正則表達(dá)式數(shù)量與路由數(shù)量相同,路由檢索時,正則匹配次數(shù)較多,性能低下。Nikita[1]提出了組合的正則表達(dá)式路由,減少了正則表達(dá)式的數(shù)量和匹配次數(shù)從而提升了正則表達(dá)式路由的性能。但是隨著路由數(shù)量的增加,組合的正則表達(dá)式的數(shù)量也隨著增加,路由匹配性能下降太快,并且對于組合的正則表達(dá)路由的分塊大小只給出簡單的判斷,沒有進(jìn)行詳細(xì)的測試分析。

    正則表達(dá)式編譯后得到的字符串是有長度限制的[2],超過最大的長度時,正則表達(dá)式就無法進(jìn)行匹配,必須對組合的正則表達(dá)式進(jìn)行分塊,確保不會超過正則表達(dá)式的長度限制。正則表達(dá)式的字符串越長編譯后得到的字符串也越長,進(jìn)行匹配時性能也會相應(yīng)下降,合理的分塊大小才能使性能達(dá)到最佳。組合的正則表達(dá)式為了能夠準(zhǔn)確找到命中的路由,不同的組合方式有不同的解決方案,但都需要增加輔助字符串,會減少可以進(jìn)行組合的路由數(shù)量,因此采用不同的組合方式也會直接影響到路由的性能。

    為了解決路由數(shù)量較多時,路由匹配給系統(tǒng)帶來的性能壓力,本文對組合的正則表達(dá)式路由的組合方式和分塊大小進(jìn)行測試對比,找出最優(yōu)的組合方式和分塊大小的規(guī)律,并對PHP內(nèi)核進(jìn)行深入研究,從PHP底層的機(jī)制對PHP路由的實(shí)現(xiàn)進(jìn)行深入的優(yōu)化。通過對組合的正則表達(dá)式路由的深入優(yōu)化,讓PHP路由的性能在極端情況下,也能保持性能的穩(wěn)定。

    1 相關(guān)工作

    隨著Ruby On Rails的火爆,PHP也隨著它的盛行進(jìn)入了框架開發(fā)的時代。為了解決使用開發(fā)框架后造成URL訪問地址冗長的問題,開發(fā)框架都提供了路由的功能來實(shí)現(xiàn)URL訪問地址的優(yōu)化,并且有利于搜索引擎的收錄,路由也成為開發(fā)框架的核心功能[3]。在開發(fā)框架強(qiáng)制開啟路由后,每個請求地址都要經(jīng)過路由匹配后才能確定要調(diào)用的程序文件,路由匹配是每個請求的必經(jīng)環(huán)節(jié),成為影響系統(tǒng)性能的關(guān)鍵因素。

    正則表達(dá)式從一開始就被應(yīng)用到開發(fā)框架的路由組件中,通常使用的是獨(dú)立的正則表達(dá)式方案,就是一條正則表達(dá)式表示一條路由信息,路由匹配時需要逐一匹配直到找到相應(yīng)的路由。由于獨(dú)立的正則表達(dá)式方案具有簡單、靈活的特點(diǎn),在各種程序語言的開發(fā)框架上得到廣泛應(yīng)用。但獨(dú)立的正則表達(dá)式方案在路由信息較多時,性能損耗比較嚴(yán)重,路由的性能直接影響到開發(fā)框架的性能,因此提升路由的性能就可以提升開發(fā)框架的性能。

    2014年1月我國臺灣省的林佑安發(fā)布了Pux 1.0,當(dāng)時的測試數(shù)據(jù),路由的性能比Symfony2的路由快了4倍,拉開了提升PHP開發(fā)框架路由性能的序幕。Pux取得的性能的提升引起了很多PHP開發(fā)人員的注意,其中也包括PHP核心組開發(fā)成員:Nikita Popov。Nikita Popov在研究了Pux的實(shí)現(xiàn)后,發(fā)現(xiàn)Pux只是簡單地把PHP路由使用C語言編寫為PHP擴(kuò)展,還是采用了獨(dú)立的正則表達(dá)式的方案,也就是性能的提升主要來自PHP擴(kuò)展是靜態(tài)的,減少了PHP程序需要一邊解釋一邊執(zhí)行的時間。2014年2月Nikita Popov提出了基于組合的正則表達(dá)式的路由方案,詳細(xì)描述了兩種組合的方式:GCB和GPB,并通過綜合的測試,證明即使使用PHP程序進(jìn)行實(shí)現(xiàn),其綜合性能還是明顯優(yōu)于Pux,并在2014年4月發(fā)布了基于組合的正則表達(dá)式的PHP路由庫:FastRoute。在FastRoute發(fā)布后,全球最流行的PHP開發(fā)框架laravel的精簡版本Lumen的路由就采用了FastRoute的實(shí)現(xiàn)。2018年2月Symfony發(fā)布4.1版本時,路由組件增加了組合的正則表達(dá)式的實(shí)現(xiàn)方案,并且組合的正則表達(dá)式方案使用方法和獨(dú)立的正則表達(dá)式方案保持一致,同時在400條靜態(tài)路由和400條動態(tài)路由的狀態(tài)下,測試發(fā)現(xiàn)組合的正則表達(dá)式路由方案的性能比獨(dú)立的正則表達(dá)式路由方案提升了5倍[4]。Symfony路由組件證明了組合的正則表達(dá)式路由方案可以在保持簡單、靈活的基礎(chǔ)上,有效地提升路由的綜合性能。從此,組合的正則表達(dá)式在PHP開發(fā)框架的路由組件中得到了廣泛的應(yīng)用,目前也是被廣泛認(rèn)可的提升路由性能的有效方案。

    2 定 義

    定義1路由是一個網(wǎng)絡(luò)工程的術(shù)語,是指分組從源到目的地時,決定端到端路徑的網(wǎng)絡(luò)范圍的進(jìn)程。Web開發(fā)中的路由是指如何定義應(yīng)用的端點(diǎn)(URIs)以及如何響應(yīng)客戶端的請求,是由一個URI、HTTP請求和調(diào)用程序組成[5]。

    定義2正則表達(dá)式,又稱規(guī)則表達(dá)式(Regular Expression,在代碼中常簡寫為regex、regexp),計算機(jī)科學(xué)的一個概念。正則表達(dá)式是對字符串進(jìn)行描述和通配操作的一種邏輯公式,通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本[6]。

    正則表達(dá)式是對字符串(包括普通字符(例如,a到z之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。正則表達(dá)式是一種文本模式,該模式描述在搜索文本時要匹配的一個或多個字符串。

    正則表達(dá)式使用小括號(……)構(gòu)建分組,可以將多個正則表達(dá)式通過分組的語法組合為一個大的正則表達(dá)式。正則表達(dá)式分組分為捕獲組和非捕獲組,捕獲組匹配時會從左到右自動生成組號,支持反向的引用,非捕獲組沒有生成組號,不支持反向引用[7-8]。

    定義3正則表達(dá)式路由就是使用正則表達(dá)式來表示路由規(guī)則,包括路由定義和路由匹配兩部分。路由定義就是使用正則表達(dá)式完成路由規(guī)則的定義。路由匹配即路由命中,就是根據(jù)路由定義時用的正則表達(dá)式與請求地址進(jìn)行正則匹配,正則表達(dá)式匹配就表示該路由命中,同時根據(jù)正則匹配的結(jié)果和路由定義的規(guī)則進(jìn)行處理,得到一個程序調(diào)用的目標(biāo)地址。

    根據(jù)正則表達(dá)式與路由的對應(yīng)關(guān)系,又分為獨(dú)立的正則表達(dá)式路由和組合的正則表達(dá)式路由。

    獨(dú)立的正則表達(dá)式路由就是一條正則表達(dá)對應(yīng)一條路由,路由搜索時,通過列表循環(huán)方式,依次檢測每條路由的正則表達(dá)式是否與請求地址正則匹配,如果匹配就代表該路由命中,終止循環(huán);循環(huán)結(jié)束還是沒有正則表達(dá)式匹配就代表沒有路由命中。

    組合的正則表達(dá)式路由就是一條正則表達(dá)式對應(yīng)多條路由,通常還得使用分塊限制正則表達(dá)式的長度,路由搜索時也是通過列表循環(huán)方式,依次檢測每條組合后的正則表達(dá)式是否匹配,如果組合后的正則表達(dá)式與請求地址匹配,還需要根據(jù)組合的方式計算出命中的路由;如果循環(huán)結(jié)束還是沒有正則表達(dá)式能匹配請求地址就代表沒有路由命中。正則表達(dá)式的組合有兩種格式,分別為(?:)和(?|)[7-8]。兩種組合的格式都可以使用“|”構(gòu)造多個分支。每個分組分支可以包含多個子組,代表一條路由信息。

    3 相關(guān)數(shù)據(jù)

    假設(shè)有一個資訊類網(wǎng)站,每個子站有5條路由信息,分別為主頁、欄目頁、列表頁、詳細(xì)頁、搜索頁,并且每個子站都指定了子域名(t1到tN),如表1所示。本文通過增加和減少子站數(shù)量來控制測試的路由數(shù)量。

    表1 子站t1的路由信息示例(域名為:t1.xqkeji.com)

    舉例說明:

    (1) 訪問http[s]://t1.xqkeji.com/后,主頁面的路由被選中,得到調(diào)用程序的地址為:info模塊里的default類的index方法,方法的參數(shù)為100。

    (2) 訪問http[s]://t1.xqkeji.com/category/1000后,欄目頁的路由被選中,得到調(diào)用程序的地址為:info模塊里的default類的category方法,方法的參數(shù)為路由正則匹配結(jié)果的第一個參數(shù)值(1 000)。

    (3) 訪問http[s]://t1.xqkeji.com/list/1001后,列表頁的路由被選中,得到調(diào)用程序的地址為:info模塊里的default類的list方法,方法的參數(shù)為路由正則匹配結(jié)果的第一個參數(shù)值(1 001)。

    (4) 訪問http[s]://t1.xqkeji.com/show/100001后,詳細(xì)頁的路由被選中,得到調(diào)用程序的地址為:info模塊里的default類的show方法,方法的參數(shù)為路由正則匹配結(jié)果的第一個參數(shù)值(100 001)。

    (5) 訪問http[s]://t1.xqkeji.com/search/后,搜索頁的路由被選中,得到調(diào)用程序的地址為:info模塊里的default類的search方法。

    4 算 法

    基于正則表達(dá)式的路由算法有兩種形式:獨(dú)立的正則表達(dá)式路由和組合的正則表達(dá)式路由。

    本文的路由的基本格式:([域名1|域名2|.*?])_([請求方法1|請求方法2|.*?])_路由規(guī)則。

    4.1 獨(dú)立的正則表達(dá)式路由

    獨(dú)立的正則表達(dá)式路由就是一條正則表達(dá)式表示一條路由信息,通常將所有的正則表達(dá)式路由信息存放到一個數(shù)組中,通過數(shù)組遍歷逐條進(jìn)行正則匹配,只要有一條正則表達(dá)式匹配成功,就退出數(shù)組遍歷,該匹配成功的路由信息為需要調(diào)用的程序地址,如果直到數(shù)組遍歷結(jié)束還沒有一條正則表達(dá)式匹配成功,就表示找不到路由,返回404錯誤。

    根據(jù)子站點(diǎn)t1的路由信息,給出相應(yīng)的獨(dú)立的正則表達(dá)式的路由信息。

    $regexes=[

    //主頁路由正則表達(dá)式

    ′#^(t1.xqkeji.com)_(get|post)_/$#′,

    //欄目頁路由正則表達(dá)式

    ′#^(t1.xqkeji.com)_(get|post)_/c ategory(/.*)*$#′,

    //列表頁路由正則表達(dá)式

    ′#^(t1.xqkeji.com)_(get|post)_/list(/.*)*$#′,

    //詳細(xì)頁路由正則表達(dá)式

    ′#^(t1.xqkeji.com)_(get|post)_/show(/.*)*$#′,

    //搜索頁路由正則表達(dá)式

    ′#^(t1.xqkeji.com)_(get|post)_/search/$#′,

    ];

    算法描述:

    //系統(tǒng)所有路由的正則表達(dá)式的數(shù)組

    regexes ← 路由正則數(shù)組

    //格式為:請求域名_請求方法_請求地址

    //例如:t1.xqkeji.com_get_/表示主頁的請求地址

    url ← 特定格式的URL信息字符串

    //是否路由匹配,初始0表示沒有路由匹配

    matched ← 0

    //路由數(shù)組的索引下標(biāo),確定匹配的路由

    route_index ← 0

    For regex From regexes

    //正則匹配就是測試url地址字符串是否符合正則表達(dá)式

    //regex的規(guī)則,返回true或false,同時將正則搜索的結(jié)果存儲

    //到matches數(shù)組中

    If 正則匹配(regex,url,matches) Then

    //已經(jīng)找到路由

    matched ← 1

    BREAK

    End If

    route_index ← route_index+1

    End For

    If matched Then

    //route_index為選中的路由

    Else

    //沒有找到路由,404錯誤

    End If

    4.2 組合的正則表達(dá)式路由

    組合的正則表達(dá)式路由就是將多條正則表達(dá)式路由信息通過正則表達(dá)式的分組語法規(guī)則組合成為一條大的正則表達(dá)式,也就是用一條大的正則表達(dá)式表示多條路由信息。PHP路由的組合方式主要有三種:基于分組位置(GPB)、基本分組計數(shù)(GCB)和基本分組標(biāo)記(GMB)。

    1) 基于分組位置(GPB)就是根據(jù)正則表達(dá)式的匹配結(jié)果的分組位置計算出正則表達(dá)式命中的分支,也就是命中的路由。GPB組合的特點(diǎn):以“(?:”開頭;每個分支的分組數(shù)量一致;所有分組位置從左到右遞增;分支匹配后,前面沒有匹配的分支的分組位置都會填充空白符,如圖1所示。

    圖1 GPB組合示例圖

    假設(shè)分支3的正則規(guī)則匹配,那么分支1和分支2的分組都會被填充空白符。正則匹配結(jié)果為:

    [

    0=>全匹配的結(jié)果,

    1=>”,//分支1的分組1填充空白符

    2=>”,//分支1的分組2填充空白符

    ……

    7=>分支3分組7的匹配結(jié)果數(shù)據(jù),

    8=>分支3分組8的匹配結(jié)果數(shù)據(jù),

    9=>分支3分組9的匹配結(jié)果數(shù)據(jù)

    ]

    根據(jù)匹配結(jié)果里有9個分組和每個分支有3個分組可以計算出“分支3”命中。

    GPB的組合的路由的正則表達(dá)式的格式:′#^(?:主頁路由正則表達(dá)式()()()()|欄目頁路由正則表達(dá)式()()()|列表頁路由正則表達(dá)式()()()|詳細(xì)頁路由正則表達(dá)式()()()|搜索頁正則表達(dá)式()()()())$#’,GPB必須保證所有正則分支的子組數(shù)都相同,也就是取所有分支中的最大分組數(shù),其他分支添加多余的空分組來確保所有分支的分組數(shù)相同,本例的最大分組數(shù)和相同的分組數(shù)為6。

    算法描述:

    regex ← 所有路由組合成的GPB正則表達(dá)式

    //格式為:請求域名_請求方法_請求地址

    //例如:t1.xqkeji.com_get_/表示主頁的請求地址

    url ← 特定格式的URL信息字符串

    //路由數(shù)組的索引下標(biāo),確定匹配的路由

    route_index ← 0

    //正則匹配就是測試url地址字符串是否符合正則表達(dá)式

    //regex的規(guī)則,返回true或false,同時將正則搜索的結(jié)果存儲

    //到matches數(shù)組中

    If 正則匹配(regex,url,matches) Then

    //正則表達(dá)式有匹配,說明已經(jīng)找到路由

    //6為所有分支最大和相同的分組數(shù)

    //計算出命中路由的索引

    route_index ← (統(tǒng)計數(shù)組元素數(shù)量(matches)-1)/6-1

    Else

    //沒有找到路由,404錯誤

    End If

    2) 基于分組計數(shù)(GCB)就是根據(jù)正則表達(dá)式的匹配結(jié)果中每個分支的分組數(shù)量是遞增計數(shù)的特點(diǎn)來計算出正則表達(dá)式命中的分支,也就是命中的路由。GCB組合的特點(diǎn):以“(?|”開頭;每個分支的分組數(shù)量不一樣并且是遞增的;所有分支的分組位置是獨(dú)立的;分支匹配后,前面沒有匹配的分支的分組位置不會填充空白符,如圖2所示。

    圖2 GCB組合示例圖

    假設(shè)分支3的正則規(guī)則匹配,那么正則匹配結(jié)果為:

    [

    0=>全匹配的結(jié)果,

    1=>分支3分組1的匹配結(jié)果數(shù)據(jù),

    2=>分支3分組2的匹配結(jié)果數(shù)據(jù),

    3=>分支3分組3的匹配結(jié)果數(shù)據(jù),

    4=>分支3分組4的匹配結(jié)果數(shù)據(jù),

    5=>分支3分組5的匹配結(jié)果數(shù)據(jù)

    ]

    根據(jù)匹配結(jié)果里有5個分組數(shù)和分支3的分組數(shù)一致可以計算出“分支3”命中。

    GCB的組合格式:′#^(?|主頁路由正則表達(dá)式()()()()|欄目頁路由正則表達(dá)式()()()()|列表頁路由正則表達(dá)式()()()()()|詳細(xì)頁路由正則表達(dá)式()()()()()()|搜索頁正則表達(dá)式()()()()()()()())$#’,GCB必須保證所有正則分支的分組數(shù)是遞增的并且有確定的最小分組數(shù),在這里最小的分組數(shù)是6,主頁的分組數(shù)為6、欄目頁的分組數(shù)為7、列表頁的分組數(shù)為8、詳細(xì)頁的分組數(shù)為9、搜索頁的分組數(shù)為10。

    算法描述:

    regex ← 所有路由組合成的GCB正則表達(dá)式

    //格式為:請求域名_請求方法_請求地址

    //例如:t1.xqkeji.com_get_/表示主頁的請求地址

    url ← 特定格式的URL信息字符串

    //路由數(shù)組的索引下標(biāo),確定匹配的路由

    route_index ← 0

    //正則匹配就是測試url地址字符串是否符合正則表達(dá)式

    //regex的規(guī)則,返回true或false,同時將正則搜索的結(jié)果存儲

    //到matches數(shù)組中

    If 正則匹配(regex,url,matches) Then

    //正則表達(dá)式有匹配,說明已經(jīng)找到路由

    //6為所有分支最大和相同的分組數(shù)

    //計算出命中路由的索引

    route_index ← 統(tǒng)計數(shù)組元素數(shù)量(matches)-7

    Else

    //沒有找到路由,404錯誤

    End If

    3) 基于分組標(biāo)記(GMB)就是根據(jù)正則表達(dá)式的匹配結(jié)果的分支標(biāo)記數(shù)據(jù)來確定命中的分支,也就是命中的路由。GMB組合的特點(diǎn):以“(?|”開頭;每個分支的分組數(shù)量沒有限制;每個分支需要設(shè)置唯一的標(biāo)記;分支匹配后,該分支的標(biāo)記會填充到匹配的結(jié)果中,通過分支標(biāo)記的數(shù)據(jù)能很容易確定命中的路由,如圖3所示。

    圖3 GMB組合示例圖

    假設(shè)分支3的正則規(guī)則匹配,那么正則匹配結(jié)果為:

    [

    0=>全匹配的結(jié)果,

    1=>分支3分組1的匹配結(jié)果數(shù)據(jù),

    MARK=>分支標(biāo)記3的數(shù)據(jù),

    ]

    根據(jù)匹配結(jié)果的MARK數(shù)據(jù)就能確定“分支3”命中。

    GMB的組合格式:′#^(?|主頁路由正則表達(dá)式(*MARK:0)|欄目頁路由正則表達(dá)式(*MARK:1)|列表頁路由正則表達(dá)式(*MARK:2)|詳細(xì)頁路由正則表達(dá)式(*MARK:3)|搜索頁正則表達(dá)式(*MARK:4))$#’,GMB通過為每一個組合的分支添加一個唯一的標(biāo)記,不需要添加多余的正則表達(dá)式的空分組()。

    算法描述:

    regex ← 所有路由的GMB正則表達(dá)式

    //格式為:請求域名_請求方法_請求地址

    //例如:t1.xqkeji.com_get_/表示主頁的請求地址

    url ← 特定格式的URL信息字符串

    //路由數(shù)組的索引下標(biāo),確定匹配的路由

    route_index ← 0

    //正則匹配就是測試url地址字符串是否符合正則表達(dá)式

    //regex的規(guī)則,返回true或false,同時將正則搜索的結(jié)果存儲

    //到matches數(shù)組中

    If 正則匹配(regex,url,matches) Then

    //正則表達(dá)式有匹配,說明已經(jīng)找到路由

    //計算出命中路由的索引

    route_index ← matches[‘MARK’]

    Else

    //沒有找到路由,404錯誤

    End If

    5 實(shí)現(xiàn)方案

    本文綜合了Pux、FastRoute、Symfony Routing各自的優(yōu)點(diǎn),采用C語言實(shí)現(xiàn)PHP擴(kuò)展的方式,提升程序性能,并且結(jié)合PHP內(nèi)核的機(jī)制進(jìn)行路由性能的優(yōu)化;對組合方式和分塊大小進(jìn)行深入研究,經(jīng)測試和分析表明GMB是最優(yōu)的組合方式,同時發(fā)現(xiàn)了最優(yōu)的分塊大小是動態(tài)的,是隨著路由信息總數(shù)量的變化而變化的,并提出一個最優(yōu)分塊大小的范圍。

    5.1 分塊大小

    正則表達(dá)式是有長度的限制的,PHP默認(rèn)使用的是16-bit PCRE2 library,支持的正則表達(dá)式編譯后的結(jié)果的最大長度為65 536,這就造成了進(jìn)行組合的正則表達(dá)式路由必須進(jìn)行分塊,將一條大的正則表達(dá)式分成多個小塊,才能確保不會超出正則表達(dá)式長度的限制。由于限制的長度是正則表達(dá)式編譯后的長度,我們很難計算出GPB和GCB組合支持最大的路由數(shù)。經(jīng)過簡單的測試,以每個分支最多6個分組為例,GPB組合一條正則表達(dá)式大概支持400條路由,GCB組合一條正則表達(dá)式大概支持100條路由,GMB組合一條正則表達(dá)式大概支持600條路由,如表2和表3所示。

    表2 GPB組合產(chǎn)生的空分組數(shù)

    表3 GCB組合產(chǎn)生的空分組數(shù)

    例如使用t1-t20構(gòu)建100條路由,GPB組合產(chǎn)生17×20=340個空分組,GCP組合產(chǎn)生17×20+((20×5-1)(20×5-1+1))/2=340+4 950,GMB組合只加了一個唯一的標(biāo)記沒有空分組。每一個空分組()由兩個字符組合,GPB的空分組會產(chǎn)生680個字符,GCB的空分組會產(chǎn)生10 580個字符。這是造成GCB一條正則表達(dá)式大概最多只支持100條路由、GPB可以達(dá)到400條路由、GMB可以達(dá)到600條路由的原因。

    采用分塊后,GPB、GCB、GMB三種組合都不是每條正則表達(dá)式包含最多的路由數(shù)時達(dá)到性能最佳。由于正則的匹配性能是不穩(wěn)定的,經(jīng)過簡單測試,三種組合的最佳分塊大小大概等于:

    最大數(shù)(最小數(shù)(路由總數(shù)量×G,GMax),GMin)

    其中:G在0.3~0.7之間,一般取0.5;Gmin在GPB和GCB中一般取10,在GMB中一般取30;GMax在GPB中一般取300,在GCB中一般取70,在GMB中一般取550。

    5.2 采用的組合方式

    根據(jù)5.1節(jié)的描述,無論是GPB還是GCB,都需要額外添加空分組(),才能正確計算出匹配的路由,并且隨著分支數(shù)的增加,空分組的數(shù)量就會越多。

    同時構(gòu)建t1-t20個子站點(diǎn),總共100條路由信息,分別使用GPB、GCB和GMB,匹配t1、t10、t20站點(diǎn)的第一條路由和最后一條路由,測試驗(yàn)證三種組合方式的性能,結(jié)果如圖4所示。

    圖4 三種組合方式性能測試

    根據(jù)測試的結(jié)果,在t1、t10、t20中,采用GMB組合的路由性能比GCB和GPB都有明顯的優(yōu)勢。同時從測試的結(jié)果看,在路由數(shù)量較少時,GCB和GMB的性能接近;隨著路由數(shù)量的增加,GCB組合添加的輔助字符越多,與GMB組合的性能差距就越大。

    GMB組合的優(yōu)勢在于添加的輔助字符是最少的,同時限制也是最少的,并沒有最小分組數(shù)和相同分組數(shù)的限制,這就決定了GMB對比其他組合方式有明顯的優(yōu)勢。

    5.3 其 他

    1) 路由格式。([域名1|域名2|.*?])_([請求方法1|請求方法2|.*?])_路由規(guī)則(*MARK:分支唯一標(biāo)記)

    該格式簡單并且支持多域名和多個請求方法,容易編譯成一條大的正則表達(dá)式。

    2) 路由分類。根據(jù)路由信息的特點(diǎn),將路由分為靜態(tài)路由和動態(tài)路由。路由進(jìn)行分類后,靜態(tài)路由不需要進(jìn)行正則匹配,直接根據(jù)請求的URL地址與目標(biāo)程序的對應(yīng)關(guān)系,可以采用哈希表進(jìn)行路由匹配,從而減少了正則表達(dá)式的數(shù)量。例如t1站點(diǎn)的主頁和搜索頁,對應(yīng)的規(guī)則分別為’/’和’/search’,直接與請求的URL地址對應(yīng),無須使用正則匹配,就能確定調(diào)用的目標(biāo)程序地址。

    3) 自定義正則匹配函數(shù)。使用preg_match進(jìn)行路由匹配返回的結(jié)果中,我們只需要得到模塊名稱、控制器名稱、動作名稱和參數(shù)四個數(shù)據(jù),其他數(shù)據(jù)只是為了輔助驗(yàn)證,不需要通過PHP再返回。通過自定義preg_match函數(shù),改為調(diào)用PCRE進(jìn)行正則匹配后,直接返回正則分支的MARK唯一標(biāo)記,不匹配時返回false,方便直接得到選中的路由索引,并將匹配的結(jié)果修改為只返回4個我們需要的數(shù)據(jù),可以減少PHP將PCRE的匹配結(jié)果轉(zhuǎn)化為PHP數(shù)據(jù)時3次插入數(shù)據(jù)。

    4) 使用持久數(shù)組存儲路由信息。PHP每次請求結(jié)束都會進(jìn)行垃圾回收,所有非持久的資源都會被銷毀[9-10]。在沒有將路由信息存儲在持久數(shù)組中時,每一次請求都要加載路由信息。路由信息數(shù)量較多時,加載路由信息就會變成系統(tǒng)的瓶頸。將路由信息存儲在持久數(shù)組中,每一個進(jìn)程只需加載一次,第二次請求無須加載路由信息,可以有效解決加載大量路由信息對性能造成的影響。

    5) 使用LRU緩存路由命中結(jié)果。每個請求地址對應(yīng)的路由信息是固定的,它們之間是一一對應(yīng)的關(guān)系,可以使用緩存來表示它們之間對應(yīng)的關(guān)系,從而減少正則匹配的次數(shù),提升路由的性能。但是一個普通的網(wǎng)站日點(diǎn)擊率也會超過10萬次,因此緩存必須要有淘汰的策略,不然緩存的信息量太大,會耗盡系統(tǒng)資源,反而會成為負(fù)擔(dān)。

    LRU是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰[11]。結(jié)合PHP內(nèi)核提供的HashTable和雙向鏈表數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)了一個路由命中結(jié)果的LRU緩存,如圖5所示。

    圖5 使用緩存的路由匹配流程

    啟用LRU緩存后,使用Web請求的url地址作為HashTable的Key,然后LRU節(jié)點(diǎn)存儲路由匹配返回的結(jié)果。路由匹配前,檢查該Web請求的url地址是否存在緩存,存在時直接返回緩存中存儲的路由匹配結(jié)果,不存在時進(jìn)行路由匹配并將路由匹配結(jié)果寫入緩存最后返回路由匹配結(jié)果。

    6 實(shí)驗(yàn)與結(jié)果

    6.1 實(shí)驗(yàn)環(huán)境

    1) 軟件環(huán)境。操作系統(tǒng):Windows 10。軟件環(huán)境:Docker19.03.5、PHP7.4.1。PHP基準(zhǔn)測試庫:nice/bench 1.0。

    2) 硬件環(huán)境。處理器:Intel(R) Core(TM) i5- 3230M。內(nèi)存:8.00 GB(1 600 MHz)。硬盤:系統(tǒng)盤(固態(tài)硬盤Lenovo SSD SL700 128 GB),數(shù)據(jù)盤(機(jī)械硬盤WDC WD5000LPVT- 08G33T1)。

    6.2 產(chǎn)品對比

    FastRoute是第一個實(shí)現(xiàn)組合的正則表達(dá)式路由方案的PHP開源項(xiàng)目,同時被應(yīng)用于Lumen框架中。它那提出的組合的正則表達(dá)式路由的實(shí)現(xiàn)方案被大量的項(xiàng)目借鑒,使得正則表達(dá)式路由的匹配性能有了數(shù)量級的提升。

    Routing(Compiled)是PHP著名的開發(fā)框架Symfony的路由組件中的一種路由匹配方式,是在Symfony 4.1版本后借鑒了FastRoute的組合的正則表達(dá)式路由的實(shí)現(xiàn)方案,實(shí)現(xiàn)了將Routing的路由信息編譯為組合的正則表達(dá)式路由的實(shí)現(xiàn)方案,對比獨(dú)立的正則表達(dá)式路由有5倍性能的提升。

    XqRoute是采用本文制定的實(shí)現(xiàn)方案,實(shí)現(xiàn)的高性能的PHP路由庫。

    XqRoute(LRU)是在XqRoute下開啟了LRU緩存,開啟LRU緩存后可以讓路由的匹配不受路由信息數(shù)量的影響,保持穩(wěn)定的路由性能。

    6.3 構(gòu)建實(shí)驗(yàn)數(shù)據(jù)

    通過構(gòu)建t1-t20、t1-t100、t1-t200等,生成100條、500條、1 000條路由信息。

    6.4 測試對比

    1) 100條路由。連續(xù)運(yùn)行10 000次,對比t1、t10、t20站點(diǎn)5條路由都匹配一次和一次沒有路由匹配的情況,如圖6所示。

    圖6 100條路由(t1-t20)的路由匹配性能對比

    2) 500條路由。連續(xù)運(yùn)行10 000次,對比t1、t50、t100站點(diǎn)5條路由都匹配一次和一次沒有路由匹配的情況,如圖7所示。

    圖7 500條路由(t1-t100)的路由匹配性能對比

    3) 1 000條路由。連續(xù)運(yùn)行10 000次,對比t1、t100、t200站點(diǎn)5條路由都匹配一次和一次沒有路由匹配的情況,如圖8所示。

    圖8 1 000條路由(t1-t200)的路由匹配性能對比

    6.5 測試結(jié)論

    根據(jù)測試的路由信息,只有60%的路由是動態(tài)路由,也就是100條路由時,只有60條動態(tài)路由。FastRoute在動態(tài)路由信息較少時,性能表現(xiàn)比較好,但隨著動態(tài)路由信息的增加,性能下降較快。XqRoute即使沒有開啟LRU緩存,綜合性能也是最好的,隨著動態(tài)路由信息的增加,性能只是緩慢下降,動態(tài)路由信息越多,性能優(yōu)勢越明顯。XqRoute啟用LRU緩存后,可以使得路由匹配的性能基本與動態(tài)路由信息的數(shù)量無關(guān)。

    7 結(jié) 語

    本文深入研究了組合的正則表達(dá)式路由的組合方式和分塊大小,并制定了一個可行的高性能的PHP路由實(shí)現(xiàn)方案,實(shí)現(xiàn)了一個不受動態(tài)路由信息數(shù)量影響的高性能的PHP路由庫。接下來將在此基礎(chǔ)上,繼續(xù)研究和實(shí)現(xiàn)開發(fā)框架的其他核心組件,最終實(shí)現(xiàn)一個通用的高性能的高效率的PHP開發(fā)框架。

    猜你喜歡
    字符串分塊正則
    分塊矩陣在線性代數(shù)中的應(yīng)用
    剩余有限Minimax可解群的4階正則自同構(gòu)
    類似于VNL環(huán)的環(huán)
    反三角分塊矩陣Drazin逆新的表示
    基于自適應(yīng)中值濾波的分塊壓縮感知人臉識別
    基于多分辨率半邊的分塊LOD模型無縫表達(dá)
    有限秩的可解群的正則自同構(gòu)
    一種新的基于對稱性的字符串相似性處理算法
    依據(jù)字符串匹配的中文分詞模型研究
    一種針對Java中字符串的內(nèi)存管理方案
    欧美人与善性xxx| 国产亚洲午夜精品一区二区久久| 国产免费视频播放在线视频| 嘟嘟电影网在线观看| 午夜免费男女啪啪视频观看| 男女啪啪激烈高潮av片| 国产国拍精品亚洲av在线观看| 日韩欧美精品免费久久| 国产深夜福利视频在线观看| 国产男女超爽视频在线观看| 最新中文字幕久久久久| 免费大片18禁| 国产日韩欧美视频二区| 尾随美女入室| av网站免费在线观看视频| 亚洲伊人久久精品综合| 午夜91福利影院| 中文字幕亚洲精品专区| 蜜桃在线观看..| 国产精品一区二区性色av| 最近最新中文字幕免费大全7| 久久韩国三级中文字幕| 丝瓜视频免费看黄片| 不卡视频在线观看欧美| 91aial.com中文字幕在线观看| 成人特级av手机在线观看| 老司机影院成人| 日本91视频免费播放| av福利片在线观看| 一本—道久久a久久精品蜜桃钙片| 王馨瑶露胸无遮挡在线观看| 丝瓜视频免费看黄片| 人妻制服诱惑在线中文字幕| 亚洲熟女精品中文字幕| 毛片一级片免费看久久久久| 国产欧美日韩一区二区三区在线 | 亚洲精品,欧美精品| 精品一区在线观看国产| 亚洲成人一二三区av| 亚洲国产精品999| freevideosex欧美| 9色porny在线观看| 中文字幕制服av| 内射极品少妇av片p| 一区二区三区精品91| 国产视频首页在线观看| 久久人人爽人人片av| 久热这里只有精品99| 久久久久久久久久人人人人人人| 亚洲精品色激情综合| 夜夜骑夜夜射夜夜干| 黑人巨大精品欧美一区二区蜜桃 | 国产精品不卡视频一区二区| 国产精品无大码| 丰满迷人的少妇在线观看| 麻豆乱淫一区二区| 九草在线视频观看| 桃花免费在线播放| 一区二区三区乱码不卡18| 97在线人人人人妻| 九九在线视频观看精品| 一本色道久久久久久精品综合| 美女cb高潮喷水在线观看| 极品少妇高潮喷水抽搐| 在线天堂最新版资源| 熟女av电影| 男女边摸边吃奶| 国国产精品蜜臀av免费| 国产 精品1| 久热这里只有精品99| 亚洲精品亚洲一区二区| 天堂8中文在线网| 热re99久久精品国产66热6| 亚洲无线观看免费| 人人妻人人澡人人看| 午夜福利视频精品| 精品久久久噜噜| 免费观看在线日韩| 日本猛色少妇xxxxx猛交久久| 男人和女人高潮做爰伦理| 免费少妇av软件| 肉色欧美久久久久久久蜜桃| 国产国拍精品亚洲av在线观看| 欧美日韩av久久| 午夜免费观看性视频| 久久久久久久久久久久大奶| 欧美日韩视频高清一区二区三区二| 麻豆乱淫一区二区| 亚洲中文av在线| 最新中文字幕久久久久| 中文乱码字字幕精品一区二区三区| 亚洲三级黄色毛片| 只有这里有精品99| 18禁在线无遮挡免费观看视频| 亚洲国产成人一精品久久久| 日本免费在线观看一区| 欧美少妇被猛烈插入视频| 午夜激情福利司机影院| 国产伦理片在线播放av一区| 精品久久久久久电影网| 亚洲欧美中文字幕日韩二区| 欧美+日韩+精品| 哪个播放器可以免费观看大片| 91久久精品国产一区二区成人| 老熟女久久久| 精品熟女少妇av免费看| 亚洲欧洲精品一区二区精品久久久 | 久久久久久伊人网av| 婷婷色综合www| 青春草视频在线免费观看| 亚洲av欧美aⅴ国产| 男女国产视频网站| 亚洲av综合色区一区| 人妻制服诱惑在线中文字幕| 97超视频在线观看视频| 国产日韩欧美视频二区| 伦理电影大哥的女人| 99久久中文字幕三级久久日本| 老司机亚洲免费影院| 国产伦精品一区二区三区四那| 国产黄色免费在线视频| 黄色怎么调成土黄色| 精品99又大又爽又粗少妇毛片| 久久国产精品大桥未久av | 国产精品人妻久久久久久| 国产一区二区三区av在线| 国精品久久久久久国模美| 亚洲图色成人| 寂寞人妻少妇视频99o| 97在线视频观看| 国产视频内射| 看十八女毛片水多多多| 有码 亚洲区| 麻豆乱淫一区二区| 精品国产一区二区三区久久久樱花| 自拍欧美九色日韩亚洲蝌蚪91 | 成人国产麻豆网| 一级毛片我不卡| 男女无遮挡免费网站观看| 这个男人来自地球电影免费观看 | 成年av动漫网址| 九九在线视频观看精品| 99九九线精品视频在线观看视频| 精品99又大又爽又粗少妇毛片| 你懂的网址亚洲精品在线观看| 国产精品三级大全| 婷婷色av中文字幕| 我的老师免费观看完整版| 狂野欧美激情性xxxx在线观看| 男人狂女人下面高潮的视频| 欧美三级亚洲精品| 91久久精品国产一区二区三区| 亚洲精品456在线播放app| 久久久久久久久久人人人人人人| 少妇的逼好多水| 丰满饥渴人妻一区二区三| 少妇高潮的动态图| 免费久久久久久久精品成人欧美视频 | 国内揄拍国产精品人妻在线| 久久久久网色| 人人妻人人爽人人添夜夜欢视频 | 晚上一个人看的免费电影| 久久国产精品大桥未久av | 久久鲁丝午夜福利片| 亚洲av男天堂| 最近2019中文字幕mv第一页| 亚洲成人av在线免费| 国产男女内射视频| 自线自在国产av| 国产免费一级a男人的天堂| 久久久久人妻精品一区果冻| 国产爽快片一区二区三区| 国产成人精品久久久久久| 久久午夜综合久久蜜桃| 精品亚洲成国产av| 2022亚洲国产成人精品| 我要看黄色一级片免费的| 少妇被粗大的猛进出69影院 | 免费av不卡在线播放| 欧美精品国产亚洲| 蜜桃久久精品国产亚洲av| 欧美区成人在线视频| 黑人猛操日本美女一级片| 国产精品久久久久久久久免| 人体艺术视频欧美日本| 天堂8中文在线网| 日本91视频免费播放| 汤姆久久久久久久影院中文字幕| 春色校园在线视频观看| 人妻一区二区av| 99热网站在线观看| 国产69精品久久久久777片| 人人妻人人澡人人爽人人夜夜| 一边亲一边摸免费视频| 午夜精品国产一区二区电影| 国内少妇人妻偷人精品xxx网站| 久久99热这里只频精品6学生| 国产一区有黄有色的免费视频| 蜜臀久久99精品久久宅男| 热re99久久国产66热| 免费人成在线观看视频色| 成人黄色视频免费在线看| 亚洲精品一区蜜桃| 国产精品偷伦视频观看了| 亚洲高清免费不卡视频| 欧美人与善性xxx| 免费不卡的大黄色大毛片视频在线观看| 国产日韩欧美视频二区| 国产免费一级a男人的天堂| 久久99热这里只频精品6学生| 国产精品麻豆人妻色哟哟久久| 国产精品偷伦视频观看了| 插阴视频在线观看视频| 日本黄色日本黄色录像| 大片电影免费在线观看免费| 国产深夜福利视频在线观看| 亚洲熟女精品中文字幕| 97精品久久久久久久久久精品| 波野结衣二区三区在线| 黑人猛操日本美女一级片| 亚洲美女搞黄在线观看| 久久久午夜欧美精品| videossex国产| 欧美变态另类bdsm刘玥| 国产成人免费观看mmmm| 女的被弄到高潮叫床怎么办| 免费人妻精品一区二区三区视频| a 毛片基地| 精品酒店卫生间| 一本—道久久a久久精品蜜桃钙片| 色视频www国产| 一级毛片黄色毛片免费观看视频| 国产亚洲午夜精品一区二区久久| 建设人人有责人人尽责人人享有的| 国产男女超爽视频在线观看| 亚洲av福利一区| 亚洲精品国产av成人精品| 久久亚洲国产成人精品v| 桃花免费在线播放| 午夜精品国产一区二区电影| 街头女战士在线观看网站| 大香蕉97超碰在线| 欧美最新免费一区二区三区| 久久99热这里只频精品6学生| 久久精品熟女亚洲av麻豆精品| 视频区图区小说| 狂野欧美白嫩少妇大欣赏| 成人亚洲欧美一区二区av| 亚洲av电影在线观看一区二区三区| 乱码一卡2卡4卡精品| 久久99蜜桃精品久久| 国产精品久久久久成人av| 不卡视频在线观看欧美| 99九九线精品视频在线观看视频| 国产在线男女| 国产一区亚洲一区在线观看| 中文在线观看免费www的网站| 深夜a级毛片| 国产淫片久久久久久久久| 欧美激情极品国产一区二区三区 | xxx大片免费视频| 欧美成人精品欧美一级黄| 日韩欧美 国产精品| 18禁在线无遮挡免费观看视频| 久久av网站| 九色成人免费人妻av| 高清在线视频一区二区三区| 精品国产乱码久久久久久小说| 最近2019中文字幕mv第一页| 边亲边吃奶的免费视频| 亚洲av免费高清在线观看| 女人久久www免费人成看片| 久久ye,这里只有精品| 一级爰片在线观看| 亚洲怡红院男人天堂| 欧美丝袜亚洲另类| 亚洲精品亚洲一区二区| a 毛片基地| 欧美区成人在线视频| 日本爱情动作片www.在线观看| 午夜视频国产福利| 国产一区亚洲一区在线观看| 免费黄频网站在线观看国产| 亚洲av男天堂| 九九爱精品视频在线观看| 国产极品天堂在线| 黄色视频在线播放观看不卡| 午夜福利网站1000一区二区三区| 亚洲精品国产av成人精品| www.av在线官网国产| 亚洲国产精品一区三区| 亚洲精品一二三| 免费久久久久久久精品成人欧美视频 | 一级a做视频免费观看| 99久久人妻综合| 欧美精品一区二区免费开放| 国产精品一区www在线观看| 九九在线视频观看精品| 成人无遮挡网站| 国产精品99久久久久久久久| 久久影院123| 日韩一区二区视频免费看| 成人国产av品久久久| 亚洲国产精品999| 免费久久久久久久精品成人欧美视频 | 欧美另类一区| 日韩精品免费视频一区二区三区 | 边亲边吃奶的免费视频| 精品一区二区三区视频在线| 国产免费一级a男人的天堂| 欧美日韩国产mv在线观看视频| 免费大片黄手机在线观看| 亚洲情色 制服丝袜| 国产伦精品一区二区三区四那| 亚洲精品乱久久久久久| 国产高清三级在线| 国产精品国产三级国产av玫瑰| 国产深夜福利视频在线观看| 九九久久精品国产亚洲av麻豆| 亚洲av综合色区一区| 免费高清在线观看视频在线观看| 少妇熟女欧美另类| 亚洲一区二区三区欧美精品| 亚洲精品成人av观看孕妇| 国产精品一区二区性色av| 最近手机中文字幕大全| 九九在线视频观看精品| 亚洲欧美清纯卡通| 国产熟女欧美一区二区| 99久久精品国产国产毛片| 国产探花极品一区二区| 在线观看美女被高潮喷水网站| 80岁老熟妇乱子伦牲交| 成人特级av手机在线观看| 成年女人在线观看亚洲视频| 男女边吃奶边做爰视频| 少妇的逼水好多| 一级a做视频免费观看| 欧美一级a爱片免费观看看| 亚洲伊人久久精品综合| 中文在线观看免费www的网站| 99久久精品热视频| 久久精品国产a三级三级三级| 最新中文字幕久久久久| 亚洲图色成人| 日本vs欧美在线观看视频 | 亚洲av福利一区| 久久久久久久亚洲中文字幕| 十分钟在线观看高清视频www | 精品久久久久久久久亚洲| 丰满饥渴人妻一区二区三| 蜜臀久久99精品久久宅男| 亚洲精品第二区| 日韩av不卡免费在线播放| 国产片特级美女逼逼视频| 免费观看av网站的网址| 成年人午夜在线观看视频| 高清午夜精品一区二区三区| 亚洲四区av| 欧美xxⅹ黑人| 国产淫片久久久久久久久| 国产成人精品无人区| 亚洲四区av| 国产成人精品久久久久久| 99久国产av精品国产电影| 全区人妻精品视频| 久久人人爽人人片av| 亚洲精品视频女| 水蜜桃什么品种好| 亚洲精品日韩在线中文字幕| 啦啦啦啦在线视频资源| 亚洲精品日韩av片在线观看| 成年av动漫网址| 亚洲欧美成人综合另类久久久| 在线亚洲精品国产二区图片欧美 | 在线观看免费高清a一片| 精品酒店卫生间| 一二三四中文在线观看免费高清| h日本视频在线播放| 99久久综合免费| 亚洲经典国产精华液单| 一级毛片我不卡| 全区人妻精品视频| 国产淫片久久久久久久久| 交换朋友夫妻互换小说| 国产中年淑女户外野战色| 午夜日本视频在线| 婷婷色av中文字幕| 免费播放大片免费观看视频在线观看| 国产乱人偷精品视频| 国内揄拍国产精品人妻在线| 中文在线观看免费www的网站| 丰满人妻一区二区三区视频av| 少妇精品久久久久久久| 色哟哟·www| 国产午夜精品一二区理论片| 18禁在线播放成人免费| 日韩,欧美,国产一区二区三区| 久久精品久久精品一区二区三区| 免费av不卡在线播放| 一区二区三区乱码不卡18| 精品熟女少妇av免费看| 乱系列少妇在线播放| 男女啪啪激烈高潮av片| 建设人人有责人人尽责人人享有的| 国产午夜精品久久久久久一区二区三区| 啦啦啦啦在线视频资源| av免费观看日本| 精品99又大又爽又粗少妇毛片| 亚洲国产av新网站| 久久久久久久亚洲中文字幕| 欧美另类一区| 内射极品少妇av片p| 免费观看无遮挡的男女| 国产av码专区亚洲av| 99久国产av精品国产电影| 欧美精品一区二区大全| 色视频www国产| 精品久久久久久久久亚洲| av线在线观看网站| 在线观看三级黄色| 97超碰精品成人国产| 综合色丁香网| 国产白丝娇喘喷水9色精品| 99九九在线精品视频 | 久久精品久久久久久久性| av免费观看日本| 欧美成人午夜免费资源| 各种免费的搞黄视频| 中文字幕久久专区| 国产日韩一区二区三区精品不卡 | 国产精品久久久久久久电影| 丝袜脚勾引网站| 男人舔奶头视频| 男人狂女人下面高潮的视频| 亚洲国产精品专区欧美| 成人二区视频| 午夜av观看不卡| 熟妇人妻不卡中文字幕| 五月玫瑰六月丁香| 亚洲欧美成人精品一区二区| 在线观看美女被高潮喷水网站| 亚洲中文av在线| 国语对白做爰xxxⅹ性视频网站| 久久99一区二区三区| 亚洲欧美一区二区三区国产| 午夜av观看不卡| av线在线观看网站| 一边亲一边摸免费视频| 高清视频免费观看一区二区| 美女福利国产在线| 天堂中文最新版在线下载| 最近的中文字幕免费完整| 久久99蜜桃精品久久| 熟妇人妻不卡中文字幕| 又粗又硬又长又爽又黄的视频| 国产成人午夜福利电影在线观看| 日日爽夜夜爽网站| 成年美女黄网站色视频大全免费 | 国产又色又爽无遮挡免| 中文字幕av电影在线播放| 久久久久久久久久人人人人人人| 下体分泌物呈黄色| 街头女战士在线观看网站| 亚洲美女搞黄在线观看| 国产国拍精品亚洲av在线观看| 尾随美女入室| 一区二区三区免费毛片| 亚洲精品aⅴ在线观看| 久久精品国产亚洲网站| 亚洲av成人精品一二三区| 欧美一级a爱片免费观看看| av天堂久久9| 看免费成人av毛片| 中文字幕精品免费在线观看视频 | 久久99一区二区三区| 人妻系列 视频| 国产欧美日韩综合在线一区二区 | 草草在线视频免费看| 精品久久久噜噜| 99九九线精品视频在线观看视频| 黄色日韩在线| 国产精品一区www在线观看| 欧美日韩视频精品一区| 精品亚洲成国产av| 搡老乐熟女国产| 黄色一级大片看看| 五月天丁香电影| 日本与韩国留学比较| 亚洲精品一区蜜桃| 一级毛片电影观看| 成人免费观看视频高清| 丝袜脚勾引网站| 日本色播在线视频| 久久久久久久亚洲中文字幕| 美女xxoo啪啪120秒动态图| 亚洲成色77777| 麻豆成人午夜福利视频| 精华霜和精华液先用哪个| tube8黄色片| 成人影院久久| 亚洲成人av在线免费| 狂野欧美激情性bbbbbb| 人人妻人人澡人人看| 日韩电影二区| 久久精品久久精品一区二区三区| 寂寞人妻少妇视频99o| 啦啦啦啦在线视频资源| 国产精品国产三级国产av玫瑰| 97超碰精品成人国产| 精品卡一卡二卡四卡免费| 成人毛片60女人毛片免费| 99热这里只有是精品在线观看| 少妇人妻久久综合中文| 久久久欧美国产精品| 在线观看免费高清a一片| 欧美精品一区二区大全| 久久久久久久国产电影| 少妇的逼好多水| 国产一区二区三区综合在线观看 | 大片免费播放器 马上看| 伊人亚洲综合成人网| 国产欧美日韩一区二区三区在线 | 狂野欧美激情性bbbbbb| 视频区图区小说| 国产欧美日韩精品一区二区| 午夜福利视频精品| 男女啪啪激烈高潮av片| 亚洲图色成人| 国产高清国产精品国产三级| 欧美最新免费一区二区三区| 99热6这里只有精品| 日本vs欧美在线观看视频 | 18禁在线无遮挡免费观看视频| 男女啪啪激烈高潮av片| 精品亚洲乱码少妇综合久久| 国产精品一区二区在线不卡| 九九在线视频观看精品| 性色av一级| 久久久久久久久大av| 欧美老熟妇乱子伦牲交| 美女cb高潮喷水在线观看| 欧美精品一区二区免费开放| 国产成人精品一,二区| 精品少妇久久久久久888优播| 大话2 男鬼变身卡| 国产精品蜜桃在线观看| 一级a做视频免费观看| 国产黄片美女视频| 国产黄色视频一区二区在线观看| 国内揄拍国产精品人妻在线| 赤兔流量卡办理| 99久久综合免费| 2022亚洲国产成人精品| tube8黄色片| 亚洲精品久久午夜乱码| 男女免费视频国产| 国产精品蜜桃在线观看| 多毛熟女@视频| 老司机影院毛片| 亚洲精品成人av观看孕妇| 一级毛片 在线播放| 欧美+日韩+精品| 中文乱码字字幕精品一区二区三区| 欧美bdsm另类| 亚洲人成网站在线观看播放| 一区二区三区乱码不卡18| 亚洲美女黄色视频免费看| 黄色欧美视频在线观看| 91精品国产国语对白视频| 一级,二级,三级黄色视频| 极品少妇高潮喷水抽搐| 欧美日韩视频高清一区二区三区二| 大话2 男鬼变身卡| 久久久久久久国产电影| 国产亚洲最大av| 国产av精品麻豆| 亚洲精品中文字幕在线视频 | 涩涩av久久男人的天堂| 视频中文字幕在线观看| 日韩欧美 国产精品| 亚洲图色成人| 免费观看av网站的网址| 中文字幕制服av| 精品一区在线观看国产| 欧美日韩一区二区视频在线观看视频在线| 日本黄色片子视频| 国产亚洲欧美精品永久| 黄色日韩在线| 热re99久久精品国产66热6| 久久人人爽人人爽人人片va| 成人亚洲精品一区在线观看| 国产精品国产三级国产专区5o| 精品午夜福利在线看| 国产精品.久久久| 国产精品国产三级国产专区5o| 亚洲国产欧美在线一区| 国产精品一区二区三区四区免费观看| 99热6这里只有精品| 黑人高潮一二区| 少妇高潮的动态图| 人妻系列 视频| 一级片'在线观看视频| 夫妻性生交免费视频一级片| 国产精品久久久久久精品古装| 国产亚洲午夜精品一区二区久久| 九九在线视频观看精品| 欧美 日韩 精品 国产| 伦理电影免费视频| 制服丝袜香蕉在线| 熟妇人妻不卡中文字幕| 一级二级三级毛片免费看| 交换朋友夫妻互换小说| videos熟女内射| 少妇裸体淫交视频免费看高清|