您好,登錄后才能下訂單哦!
這篇文章主要介紹了PHP多線程之內(nèi)部多線程的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
具體如下:
<?php class Http_MultiRequest { //要并行抓取的url 列表 private $urls = array(); //curl 的選項(xiàng) private $options; //構(gòu)造函數(shù) function __construct($options = array()) { $this->setOptions($options); } //設(shè)置url 列表 function setUrls($urls) { $this->urls = $urls; return $this; } //設(shè)置選項(xiàng) function setOptions($options) { $options[CURLOPT_RETURNTRANSFER] = 1; if (isset($options['HTTP_POST'])) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']); unset($options['HTTP_POST']); } if (!isset($options[CURLOPT_USERAGENT])) { $options[CURLOPT_USERAGENT] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)'; } if (!isset($options[CURLOPT_FOLLOWLOCATION])) { $options[CURLOPT_FOLLOWLOCATION] = 1; } if (!isset($options[CURLOPT_HEADER])) { $options[CURLOPT_HEADER] = 0; } $this->options = $options; } //并行抓取所有的內(nèi)容 function exec() { if(empty($this->urls) || !is_array($this->urls)) { return false; } $curl = $data = array(); $mh = curl_multi_init(); foreach($this->urls as $k => $v) { $curl[$k] = $this->addHandle($mh, $v); } $this->execMulitHandle($mh); foreach($this->urls as $k => $v) { $data[$k] = curl_multi_getcontent($curl[$k]); curl_multi_remove_handle($mh, $curl[$k]); } curl_multi_close($mh); return $data; } //只抓取一個(gè)網(wǎng)頁的內(nèi)容。 function execOne($url) { if (empty($url)) { return false; } $ch = curl_init($url); $this->setOneOption($ch); $content = curl_exec($ch); curl_close($ch); return $content; } //內(nèi)部函數(shù),設(shè)置某個(gè)handle 的選項(xiàng) private function setOneOption($ch) { curl_setopt_array($ch, $this->options); } //添加一個(gè)新的并行抓取 handle private function addHandle($mh, $url) { $ch = curl_init($url); $this->setOneOption($ch); curl_multi_add_handle($mh, $ch); return $ch; } //并行執(zhí)行(這樣的寫法是一個(gè)常見的錯(cuò)誤,我這里還是采用這樣的寫法,這個(gè)寫法 //下載一個(gè)小文件都可能導(dǎo)致cup占用100%, 并且,這個(gè)循環(huán)會(huì)運(yùn)行10萬次以上 //這是一個(gè)典型的不懂原理產(chǎn)生的錯(cuò)誤。這個(gè)錯(cuò)誤在PHP官方的文檔上都相當(dāng)?shù)某R?。? private function execMulitHandle($mh) { $running = null; do { curl_multi_exec($mh, $running); } while ($running > 0); } } /*下面是上面的類的一個(gè)測試的例子:*/ $urls = array("http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://www.google.com", "http://www.sina.com.cn", ); $m = new Http_MultiRequest(); $t = microtime(true); $m->setUrls($urls); //parallel fetch(并行抓?。? $data = $m->exec(); $parallel_time = microtime(true) - $t; echo $parallel_time . "\n"; $t = microtime(true); //serial fetch(串行抓?。? foreach ($urls as $url) { $data[] = $m->execOne($url); } $serial_time = microtime(true) - $t; echo $serial_time . "\n";
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“PHP多線程之內(nèi)部多線程的示例分析”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。