亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        PHP多線(xiàn)程之內(nèi)部多線(xiàn)程實(shí)例分析

        字號(hào):


            這篇文章主要介紹了PHP多線(xiàn)程之內(nèi)部多線(xiàn)程,實(shí)例分析了php多線(xiàn)程的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
            本文實(shí)例分析了PHP多線(xiàn)程之內(nèi)部多線(xiàn)程用法。分享給大家供大家參考。具體如下:
            代碼如下:
            <?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)頁(yè)的內(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í)行(這樣的寫(xiě)法是一個(gè)常見(jiàn)的錯(cuò)誤,我這里還是采用這樣的寫(xiě)法,這個(gè)寫(xiě)法
            //下載一個(gè)小文件都可能導(dǎo)致cup占用100%, 并且,這個(gè)循環(huán)會(huì)運(yùn)行10萬(wàn)次以上
            //這是一個(gè)典型的不懂原理產(chǎn)生的錯(cuò)誤。這個(gè)錯(cuò)誤在PHP官方的文檔上都相當(dāng)?shù)某R?jiàn)。)
            private function execMulitHandle($mh)
            {
            $running = null;
            do {
            curl_multi_exec($mh, $running);
            } while ($running > 0);
            }
            }
            /*下面是上面的類(lèi)的一個(gè)測(cè)試的例子:*/
            $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";
            希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。