PHP多線程之內(nèi)部多線程實例分析
來源:易賢網(wǎng) 閱讀:760 次 日期:2015-03-11 11:31:46
溫馨提示:易賢網(wǎng)小編為您整理了“PHP多線程之內(nèi)部多線程實例分析”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了PHP多線程之內(nèi)部多線程,實例分析了php多線程的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例分析了PHP多線程之內(nèi)部多線程用法。分享給大家供大家參考。具體如下:

代碼如下:

<?php

class Http_MultiRequest

{

//要并行抓取的url 列表

private $urls = array();

//curl 的選項

private $options;

//構(gòu)造函數(shù)

function __construct($options = array())

{

$this->setOptions($options);

}

//設(shè)置url 列表

function setUrls($urls)

{

$this->urls = $urls;

return $this;

}

//設(shè)置選項

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;

}

//只抓取一個網(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è)置某個handle 的選項

private function setOneOption($ch)

{

curl_setopt_array($ch, $this->options);

}

//添加一個新的并行抓取 handle

private function addHandle($mh, $url)

{

$ch = curl_init($url);

$this->setOneOption($ch);

curl_multi_add_handle($mh, $ch);

return $ch;

}

//并行執(zhí)行(這樣的寫法是一個常見的錯誤,我這里還是采用這樣的寫法,這個寫法

//下載一個小文件都可能導致cup占用100%, 并且,這個循環(huán)會運行10萬次以上

//這是一個典型的不懂原理產(chǎn)生的錯誤。這個錯誤在PHP官方的文檔上都相當?shù)某R?。?/P>

private function execMulitHandle($mh)

{

$running = null;

do {

curl_multi_exec($mh, $running);

} while ($running > 0);

}

}

/*下面是上面的類的一個測試的例子:*/

$urls = array("", );

$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";

希望本文所述對大家的php程序設(shè)計有所幫助。

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機網(wǎng)站地址:PHP多線程之內(nèi)部多線程實例分析

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)