cURL庫(kù)的強(qiáng)大功能和靈活的擴(kuò)展性_第1頁(yè)
cURL庫(kù)的強(qiáng)大功能和靈活的擴(kuò)展性_第2頁(yè)
cURL庫(kù)的強(qiáng)大功能和靈活的擴(kuò)展性_第3頁(yè)
cURL庫(kù)的強(qiáng)大功能和靈活的擴(kuò)展性_第4頁(yè)
cURL庫(kù)的強(qiáng)大功能和靈活的擴(kuò)展性_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

cURL庫(kù)的強(qiáng)大功能和靈活的擴(kuò)展性cURL是一個(gè)利用URL語(yǔ)法規(guī)定來(lái)傳輸文件和數(shù)據(jù)的工具,支持很多協(xié)議,如HTTP、FTP、TELNET等。最爽的是,PHP也支持cURL庫(kù)。本文將介紹cURL的一些高級(jí)特性,以及在PHP中如何運(yùn)用它。為什么要用cURL?是的,我們可以通過(guò)其他辦法獲取網(wǎng)頁(yè)內(nèi)容。大多數(shù)時(shí)候,我因?yàn)橄胪祽?,都直接用?jiǎn)單的PHP函數(shù):$content=file_get_contents("");//or$lines=file("");//orreadfile();不過(guò),這種做法缺乏靈活性和有效的錯(cuò)誤處理。而且,你也不能用它完成一些高難度任務(wù)——比如處理coockies、驗(yàn)證、表單提交、文件上傳等等。引用:cURL是一種功能強(qiáng)大的庫(kù),支持很多不同的協(xié)議、選項(xiàng),能提供URL請(qǐng)求相關(guān)的各種細(xì)節(jié)信息?;窘Y(jié)構(gòu)在學(xué)習(xí)更為復(fù)雜的功能之前,先來(lái)看一下在PHP中建立cURL請(qǐng)求的基本步驟:初始化設(shè)置變量執(zhí)行并獲取結(jié)果釋放cURL句柄//1.初始化$ch=curl_init();//2.設(shè)置選項(xiàng),包括URLcurl_setopt($ch,CURLOPT_URL,"");curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_HEADER,0);//3.執(zhí)行并獲取HTML文檔內(nèi)容$output=curl_exec($ch);//4.釋放curl句柄curl_close($ch);第二步(也就是curl_setopt())最為重要,一切玄妙均在此。有一長(zhǎng)串cURL參數(shù)可供設(shè)置,它們能指定URL請(qǐng)求的各個(gè)細(xì)節(jié)。要一次性全部看完并理解可能比較困難,所以今天我們只試一下那些更常用也更有用的選項(xiàng)。檢查錯(cuò)誤你可以加一段檢查錯(cuò)誤的語(yǔ)句(雖然這并不是必需的)://...$output=curl_exec($ch);if($output===FALSE){echo"cURLError:".curl_error($ch);}//...請(qǐng)注意,比較的時(shí)候我們用的是“===FALSE”,而非“==FALSE”。因?yàn)槲覀兊脜^(qū)分空輸出和布爾值FALSE,后者才是真正的錯(cuò)誤。獲取信息這是另一個(gè)可選的設(shè)置項(xiàng),能夠在cURL執(zhí)行后獲取這一請(qǐng)求的有關(guān)信息://...curl_exec($ch);$info=curl_getinfo($ch);echo'獲取'.$info['url'].'耗時(shí)'.$info['total_time'].'秒';//...返回的數(shù)組中包括了以下信息:“url”//資源網(wǎng)絡(luò)地址“content_type”//內(nèi)容編碼“http_code”//HTTP狀態(tài)碼“header_size”//header的大小“request_size”//請(qǐng)求的大小“filetime”//文件創(chuàng)建時(shí)間“ssl_verify_result”//SSL驗(yàn)證結(jié)果“redirect_count”//跳轉(zhuǎn)技術(shù)“total_time”//總耗時(shí)“namelookup_time”//DNS查詢耗時(shí)“connect_time”//等待連接耗時(shí)“pretransfer_time”//傳輸前準(zhǔn)備耗時(shí)“size_upload”//上傳數(shù)據(jù)的大小“size_download”//下載數(shù)據(jù)的大小“speed_download”//下載速度“speed_upload”//上傳速度“download_content_length”//下載內(nèi)容的長(zhǎng)度“upload_content_length”//上傳內(nèi)容的長(zhǎng)度“starttransfer_time”//開(kāi)始傳輸?shù)臅r(shí)間“redirect_time”//重定向耗時(shí)基于瀏覽器的重定向在第一個(gè)例子中,我們將提供一段用于偵測(cè)服務(wù)器是否有基于瀏覽器的重定向的代碼。例如,有些網(wǎng)站會(huì)根據(jù)是否是手機(jī)瀏覽器甚至用戶來(lái)自哪個(gè)國(guó)家來(lái)重定向網(wǎng)頁(yè)。我們利用CURLOPT_HTTPHEADER選項(xiàng)來(lái)設(shè)定我們發(fā)送出的HTTP請(qǐng)求頭信息(httpheaders),包括useragent信息和默認(rèn)語(yǔ)言。然后我們來(lái)看看這些特定網(wǎng)站是否會(huì)把我們重定向到不同的URL。//測(cè)試用的URL$urls=array("","","");//測(cè)試用的瀏覽器信息$browsers=array("standard"=>array("user_agent"=>"Mozilla/5.0(Windows;U;WindowsNT6.1;en-US;rv:)Gecko/20091201Firefox/3.5.6(.NETCLR3.5.30729)","language"=>"en-us,en;q=0.5"),"iphone"=>array("user_agent"=>"Mozilla/5.0(iPhone;U;CPUlikeMacOSX;en)AppleWebKit/420+(KHTML,likeGecko)Version/3.0Mobile/1A537aSafari/419.3","language"=>"en"),"french"=>array("user_agent"=>"Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;GTB6;.NETCLR2.0.50727)","language"=>"fr,fr-FR;q=0.5"));foreach($urlsas$url){echo"URL:$url\n";foreach($browsersas$test_name=>$browser){$ch=curl_init();//設(shè)置urlcurl_setopt($ch,CURLOPT_URL,$url);//設(shè)置瀏覽器的特定headercurl_setopt($ch,CURLOPT_HTTPHEADER,array("User-Agent:{$browser['user_agent']}","Accept-Language:{$browser['language']}"));//頁(yè)面內(nèi)容我們并不需要curl_setopt($ch,CURLOPT_NOBODY,1);//只需返回HTTPheadercurl_setopt($ch,CURLOPT_HEADER,1);//返回結(jié)果,而不是輸出它c(diǎn)url_setopt($ch,CURLOPT_RETURNTRANSFER,1);$output=curl_exec($ch);curl_close($ch);//有重定向的HTTP頭信息嗎?if(preg_match("!Location:(.*)!",$output,$matches)){echo"$test_name:redirectsto$matches[1]\n";}else{echo"$test_name:noredirection\n";echo"\n\n";}首先,我們建立一組需要測(cè)試的URL,接著指定一組需要測(cè)試的瀏覽器信息。最后通過(guò)循環(huán)測(cè)試各種URL和瀏覽器匹配可能產(chǎn)生的情況。因?yàn)槲覀冎付薱URL選項(xiàng),所以返回的輸出內(nèi)容則只包括HTTP頭信息(被存放于$output中)。利用一個(gè)簡(jiǎn)單的正則,我們檢查這個(gè)頭信息中是否包含了“Location:”字樣。運(yùn)行這段代碼應(yīng)該會(huì)返回如下結(jié)果:URL:http://www.cnn.corestandard:noledirectionip-hone:redirectstohttp://it.cnn.corefrench:noredirectionURL:http://www.rtDzilla.corestandard:redirectstohttp://www.rtozilla.coic/en-US/ip-hone:redirectstohttp://www.itcizilla.coic/en-US/french:redirectstohttp://www.renzilla.coie/fr/URL:http://www.facebook,corestandard:noledirectioniphone:redirectstohttp://tQacii.facebook.coie/?w2iefrencii:noredirection用POST方法發(fā)送數(shù)據(jù)當(dāng)發(fā)起GET請(qǐng)求時(shí),數(shù)據(jù)可以通過(guò)“查詢字串”(querystring)傳遞給一個(gè)URL。例如,在google中搜索時(shí),搜索關(guān)鍵即為URL的查詢字串的一部分:/search?q=nettuts這種情況下你可能并不需要cURL來(lái)模擬。把這個(gè)URL丟給“file_get_contents()”就能得到相同結(jié)果。不過(guò)有一些HTML表單是用POST方法提交的。這種表單提交時(shí),數(shù)據(jù)是通過(guò)HTTP請(qǐng)求體(requestbody)發(fā)送,而不是查詢字串。例如,當(dāng)使用CodeIgniter論壇的表單,無(wú)論你輸入什么關(guān)鍵字,總是被POST到如下頁(yè)面:/forums/do_search/你可以用PHP腳本來(lái)模擬這種URL請(qǐng)求。首先,新建一個(gè)可以接受并顯示POST數(shù)據(jù)的文件,我們給它命名為post_output.php:print_r($_POST);接下來(lái),寫一段PHP腳本來(lái)執(zhí)行cURL請(qǐng)求:$url="http://localhost/post_output.php";$post_data=array("foo"=>"bar","query"=>"Nettuts","action"=>"Submit");$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//我們?cè)赑OST數(shù)據(jù)哦!curl_setopt($ch,CURLOPT_POST,1);//把post的變量加上curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);$output=curl_exec($ch);curl_close($ch);echo$output;執(zhí)行代碼后應(yīng)該會(huì)得到以下結(jié)果:Array[foo]=>tar[qjery]=>Netfjts[action]=>Suinuit這段腳本發(fā)送一個(gè)POST請(qǐng)求給post_output.php,這個(gè)頁(yè)面$_POST變量并返回,我們利用cURL捕捉了這個(gè)輸出。文件上傳上傳文件和前面的POST十分相似。因?yàn)樗械奈募蟼鞅韱味际峭ㄟ^(guò)POST方法提交的。首先新建一個(gè)接收文件的頁(yè)面,命名為upload_output.php:print_r($_FILES);以下是真正執(zhí)行文件上傳任務(wù)的腳本:$url="http://localhost/upload_output.php";$post_data=array("foo"=>"bar",//要上傳的本地文件地址"upload"=>"@C:/wamp/www/test.zip");$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);$output=curl_exec($ch);curl_close($ch);echo$output;如果你需要上傳一個(gè)文件,只需要把文件路徑像一個(gè)post變量一樣傳過(guò)去,不過(guò)記得在前面加上@符號(hào)。執(zhí)行這段腳本應(yīng)該會(huì)得到如下輸出:Array/jpload]=>Array;nane]=>test.zip;type]=>application/octet-streaiii[tmp_name]=>C:\wamp\trap\phpCC3.trap[error]=>0[size]=>1133642cURL批處理(multicURL)cURL還有一個(gè)高級(jí)特性——批處理句柄(handle)。這一特性允許你同時(shí)或異步地打開(kāi)多個(gè)URL連接。下面是來(lái)自來(lái)自的示例代碼://創(chuàng)建兩個(gè)cURL資源$ch1=curl_init();$ch2=curl_init();//指定URL和適當(dāng)?shù)膮?shù)curl_setopt($chl,CURLOPT_URL,"/");curl_setopt($ch1,CURLOPT_HEADER,0);curl_setopt($ch2,CURLOPT_URL,"/");curl_setopt($ch2,CURLOPT_HEADER,0);//創(chuàng)建cURL批處理句柄$mh=curl_multi_init();//加上前面兩個(gè)資源句柄curl_multi_add_handle($mh,$chl);curl_multi_add_handle($mh,$ch2);//預(yù)定義一個(gè)狀態(tài)變量$active=null;//執(zhí)行批處理do{$mrc=curl_multi_exec($mh,$active);}while($mrc==CURLM_CALL_MULTI_PERFORM);while($active&&$mrc==CURLM_OK){if(curl_multi_select($mh)!=-l){do{$mrc=curl_multi_exec($mh,$active);}while($mrc==CURLM_CALL_MULTI_PERFORM);}}//關(guān)閉各個(gè)句柄curl_multi_remove_handle($mh,$chl);curl_multi_remove_handle($mh,$ch2);curl_multi_close($mh);這里要做的就是打開(kāi)多個(gè)cURL句柄并指派給一個(gè)批處理句柄。然后你就只需在一個(gè)while循環(huán)里等它執(zhí)行完畢。這個(gè)示例中有兩個(gè)主要循環(huán)。第一個(gè)do-while循環(huán)重復(fù)調(diào)用curl_multi_exec()。這個(gè)函數(shù)是無(wú)隔斷(non-blocking)的,但會(huì)盡可能少地執(zhí)行。它返回一個(gè)狀態(tài)值,只要這個(gè)值等于常量CURLM_CALL_MULTI_PERFORM,就代表還有一些刻不容緩的工作要做(例如,把對(duì)應(yīng)URL的http頭信息發(fā)送出去)。也就是說(shuō),我們需要不斷調(diào)用該函數(shù),直到返回值發(fā)生改變。而接下來(lái)的while循環(huán),只在$active變量為true時(shí)繼續(xù)。這一變量之前作為第二個(gè)參數(shù)傳給了curl_multi_exec(),代表只要批處理句柄中是否還有活動(dòng)連接。接著,我們調(diào)用curl_multi_select(),在活動(dòng)連接(例如接受服務(wù)器響應(yīng))出現(xiàn)之前,它都是被“屏蔽”的。這個(gè)函數(shù)成功執(zhí)行后,我們又會(huì)進(jìn)入另一個(gè)do-while循環(huán),繼續(xù)下一條URL。還是來(lái)看一看怎么把這一功能用到實(shí)處吧:WordPress連接檢查器想象一下你有一個(gè)文章數(shù)目龐大的博客,這些文章中包含了大量外部網(wǎng)站鏈接。一段時(shí)間之后,因?yàn)檫@樣那樣的原因,這些鏈接中相當(dāng)數(shù)量都失效了。要么是被和諧了,要么是整個(gè)站點(diǎn)都被功夫網(wǎng)了...我們下面建立一個(gè)腳本,分析所有這些鏈接,找出打不開(kāi)或者404的網(wǎng)站/網(wǎng)頁(yè),并生成一個(gè)報(bào)告。請(qǐng)注意,以下并不是一個(gè)真正可用的WordPress插件,僅僅是一段獨(dú)立功能的腳本而已,僅供演示,謝謝。好,開(kāi)始吧。首先,從數(shù)據(jù)庫(kù)中讀取所有這些鏈接://CONFIG$db_host='localhost';$db_user='root';$db_pass='';$db_name='wordpress';$excluded_domains=array('localhost','');$max_connections=10;//初始化一些變量$url_list=array();$working_urls=array();$dead_urls=array();$not_found_urls=array();$active=null;//連到MySQLif(!mysql_connect($db_host,$db_user,$db_pass)){die('Couldnotconnect:'.mysql_error());}if(!mysql_select_db($db_name)){die('Couldnotselectdb:'.mysql_error());}//找出所有含有鏈接的文章$q="SELECTpost_contentFROMwp_postsWHEREpost_contentLIKE'%href=%'ANDpost_status='publish'ANDpost_type='post'";$r=mysql_query($q)ordie(mysql_error());while($d=mysql_fetch_assoc($r)){//用正則匹配鏈接if(preg_match_all("!href=\"(.*?)\"!",$d['post_content'],$matches)){foreach($ches[1]as$url){//excludesomedomains$tmp=parse_url($url);if(in_array($tmp['host'],$excluded_domains)){continue;}//storetheurl$url_list[]=$url;}}}//移除重復(fù)鏈接$url_list=array_values(array_unique($url_list));if(!$url_list){die('NoURLtocheck');}我們首先配置好數(shù)據(jù)庫(kù),一系列要排除的域名($excluded_domains),以及最大并發(fā)連接數(shù)($max_connections)。然后,連接數(shù)據(jù)庫(kù),獲取文章和包含的鏈接,把它們收集到一個(gè)數(shù)組中($url_list)。下面的代碼有點(diǎn)復(fù)雜了,因此我將一小步一小步地詳細(xì)解釋://1.批處理器$mh=curl_multi_init();//2.加入需批量處理的URLfor($i=0;$i<$max_connections;$i++){add_url_to_multi_handle($mh,$url_list);}//3.初始處理do{$mrc=curl_multi_exec($mh,$active);}while($mrc==CURLM_CALL_MULTI_PERFORM);//4.主循環(huán)while($active&&$mrc==CURLM_OK){//5.有活動(dòng)連接if(curl_multi_select($mh)!=-1){//6.干活do{$mrc=curl_multi_exec($mh,$active);}while($mrc==CURLM_CALL_MULTI_PERFORM);//7.有信息否?if($mhinfo=curl_multi_info_read($mh)){//意味著該連接正常結(jié)束//8.從curl句柄獲取信息$chinfo=curl_getinfo($mhinfo['handle']);//9.死鏈么?if(!$chinfo['http_code']){$dead_urls[]=$chinfo['url'];//10.404了?}elseif($chinfo['http_code']==404){$not_found_urls[]=$chinfo['url'];//11.還能用}else{$working_urls[]=$chinfo['url'];}//12.移除句柄curl_multi_remove_handle($mh,$mhinfo['handle']);curl_close($mhinfo['handle']);//13.加入新URL,干活if(add_url_to_multi_handle($mh,$url_list)){do{$mrc=curl_multi_exec($mh,$active);}while($mrc==CURLM_CALL_MULTI_PERFORM);}}}}//14.完了curl_multi_close($mh);echo"==DeadURLs==\n";echoimplode("\n",$dead_urls)."\n\n";echo"==404URLs==\n";echoimplode("\n",$not_found_urls)."\n\n";echo"==WorkingURLs==\n";echoimplode("\n",$working_urls);〃15.向批處理器添加urlfunctionadd_url_to_multi_handle($mh,$url_list){static$index=0;//如果還剩url沒(méi)用if($url_list[$index]){//新建curl句柄$ch=curl_init();//配置urlcurl_setopt($ch,CURLOPT_URL,$url_list[$index]);//不想輸出返回的內(nèi)容curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//重定向到哪兒我們就去哪兒curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//不需要內(nèi)容體,能夠節(jié)約帶寬和時(shí)間curl_setopt($ch,CURLOPT_NOBODY,1);//加入到批處理器中curl_multi_add_handle($mh,$ch);//撥一下計(jì)數(shù)器,下次調(diào)用該函數(shù)就能添加下一個(gè)url了$index++;returntrue;}else{//沒(méi)有新的URL需要處理了returnfalse;}}下面解釋一下以上代碼。列表的序號(hào)對(duì)應(yīng)著代碼注釋中的順序數(shù)字。新建一個(gè)批處理器。Createdamultihandle.稍后我們將創(chuàng)建一個(gè)把URL加入批處理器的函數(shù)add_url_to_multi_handle()。每當(dāng)這個(gè)函數(shù)被調(diào)用,就有一個(gè)新url被加入批處理器。一開(kāi)始,我們給批處理器添加了10個(gè)URL(這一數(shù)字由$max_connections所決定)。運(yùn)行curl_multi_exec()進(jìn)行初始化工作是必須的,只要它返回CURLM_CALL_MULTI_PERFORM就還有事情要做。這么做主要是為了創(chuàng)建連接,它不會(huì)等待完整的URL響應(yīng)。只要批處理中還有活動(dòng)連接主循環(huán)就會(huì)一直持續(xù)。curl_multi_select()會(huì)一直等待,直到某個(gè)URL查詢產(chǎn)生活動(dòng)連接。cURL的活兒又來(lái)了,主要是獲取響應(yīng)數(shù)據(jù)。檢查各種信息。當(dāng)一個(gè)URL請(qǐng)求完成時(shí),會(huì)返回一個(gè)數(shù)組。在返回的數(shù)組中有一個(gè)cURL句柄。我們利用其獲取單個(gè)cURL請(qǐng)求的相應(yīng)信息。如果這是一個(gè)死鏈或者請(qǐng)求超時(shí),不會(huì)返回http狀態(tài)碼。如果這個(gè)頁(yè)面找不到了,會(huì)返回404狀態(tài)碼。其他情況我們都認(rèn)為這個(gè)鏈接是可用的(當(dāng)然,你也可以再檢查一下500錯(cuò)誤之類...)。從該批次移除這個(gè)cURL句柄,因?yàn)樗呀?jīng)沒(méi)有利用價(jià)值了,關(guān)了它!很好,現(xiàn)在可以另外加一個(gè)URL進(jìn)來(lái)了。再一次地,初始化工作又開(kāi)始進(jìn)行...嗯,該干的都干了。關(guān)閉批處理器,生成報(bào)告?;剡^(guò)頭來(lái)看給批處理器添加新URL的函數(shù)。這個(gè)函數(shù)每調(diào)用一次,靜態(tài)變量$index就遞增一次,這樣我們才能知道還剩多少URL沒(méi)處理。我把這個(gè)腳本在我的博客上跑了一遍(測(cè)試需要,有一些錯(cuò)誤鏈接是故意加上的),結(jié)果如下:<imgborder="0"src="/534_curl/ss_4.png"/>共檢查約40個(gè)URL,只耗費(fèi)兩秒不到。當(dāng)需要檢查更加大量的URL時(shí),其省心省力的效果可想而知!如果你同時(shí)打開(kāi)10個(gè)連接,還能再快上10倍!另外,你還可以利用cURL批處理的無(wú)隔斷特性來(lái)處理大量URL請(qǐng)求,而不會(huì)阻塞你的Web腳本。另一些有用的cURL選項(xiàng)HTTP認(rèn)證如果某個(gè)URL請(qǐng)求需要基于HTTP的身份驗(yàn)證,你可以使用下面的代碼:復(fù)制內(nèi)容到剪貼板代碼:$url="/members/";$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//發(fā)送用戶名和密碼curl_setopt($ch,CURLOPT_USERPWD,"myusername:mypassword");//你可以允許其重定向curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//下面的選項(xiàng)讓cURL在重定向后//也能發(fā)送用戶名和密碼curl_setopt($ch,CURLOPT_UNRESTRICTED_AUTH,1

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論