久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

PHP 中的批處理

瀏覽:98日期:2024-02-11 17:15:11

2007 年 2 月 06 日

如果 Web 應(yīng)用程序中的一個特性需要超過 1 秒或 2 秒才能完成,那么應(yīng)該怎么辦?需要某種離線處理解決方案。學(xué)習(xí)幾種對 PHP 應(yīng)用程序中長時間運行的作業(yè)進行離線服務(wù)的方法。大型的連鎖店有一個大問題。每天,在每家商店會發(fā)生數(shù)千次交易。公司執(zhí)行官希望對這些數(shù)據(jù)進行挖掘。哪些產(chǎn)品賣得好?哪些不好?有機產(chǎn)品在哪里賣得好?冰淇淋的銷售情況怎么樣?

為了捕捉這些數(shù)據(jù),組織必須將所有事務(wù)性數(shù)據(jù)裝載進一個數(shù)據(jù)模型,以便更適合生成公司所需的報告類型。但是,這很花費時間,而且隨著連鎖規(guī)模的增長,處理一天的數(shù)據(jù)可能要花費一天以上的時間。因此,這是個大問題。

現(xiàn)在,您的 Web 應(yīng)用程序可能不需要處理這么多數(shù)據(jù),但是任何站點的處理時間都有可能超過客戶愿意等待的時間。一般來說,客戶愿意等待的時間是 200 毫秒,如果超過這個時間,客戶就會覺得過程 “緩慢”。這個數(shù)字基于桌面應(yīng)用程序,而 Web 使我們更有耐心了。但無論如何,不應(yīng)該讓客戶等待的時間超過幾秒。所以,要采用一些策略來處理 PHP 中的批處理作業(yè)。

分散的方式與 cron

在 UNIX® 機器上,執(zhí)行批處理的核心程序是 cron 守護進程。這個守護進程讀取一個配置文件,這個文件會告訴它要運行哪些命令行以及運行的頻率。然后,這個守護進程就按照配置執(zhí)行它們。在遇到錯誤時,它甚至能夠向指定的電子郵件地址發(fā)送錯誤輸出,從而幫助對問題進行調(diào)試。

我知道一些工程師強烈主張使用線程技術(shù)?!熬€程!線程才是進行后臺處理的真正方法。cron 守護進程太過時了?!?

我不這么認為。

這兩種方法我都用過,我認為 cron 具備 “Keep It Simple, Stupid(KISS,簡單就是美)” 原則的優(yōu)點。它使后臺處理保持簡單。不需要編寫一直運行的多線程的作業(yè)處理應(yīng)用程序(因此不會有內(nèi)存泄漏),而是由 cron 啟動一個簡單的批處理腳本。這個腳本判斷是否有作業(yè)要處理,執(zhí)行作業(yè),然后退出。不需要擔(dān)心內(nèi)存泄漏。也不需要擔(dān)心線程停止或陷入無限循環(huán)。

那么,cron 是如何工作的?這依賴于您所處的系統(tǒng)環(huán)境。我只討論老式簡單的 cron 的 UNIX 命令行版本,您可以向系統(tǒng)管理員咨詢?nèi)绾卧谧约旱?Web 應(yīng)用程序中實現(xiàn)它。

下面是一個簡單的 cron 配置,它在每天晚上 11 點運行一個 PHP 腳本:

0 23 * * * jack /usr/bin/php /users/home/jack/myscript.php

前 5 個字段定義應(yīng)該啟動腳本的時間。然后是應(yīng)該用來運行這個腳本的用戶名。其余的命令是要執(zhí)行的命令行。時間字段分別是分、小時、月中的日、月和周中的日。下面是幾個示例。

命令:

15 * * * * jack /usr/bin/php /users/home/jack/myscript.php

在每個小時的第 15 分鐘運行腳本。

命令:

15,45 * * * * jack /usr/bin/php /users/home/jack/myscript.php

在每個小時的第 15 和第 45 分鐘運行腳本。

命令:

*/1 3-23 * * * jack /usr/bin/php /users/home/jack/myscript.php

在早上 3 點到晚上 11 點之間的每分鐘運行腳本。

命令

30 23 * * 6 jack /usr/bin/php /users/home/jack/myscript.php

在每星期六的晚上 11:30 運行腳本(星期六由 6 指定)。

可以看到,組合的數(shù)量是無限的??梢愿鶕?jù)需要控制運行腳本的時間。還可以指定多個要運行的腳本,這樣的話,一些腳本可以每分鐘都運行,而其他腳本(比如備份腳本)可以每天只運行一次。

為了指定將報告的錯誤發(fā)送到哪個電子郵件地址,可以使用 MAILTO 指令,如下所示:

MAILTO=jherr@pobox.com

注意:對于 Microsoft® Windows® 用戶,有一個等效的 Scheduled Tasks 系統(tǒng)可以用來定期啟動命令行進程(比如 PHP 腳本)。

回頁首

批處理體系結(jié)構(gòu)的基礎(chǔ)知識

