並發CURL訪問並通過REDIS來控制並發數

來源:互聯網
上載者:User
並發CURL訪問並通過REDIS來控制並發數

// 隊列redis串連操作    public function RedisConnect() {        $queue = Yii::app()->queue_redis;        $server = $queue->host;        $port = $queue->port;        $timeout = $queue->timeOut;        $redis =  new Redis();        $redis->connect($server, $port, $timeout); // timeout=300        return $redis;    }/**  redis計數控制並發     *     * @param       connomains: url數組     * @param       key: redis鍵名     * @param       max: 總運行次數     * @param       ip:  ip     * @param       c:   c當前迴圈次數     * @param       i:   並發控制,允許同時運行多少條     * @return     */    private function redisCount(&$connomains,$key,$ip,$max,$c,$i=20){        $RedisConnect = $this->RedisConnect();        $redis = $RedisConnect->get($key);        echo "redis==".$redis;        if(isset($redis)){            if($redis >= $i){                if(!empty($connomains)){                    $this->multi_curl($connomains);                    $connomains = array();                }                sleep(2);                $this->redisCount($connomains,$key,$ip,$max,$c,$i);             }else{                $RedisConnect->incr($key);            }        }            }//並發多線程訪問    private function multi_curl($links){        $mh = curl_multi_init();        $instances = array();        foreach($links as $type=>$link){            $instances[$type] = curl_init($link['url']);            curl_setopt($instances[$type],CURLOPT_RETURNTRANSFER, 1);            curl_setopt($instances[$type],CURLOPT_TIMEOUT, 90);//原先90 2014/11/10            curl_setopt($instances[$type],CURLOPT_POST, 1);            curl_setopt($instances[$type],CURLOPT_POSTFIELDS, $link['data']);            curl_multi_add_handle($mh,$instances[$type]);        }                // do{$n=curl_multi_exec($mh,$active);}while($active);//$active表示還有多少個串連要執行        do {            $mrc = curl_multi_exec($mh,$active);     //curl_multi_exec運行結果0是成功,-1是有問題        } while ($mrc == CURLM_CALL_MULTI_PERFORM);  //CURLM_CALL_MULTI_PERFORM常量,值-1        while ($active and $mrc == CURLM_OK) {       //CURLM_OK常量,值0            if (curl_multi_select($mh) != -1) {      //curl_multi_select($mh) 判斷是否正在執行,未執行0,正在執行1,錯誤-1                do {                    $mrc = curl_multi_exec($mh, $active);    //$active表示還有多少個串連要執行                } while ($mrc == CURLM_CALL_MULTI_PERFORM);            }        }                foreach($links as $type=>$link){            $res[$type] = curl_multi_getcontent($instances[$type]);            curl_close($instances[$type]);        }                return $res;    }

以上就是並發CURL訪問並通過REDIS來控制並發數的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.