溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP多線程之內(nèi)部多線程的示例分析

發(fā)布時(shí)間:2021-09-02 11:28:12 來源:億速云 閱讀:117 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

php
AI