批處理是相當(dāng)簡單的。在大多數(shù)情況下,采用兩個工作流之一。第一個工作流用于進行報告;腳本每天運行一次,它生成報告并將報告發(fā)送給一組用戶。第二個工作流是在響應(yīng)某種請求時創(chuàng)建的批作業(yè)。例如,我登錄進 Web 應(yīng)用程序中,并要求它向系統(tǒng)中注冊的所有用戶發(fā)送一個消息,將一個新的特性告訴他們。這個操作必須進行批處理,因為系統(tǒng)中有 10,000 個用戶。PHP 要花費一段時間才能完成這樣的任務(wù),所以它必須由瀏覽器之外的一個作業(yè)來執(zhí)行。

在第二個工作流中,Web 應(yīng)用程序只需將信息放在某個位置,讓批處理應(yīng)用程序共享它。這些信息指定作業(yè)的性質(zhì)(例如,“Send this e-mail to all the people on the system”。)批處理程序運行這個作業(yè),然后刪除作業(yè)。另一種方法是,處理程序?qū)⒆鳂I(yè)標(biāo)為已完成。無論用哪種方法,作業(yè)都應(yīng)該識別為已完成,這樣就不會再次運行它。

本文的其余部分演示在 Web 應(yīng)用程序前端和批處理后端之間共享數(shù)據(jù)的各種方法。

回頁首

郵件隊列

第一種方法是使用專用的郵件隊列系統(tǒng)。在這種模型中,數(shù)據(jù)庫中的一個表包含應(yīng)該發(fā)送給各個用戶的電子郵件消息。Web 界面使用 mailouts 類將電子郵件添加到隊列中。電子郵件處理程序使用 mailouts 類檢索未處理的電子郵件,然后再次使用它從隊列中刪除未處理的電子郵件。

這個模型首先需要 MySQL 模式。

清單 1. mailout.sqlDROP TABLE IF EXISTS mailouts;CREATE TABLE mailouts (; id MEDIUMINT NOT NULL AUTO_INCREMENT,; from_address TEXT NOT NULL,; to_address TEXT NOT NULL,; subject TEXT NOT NULL,; content TEXT NOT NULL,; PRIMARY KEY ( id ));

這個模式非常簡單。每行中有一個 from 和一個 to 地址,以及電子郵件的主題和內(nèi)容。

對數(shù)據(jù)庫中的 mailouts 表進行處理的是 PHP mailouts 類。

清單 2. mailouts.php<?phprequire_once('DB.php');class Mailouts{; public static function get_db(); {;$dsn = 'mysql://root:@localhost/mailout';;$db =& DB::Connect( $dsn, array() );;if (PEAR::isError($db)) { die($db->getMessage()); };return $db}; public static function delete( $id ); {;$db = Mailouts::get_db();;$sth = $db->prepare( 'DELETE FROM mailouts WHERE id=?' );;$db->execute( $sth, $id );;return true}; public static function add( $from, $to, $subject, $content ); {;$db = Mailouts::get_db();;$sth = $db->prepare( 'INSERT INTO mailouts VALUES (null,?,?,?,?)' );;$db->execute( $sth, array( $from, $to, $subject, $content ) );;return true}; public static function get_all(); {;$db = Mailouts::get_db();;$res = $db->query( 'SELECT * FROM mailouts' );;$rows = array();;while( $res->fetchInto( $row ) ) { $rows []= $row; };return $rows}}?>

這個腳本包含 Pear::DB 數(shù)據(jù)庫訪問類。然后定義 mailouts 類,其中包含三個主要的靜態(tài)函數(shù):add、delete 和 get_all。add() 方法向隊列中添加一個電子郵件,這個方法由前端使用。get_all() 方法從表中返回所有數(shù)據(jù)。delete() 方法刪除一個電子郵件。

您可能會問,我為什么不只在腳本末尾調(diào)用 delete_all() 方法。不這么做有兩個原因:如果在發(fā)送每個消息之后刪除它,那么即使腳本在出現(xiàn)問題之后重新運行,消息也不可能發(fā)送兩次;在批作業(yè)的啟動和完成之間可能會添加新的消息。

下一步是編寫一個簡單的測試腳本,這個腳本將一個條目添加到隊列中。

清單 3. mailout_test_add.php<?phprequire 'mailout.php';Mailouts::add( 'donotreply@mydomain.com',; 'molly@nocompany.com.org',; 'Test Subject',; 'This is a test of the batch mail sendout' );?>

在這個示例中,我添加一個 mailout,這個消息要發(fā)送給某公司的 Molly,其中包括主題 “Test Subject” 和電子郵件主體。可以在命令行上運行這個腳本:php mailout_test_add.php。

為了發(fā)送電子郵件,需要另一個腳本,這個腳本作為作業(yè)處理程序。

清單 4. mailout_send.php<?phprequire_once 'mailout.php';function process( $from, $to, $subject, $email ) {; mail( $to, $subject, $email, 'From: $from' );}$messages = Mailouts::get_all();foreach( $messages as $msg ) {; process( $msg[1], $msg[2], $msg[3], $msg[4] )Mailouts::delete( $msg[0] );}?>

這個腳本使用 get_all() 方法檢索所有電子郵件消息,然后使用 PHP 的 mail() 方法逐一發(fā)送消息。在每次成功發(fā)送電子郵件之后,調(diào)用 delete() 方法從隊列中刪除對應(yīng)的記錄。

使用 cron 守護進程定期運行這個腳本。運行這個腳本的頻率取決于您的應(yīng)用程序的需要。

注意:PHP Extension and Application Repository(PEAR)存儲庫包含一個出色的 郵件隊列系統(tǒng) 實現(xiàn),可以免費下載。

回頁首

更通用的方法

專門用來發(fā)送電子郵件的解決方案是很不錯,但是是否有更通用的方法?我們需要能夠發(fā)送電子郵件、生成報告或者執(zhí)行其他耗費時間的處理,而不必在瀏覽器中等待處理完成。

為此,可以利用一個事實:PHP 是一種解釋型語言??梢詫?PHP 代碼存儲在數(shù)據(jù)庫中的隊列中,以后再執(zhí)行它。這需要兩個表,見清單 5。

清單 5. generic.sqlDROP TABLE IF EXISTS processing_items;CREATE TABLE processing_items (; id MEDIUMINT NOT NULL AUTO_INCREMENT,; function TEXT NOT NULL,; PRIMARY KEY ( id ));DROP TABLE IF EXISTS processing_args;CREATE TABLE processing_args (; id MEDIUMINT NOT NULL AUTO_INCREMENT,; item_id MEDIUMINT NOT NULL,; key_name TEXT NOT NULL,; value TEXT NOT NULL,; PRIMARY KEY ( id ));

第一個表 processing_items 包含作業(yè)處理程序調(diào)用的函數(shù)。第二個表 processing_args 包含要發(fā)送給函數(shù)的參數(shù),采用的形式是由鍵/值對組成的 hash 表。

與 mailouts 表一樣,這兩個表也由 PHP 類包裝,這個類稱為 ProcessingItems。

清單 6. generic.php<?phprequire_once('DB.php');class ProcessingItems{; public static function get_db() { ... }; public static function delete( $id ); {;$db = ProcessingItems::get_db();;$sth = $db->prepare( 'DELETE FROM processing_args WHERE item_id=?' );;$db->execute( $sth, $id );;$sth = $db->prepare( 'DELETE FROM processing_items WHERE id=?' );;$db->execute( $sth, $id );;return true}; public static function add( $function, $args ); {;$db = ProcessingItems::get_db();;$sth = $db->prepare( 'INSERT INTO processing_items VALUES (null,?)' );;$db->execute( $sth, array( $function ) );;$res = $db->query( 'SELECT last_insert_id()' );;$id = null;;while( $res->fetchInto( $row ) ) { $id = $row[0]; };foreach( $args as $key => $value );{;;;;;$sth = $db->prepare( 'INSERT INTO processing_args; VALUES (null,?,?,?)' ) $db->execute( $sth, array( $id, $key, $value ) );;};return true}; public static function get_all(); {;$db = ProcessingItems::get_db();;$res = $db->query( 'SELECT * FROM processing_items' );;$rows = array();;while( $res->fetchInto( $row ) );{;;;;;$item = array() $item['id'] = $row[0] $item['function'] = $row[1] $item['args'] = array() $ares = $db->query( 'SELECT key_name, value FROMprocessing_args WHERE item_id=?', $item['id'] ) while( $ares->fetchInto( $arow ) );$item['args'][ $arow[0] ] = $arow[1] $rows []= $item;;};return $rows}}?>

這個類包含三個重要的方法:add()、get_all() 和 delete()。與 mailouts 系統(tǒng)一樣,前端使用 add(),處理引擎使用 get_all() 和 delete()。

清單 7 所示的測試腳本將一個條目添加到處理隊列中。

清單 7. generic_test_add.php<?phprequire_once 'generic.php';ProcessingItems::add( 'printvalue', array( 'value' => 'foo' ) );?>

在這個示例中,添加了一個對 printvalue 函數(shù)的調(diào)用,并將 value 參數(shù)設(shè)置為 foo。我使用 PHP 命令行解釋器運行這個腳本,并將這個方法調(diào)用放進隊列中。然后使用以下處理腳本運行這個方法。

清單 8. generic_process.php<?phprequire_once 'generic.php';function printvalue( $args ) {; echo 'Printing: '.$args['value'].'n';}foreach( ProcessingItems::get_all() as $item ) {; call_user_func_array( $item['function'],;array( $item['args'] ) )ProcessingItems::delete( $item['id'] );}?>

這個腳本非常簡單。它獲得 get_all() 返回的處理條目,然后使用 call_user_func_array(一個 PHP 內(nèi)部函數(shù))用給定的參數(shù)動態(tài)地調(diào)用這個方法。在這個示例中,調(diào)用本地的 printvalue 函數(shù)。

為了演示這種功能,我們看看在命令行上發(fā)生了什么:

% php generic_test_add.php % php generic_process.php Printing: foo%

輸出并不多,但是您能夠看出要點。通過這種機制,可以將任何 PHP 函數(shù)的處理推遲。

現(xiàn)在,如果您不喜歡將 PHP 函數(shù)名和參數(shù)放進數(shù)據(jù)庫中,那么另一種方法是在 PHP 代碼中建立數(shù)據(jù)庫中的 “處理作業(yè)類型” 名稱和實際 PHP 處理函數(shù)之間的映射。按照這種方式,如果以后決定修改 PHP 后端,那么只要 “處理作業(yè)類型” 字符串匹配,系統(tǒng)就仍然可以工作。

回頁首

放棄數(shù)據(jù)庫

最后,我演示另一種稍有不同的解決方案,它使用一個目錄中的文件來存儲批作業(yè),而不是使用數(shù)據(jù)庫。在這里提供這個思路并不是建議您 “采用這種方式,而不使用數(shù)據(jù)庫”,這只是一種可供選擇的方式,是否采用它由您決定。

顯然,這個解決方案中沒有模式,因為我們不使用數(shù)據(jù)庫。所以先編寫一個類,它包含與前面示例中相似的 add()、get_all() 和 delete() 方法。

清單 9. batch_by_file.php<?phpdefine( 'BATCH_DIRECTORY', 'batch_items/' );class BatchFiles{; public static function delete( $id ); {;unlink( $id );;return true}; public static function add( $function, $args ); {;$path = '';;while( true );{;;;;;$path = BATCH_DIRECTORY.time() if ( file_exists( $path ) == false );break;;};$fh = fopen( $path, 'w' );;fprintf( $fh, $function.'n' );;foreach( $args as $k => $v );{;;;;;fprintf( $fh, $k.':'.$v.'n' );;};fclose( $fh );;return true}; public static function get_all(); {;$rows = array();;if (is_dir(BATCH_DIRECTORY)) {;;;;;if ($dh = opendir(BATCH_DIRECTORY)) {;while (($file = readdir($dh)) !== false) {;;;;;$path = BATCH_DIRECTORY.$file if ( is_dir( $path ) == false );;;;;{;$item = array();;$item['id'] = $path;;$fh = fopen( $path, 'r' );;if ( $fh );{;;;;;$item['function'] = trim(fgets( $fh )) $item['args'] = array() while( ( $line = fgets( $fh ) ) != null );;;;;{;$args = split( ':', trim($line) );;$item['args'][$args[0]] = $args[1] };;;;;$rows []= $item fclose( $fh );;};;;;;};};closedir($dh) };};return $rows}}?>

BatchFiles 類有三個主要方法:add()、get_all() 和 delete()。這個類不訪問數(shù)據(jù)庫,而是讀寫 batch_items 目錄中的文件。

使用以下測試代碼添加新的批處理條目。

清單 10. batch_by_file_test_add.php<?phprequire_once 'batch_by_file.php';BatchFiles::add( 'printvalue', array( 'value' => 'foo' ) );?>

有一點需要注意:除了類名(BatchFiles)之外,實際上沒有任何跡象能夠說明作業(yè)是如何存儲的。所以,以后很容易將它改為數(shù)據(jù)庫風(fēng)格的存儲方式,而不需要修改接口。

最后是處理程序的代碼。

清單 11. batch_by_file_processor.php<?phprequire_once 'batch_by_file.php';function printvalue( $args ) {; echo 'Printing: '.$args['value'].'n';}foreach( BatchFiles::get_all() as $item ) {; call_user_func_array( $item['function'], array( $item['args'] ) )BatchFiles::delete( $item['id'] );}?>

這段代碼幾乎與數(shù)據(jù)庫版本完全相同,只是修改了文件名和類名。

回頁首

結(jié)束語

正如前面提到的,服務(wù)器對線程提供了許多支持,可以進行后臺批處理。在某些情況下,使用輔助線程處理小作業(yè)肯定比較容易。但是,也可以使用傳統(tǒng)工具(cron、MySQL、標(biāo)準(zhǔn)的面向?qū)ο蟮?PHP 和 Pear::DB)在 PHP 應(yīng)用程序中創(chuàng)建批作業(yè),這很容易實現(xiàn)、部署和維護。

參考資料

學(xué)習(xí)

您可以參閱本文在 developerWorks 全球站點上的 英文原文 。

閱讀 IBM developerWorks 的 PHP 項目資源中心,進一步了解 PHP。

PHP.net 是面向 PHP 開發(fā)人員的優(yōu)秀資源。

PEAR Mail_Queue 包 是一個健壯的郵件隊列實現(xiàn),其中包括數(shù)據(jù)庫后端。

crontab 手冊 提供了 cron 配置的細節(jié),但是不容易理解。

PHP 手冊中關(guān)于 Using PHP from the command line 的一節(jié)可以幫助您了解如何從 cron 運行腳本。

隨時關(guān)注 developerWorks 技術(shù)事件和 webcast。

了解世界各地即將進行的會議、展覽、網(wǎng)絡(luò)廣播和其他 活動,IBM 開放源碼開發(fā)人員可以通過這些活動了解最新的技術(shù)發(fā)展。

訪問 developerWorks 開源技術(shù)專區(qū),獲得廣泛的 how-to 信息、工具和項目更新,可以幫助您利用開放源碼技術(shù)進行開發(fā)并將其與 IBM 產(chǎn)品結(jié)合使用。

developerWorks podcasts 中包括很多適合于軟件開發(fā)人員的有趣的訪談和討論。

獲得產(chǎn)品和技術(shù)

查閱 PEAR -- PHP Extension and Application Repository,其中包含 Pear::DB。

使用 IBM 試用軟件 改進您的下一個開放源碼開發(fā)項目,這些軟件可以下載或者通過 DVD 獲得。

討論

developerWorks PHP Developer Forum 為所有 PHP 開發(fā)人員提供了討論技術(shù)問題的場所。如果您有關(guān)于 PHP 腳本、函數(shù)、語法、變量、調(diào)試和其他主題的問題,可以在這里提出。

通過參與 developerWorks blog 加入 developerWorks 社區(qū)。

關(guān)于作者

Jack D. Herrington 是一名高級軟件工程師,具有 20 多年的工作經(jīng)驗。他撰寫過三本書: Code Generation in Action 、 Podcasting Hacks 和 PHP Hacks,還撰寫了 30 多篇文章。

標(biāo)簽: PHP
主站蜘蛛池模板: 91av在线免费看 | 91视频一88av | 激情在线观看视频 | 久久久久久久99精品免费观看 | 日韩精品1区2区3区 成人黄页在线观看 | 欧美精品一区二区三区在线四季 | 久久99这里只有精品 | 精品99久久| www.中文字幕.com | a√天堂资源在线 | 亚洲三级在线看 | 日本三级电影网站 | 一区二区日本 | 久草综合网 | 天天操天天曰 | 欧美成人精品在线观看 | 亚洲香蕉在线观看 | 夜本色| 色综合天天 | 国产91成人video | 山岸逢花在线观看无删减 | 成人久久久久久久久 | 成人午夜性a一级毛片免费看 | 亚洲综合精品在线 | 午夜国产一级 | 欧美日韩高清 | 久久天天躁狠狠躁夜夜躁2014 | 色伊人网 | 中国黄色在线视频 | a中文在线 | 超碰一区二区三区 | 亚洲欧美一区二区三区在线 | 四虎影音 | 日韩在线大片 | 久久99久久99精品免视看婷婷 | 欧美xxxx黑人又粗又长 | 精品成人免费一区二区在线播放 | 九一在线观看 | 亚洲午夜免费视频 | 亚洲第一视频 | 一区二区三区日韩 | 欧州一区二区三区 | 69热在线观看 | 免费h在线观看 | 日本久久精品视频 | 四虎最新入口 | 欧美在线视频一区二区 | 久久精品久久精品国产大片 | 国产高清一区二区三区 | 亚洲国产精品福利 | 精品国产99 | 在线视频一区二区三区 | 在线观看91 | 最新国产视频 | av影院在线观看 | 日本中文一区二区 | 欧美日一区二区 | 亚洲欧美一区二区三区在线 | 欧美三级在线播放 | 二区视频 | 在线视频 亚洲 | 黄色一级免费大片 | 久久国产亚洲精品 | 国产成人久久精品一区二区三区 | 99热欧美 | 欧美精产国品一二三区 | 久久这里只有精品8 | 国产精品视频一二三区 | 日韩在线欧美 | 中文字幕三区 | 午夜国产精品视频 | 激情六月综合 | 精品国产一区二区在线 | 成人不卡视频 | 欧美国产在线观看 | 亚洲一区观看 | www在线看片 | 亚洲国产精品视频 | 天堂精品| 成人欧美一区二区 | 亚洲成人av在线 | 视频精品一区二区三区 | 欧美日本乱大交xxxxx | 亚洲成人av在线 | 一区二区在线免费观看 | 免费观看日韩av | 日日干日日爽 | 五月婷婷导航 | 自拍偷拍第一页 | 丁香久久 | 中文字幕a视频 | 日韩免费一区 | 成人性生交大片免费看中文带字幕 | 国产91av视频在线观看 | 精品久久久久久久久久久 | 国产成人av电影 | 成人国产在线 | 亚洲国产在 | 毛片久久 | av电影中文字幕在线观看 | 日韩在线高清视频 | 超碰97av| 永久av | 久久久精品亚洲 | 欧美激情a∨在线视频播放 成人免费共享视频 | 国产在线一区二区三区 | 欧美一区二区三区国产精品 | 丁香午夜 | 精品久久久久久久久久久久久久久久久久久 | 在线观看亚洲视频 | www.久久精品 | 都市激情av | 中文字幕视频在线 | www.麻豆 | 日韩中文字幕三区 | 国产精品综合 | 欧美一区二区三区精品 | 国产视频观看 | 日韩综合 | 亚洲欧美激情精品一区二区 | 午夜精品久久久久久久男人的天堂 | 欧美性视频网站 | 亚洲国产91| 国产情侣小视频 | av在线精品 | 一区二区三区亚洲视频 | xxxx午夜 | 国产精品久久免费视频 | 97久久精品 | 午夜久久久 | 国产高清久久久 | 性色av一区二区三区免费看开蚌 | 一级黄色大片在线 | 日韩中文字幕免费观看 | 久久在线视频 | 国产精品视频网站 | 欧美成人小视频 | 羞羞视频在线观免费观看 | 日韩欧美国产一区二区 | 国产精品夜夜春夜夜爽久久电影 | 久久精品久久久久电影 | 久久精品亚洲精品国产欧美 | 日韩精品久久 | 国产成人免费视频网站高清观看视频 | 国产精品毛片久久久久久久 | 日韩中文字幕在线 | 国产一级影片 | 不卡一二区 | 97视频在线免费观看 | 激情欧美一区二区三区中文字幕 | 一级毛片国产 | 五月婷婷在线观看视频 | 欧美一级艳情片免费观看 | 操操操操操操操操操操操操操操 | 久久亚洲精品国产一区 | 久久精品综合 | 国产丝袜一区二区三区免费视频 | 久草免费在线 | 日本理伦片午夜理伦片 | 欧美精品亚洲精品 | 亚洲tv久久爽久久爽 | 这里精品 | 欧美日韩六区 | 久久久久久免费 | 美女操av| 在线观看国产精品一区二区 | 久久中文字幕一区二区 | 一本色道精品久久一区二区三区 | 亚洲精品一区二区三区在线看 | 中文视频一区 | 国产精品久久久久久亚洲调教 | 精品无码久久久久国产 | 免费的国产视频 | 五月婷婷在线观看视频 | 免费国产成人 | 中文字幕久久综合 | 日韩亚洲一区二区 | 热99这里只有精品 | 成人h视频| 91久久久久 | 免费一区二区 | 国产精品毛片久久久久久久 | 蜜桃视频麻豆女神沈芯语免费观看 | 国产片侵犯亲女视频播放 | 国产真实乱全部视频 | 精品国产第一国产综合精品 | 日本在线观看视频一区 | 欧美日韩视频一区二区 | 欧美日韩国产一区二区三区 | 亚洲精选一区 | 91福利在线导航 | 亚洲国产成人精品女人 | 久久久久久91亚洲精品中文字幕 | 91视频一区二区三区 | www.99日本精品片com | 国产小视频网站 | 亚洲精品电影在线观看 | 国产精品一码二码三码在线 | 欧美日韩国产在线观看 | av在线免费观看网站 | 亚洲国产精品成人无久久精品 | 日本三级2018| 成人免费在线看片 | 毛片免费观看 | 日韩免费视频一区二区 | 天堂一区二区三区四区 | 一级毛片视屏 | 国产一区二区久久 | av网站网址 | 精品国产欧美一区二区 | 国产成人精品一区二区三区视频 | 免费看黄视频网站 | 亚洲 欧美 日韩在线 | 日韩欧美在线视频 | 久久男人天堂 | 国产一区二区免费 | 亚洲性网 | 91资源在线观看 | 日韩视频中文字幕 | 午夜天堂精品久久久久 | 欧美一区视频 | 日韩欧美久久 | 在线伊人网 | 国产综合99| 国产精品久久久久久亚洲调教 | 蜜桃视频一区二区三区 | 亚洲协和影视 | 国产精品国产成人国产三级 | 日本不卡一区二区 | 两性午夜视频 | 国产精品自在线 | 日韩一区在线播放 | 99国产精品99久久久久久 | 成人免费一区二区三区视频网站 | 亚洲第一av网站 | 狠狠草视频 | 91久久久久久久久 | 国产传媒毛片精品视频第一次 | 成人欧美一区二区三区黑人孕妇 | 国产一级影片 | 超碰999 | 成人精品视频99在线观看免费 | 亚洲精品中文视频 | 久久天堂电影 | 国产精品久久久久久久久久久久久久 | 亚洲精品一区 | 久久久精品国产 | www狠狠操 | 黄色一级片黄色一级片 | 亚洲精品国产区 | 日韩精品一区二区三区在线观看 | 在线观看成人av | 亚洲一区中文字幕在线观看 | 在线观看视频一区二区三区 | 日韩视频中文字幕 | 日韩精品视频在线 | 日韩色在线 | 91中文字幕在线观看 | 精品96久久久久久中文字幕无 | 国产精品久久久久久久天堂 | 在线视频a | 天堂久久爱资源站www | 伊人狠狠 | 欧美国产日韩一区 | 日韩一区二区中文字幕 | 男女中文字幕 | 亚洲一区二区在线播放 | 国产xxxxxxxxxx | 91在线观看网站 | 成人欧美一区二区三区在线播放 | 亚洲精品一区二区三区蜜桃久 | 中文字字幕在线观看 | 成年入口无限观看网站 | 亚洲欧美国产一区二区三区 | 成人一区二区电影 | 一区二区三区在线播放 | 久日精品| 午夜精品视频在线观看 | h片在线免费观看 | 先锋资源中文字幕 | 精品一区二区三区免费 | 在线视频不卡一区 | 国产中文在线 | 91久久久久久久久 | 人人草天天草 | 久久成人国产精品 | 国产精品无码专区在线观看 | 国产在线高清视频 | 99国产视频 | 亚洲一区二区三区在线视频 | 久久国产精品久久久久久 | 交视频在线观看国产 | 欧美一级片毛片免费观看视频 | 在线亚洲一区二区 | 亚洲网在线 | 欧美视频三级 | 久久久久国产 | 欧美视频免费看 | 国产精品成人国产乱一区 | 国产精品久久久久久久美男 | 国产成人精品999在线观看 | 日韩欧美一区二区三区视频 | 亚洲免费观看 | 91久久综合 | 亚洲人成网亚洲欧洲无码 | a级在线观看 | 国产精品美女在线观看 | a久久| 99在线视频播放 | 午夜看片在线观看 | 永久免费精品视频 | 亚洲一区二区免费视频 | 理论片87福利理论电影 | 亚洲视频一区二区三区 | 久久综合一区二区 | 久久精品日 | 国产精品99久久久久久宅男 | 亚洲一区日韩 | 亚洲国产精品久久久 | 亚洲欧洲日本国产 | 成人午夜啪啪好大 | 亚洲激情第一页 | 精品在线看| 中文字幕日韩在线 | 亚洲不卡视频 | 伊人短视频 | 99久久免费看视频 | 日韩av视屏| 国产麻豆乱码精品一区二区三区 | 91免费在线播放 | 久久久久国产成人精品亚洲午夜 | 久久蜜桃精品一区二区三区综合网 | 日韩成人不卡 | 欧美三级电影在线播放 | 日韩成人精品在线 | 2021最新热播中文字幕-第1页-看片视频 青青青久草 | 激情欧美一区二区三区中文字幕 | 丝袜 亚洲 另类 欧美 综合 | 日韩综合一区二区 | 成人一区二区三区 | 91在线视频一区 | 狠狠干狠狠操 | 精品人伦一区二区三区蜜桃视频 | www久久99| 午夜影院免费 | 日韩在线欧美 | a级片在线观看 | 亚洲精品女人久久 | 四虎成人在线播放 | 中文字幕99 | 亚洲免费国产视频 | 国产一级在线 | 在线中文字幕av | 亚洲欧美激情精品一区二区 | 欧美高清hd | 欧美一区二区三 | 蜜月va乱码一区二区三区 | 亚洲精品乱码8久久久久久日本 | 91一区二区在线 | 成人av在线播放 | 欧美综合精品 | 精品国产鲁一鲁一区二区在线观看 | www久久久| 亚洲福利社区 | 日韩日韩日韩日韩日韩日韩日韩 | 九一视频在线观看 | 亚洲高清在线 | 国产成人精品久久二区二区 | 久久免费电影 | 久久91| 亚洲国产高清高潮精品美女 | 亚洲久久视频 | 欧美成人综合 | 日韩欧美久久 | 午夜精品久久久久久久久久久久 | 伊人干| 国产成人在线播放 | 日韩视频免费在线观看 | 欧美精品网站 | 欧美综合在线一区 | 一级毛片黄 | 一级免费毛片 | 亚洲精选国产 | www.久久久.com | 亚洲自拍偷拍精品 | 亚洲风情在线观看 | 神马久久久久久 | 一二三区字幕免费观看av | 中文字幕日韩在线 | 成人国产精品久久 | 日本在线视频观看 | 久久成人免费观看 | 综合二区 | 国产精品成人网 | 天天干人人插 | 国产xxxx成人精品免费视频频 | 国产一在线 | 日本不卡高字幕在线2019 | 亚洲一区二区三区免费在线 | 玖玖爱视频在线 | 巴西性猛交xxxx免费看久久久 | 羞羞视频网站免费看 | 精产国产伦理一二三区 | 日韩福利一区 | 久久精品网 | 精品国产99 | 欧美精品日韩 | 色婷婷av久久久久久久 | 亚洲国产精久久久久久久 | 亚洲一区在线视频 | 色综合久久久久 | 两性午夜视频 | 日韩一区二区在线观看 | 天天干狠狠 | 亚洲一区二区三区免费看 | 性视频一区二区 | 黄色免费av| 一级a毛片 | 日韩在线视频观看 | 久久91久久久久麻豆精品 | 人人九九精 | 欧美在线视频一区二区 | 麻豆精品久久 | 亚洲精品视频网 | 亚洲欧美电影 | 91精品国产综合久久婷婷香蕉 | 欧美淫视频 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 国产成人免费网站 | 资源av | 久久久久av | 一区二区三区四区免费观看 | 日本亚洲视频 | 久久久久高清 | 美女h视频 | 成人国产精品视频 | 亚洲欧美综合一区 | 成人在线观看免费视频 | 成人在线免费 | www.伊人.com| 在线观看av不卡 | 午夜影院免费体验区 | 精品一区二区免费视频 | 男女做爰高清无遮挡免费视频 | 久久大陆 | 成人午夜小视频 | 国产精品久久久久9999 | 国产女人高潮视频在线观看 | 色婷婷在线视频观看 | 在线亚洲一区二区 | 天天草狠狠干 | 老司机深夜福利视频 | 欧美一级欧美三级在线观看 | 亚洲一区中文字幕在线 | 真人一级毛片 | 一级在线播放 | 国产精品久久久一区二区 | 久久国产精品一区二区三区 | 国产一区二区视频在线观看 | 成人免费毛片aaaaaa片 | 久久av网 | av电影中文字幕在线观看 | 亚洲国产精品麻豆 | 亚洲成人一区二区三区 | 亚洲欧洲精品视频在线观看 | 国产精品久久久久久久久免费软件 | 日韩无在线 | 中文字幕在线观看一区二区三区 | 午夜成人在线视频 | 亚洲1区2区在线 | 在线视频 中文字幕 | 中文一区| 久久久成人精品视频 | 日韩成人精品在线观看 | 中文字幕免费在线观看 | 激情欧美一区二区三区中文字幕 | 久久91视频 | 国产女精品| 中文字幕一区二区三区乱码在线 | 日韩精品在线一区 | 欧美成人精品一区二区男人看 | 日本理论片好看理论片 | 欧美成人伊人 | 中文字幕在线视频网站 | 欧洲成人在线视频 | 古典武侠第一页久久777 | 91视频观看 | av片在线观看网站 | 男女午夜 | 人人人人人你人人人人人 | 久久99精品久久久久国产越南 | 一区二区国产在线观看 | 日韩av免费在线播放 | 免费在线观看毛片网站 | av在线影院| 久久综合色88| 国产精品久久嫩一区二区 免费 | 国产精品国色综合久久 | 天天干国产 | 欧美精品一区自拍a毛片在线视频 | 成人一区二区电影 | 夜夜av | 婷婷综合激情 | 在线久草 | 亚洲视频一区二区三区 | 久久久精品一区二区三区 | 日韩99| 欧美一区久久 | aaaa大片 | 中文字幕在线看 | 国产午夜精品一区二区三区 | 50人群体交乱视频 | 日韩av网站在线 | 五月天婷婷国产精品 | 日韩精品在线观看视频 | 久草 在线| 韩国三级中文字幕hd久久精品 | 九色在线播放 | 国产激情在线看 | 日韩欧美国产成人一区二区 | 亚洲第一免费视频网站 | 日韩一级 | 午夜影视剧场 | 亚洲一区中文字幕在线 | 91九色视频在线 | 理伦影院 | 国产1页 | 色人久久 | 2018国产大陆天天弄 | 久久高清亚洲 | 玖玖国产精品视频 | 精品2区| 亚洲精品视频播放 | 国产日韩欧美综合 | 国内精品一区二区三区视频 | 亚洲一区二区中文字幕 | 久草视频在线首页 | 成人激情视频在线播放 | 亚洲视频一区二区在线 | 精品久久中文字幕 | 激情毛片 | 精品在线播放 | 亚洲欧美精品一区二区三区 | 久久国产成人 | 日韩第一页 | 国产精品一区二区三区四区 | 欧美在线播放一区二区三区 | 国产精品欧美日韩在线观看 | 波多野结衣一区二区三区中文字幕 | 午夜精品一区二区三区免费视频 | 国产精品无码永久免费888 | 成人免费视频网站在线观看 | www.久久精品 | 在线观看日韩精品 | 亚洲欧美日韩在线一区二区 | 国产亚洲精品久久久久动 | 黄色欧美一级片 | 欧美精品 在线观看 | 中文二区 | 午夜精品福利一区二区三区蜜桃 | 6080yy精品一区二区三区 | 一区二区三区在线免费观看 | 超碰成人在线免费 | 欧美国产视频 | 国产精品入口麻豆www | 精品亚洲国产成av人片传媒 | 国产精自产拍久久久久久 | 中文字幕三区 | 成人久久18免费观看 | 久久视频一区 | gogo熟少妇大胆尺寸 | 欧美日韩视频在线第一区 | 国产精品久久九九 | 国产精品美女久久久久久久久久久 | 久久精品国产99 | 久久综合久久综合久久综合 | 亚洲成年片| www.黄色片视频 | 国产成人精品无人区一区 | 韩日精品在线观看 | 99精品国产在热久久 | 一区在线视频观看 | 天天综合7799精品影视 | 老司机深夜福利在线观看 | 国产精品毛片无码 | 国产精品三级久久久久久电影 | 欧美精品一区在线发布 | 亚洲精品一二三区 | 久久久99精品免费观看 | 无码日韩精品一区二区免费 | 欧美日韩在线一 | 日韩中文字幕在线播放 | 国产羞羞视频 | 亚洲 中文 欧美 日韩在线观看 | 中国特级黄色片 | 一区二区三区四区在线 | 午夜艹| 色综合天天综合网国产成人网 | 国产在线资源 | 国产日韩欧美综合 | 亚洲狠狠爱一区二区三区 | 精品国产乱码久久久久夜 | 国产日韩精品视频 | 日本网站在线免费观看 | 成人亚洲视频 | 美女又黄又免费 | 欧美视频精品 | 中文字幕一级毛片 | 亚洲美女网站 | 国产成人片 | 国产二区精品 | 三级免费毛片 | 中文在线播放 | 国产在线播放av | 黄色大片在线播放 |