class httpmulti { //curl选项 private static $options = array( curlopt_ssl_verifypeer => 0, //不开启https请求 curlopt_returntransfer => 1, //请求信息以文件流方式返回 curlopt_connecttimeout => 10, //连接超时时间 默认为10s curlopt_timeout => 20, //设置curl执行最大时间 curlopt_encoding => "gzip", //http请求头中"accept-encoding"的值,为空发送所有支持的编码类型 curlopt_header => 0, //设置为true,请求返回的文件流中就会包含response header curlopt_useragent => 'mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/56.0.2924.87 safari/537.36', curlopt_post => false, //默认选择get的方式发送 ); public static function multirun($urldata=array()){ if(empty($urldata)) return; $data = $curls = array(); $mh = curl_multi_init(); foreach($urldata as $k=>$val){ $ch = curl_init($val); curl_setopt_array($ch, self::$options); curl_multi_add_handle($mh, $ch); $curls[$k] = $ch; } // 执行批处理句柄 self::execmultihandle($mh); if($curls){ foreach($curls as $_k=>$v){ //获得返回信息 $data[$_k] = curl_multi_getcontent($v); curl_close($v); curl_multi_remove_handle($mh, $v); curl_multi_close($mh); } } return $data; } static private function execmultihandle($mh){ if(empty($mh)) return false; do{ $mrc = curl_multi_exec($mh, $active); }while($mrc == curlm_call_multi_perform); while($active && $mrc == curlm_ok){ if(curl_multi_select($mh) != -1){ do{ $mrc = curl_multi_exec($mh, $active); }while($mrc == curlm_call_multi_perform); } } } } //测试代码 $urldata = [ 'https://www.baidu.com/', 'https://www.taobao.com/', 'http://weibo.com/', 'http://www.qq.com/' ]; $res = httpmulti::multirun($urldata);
相关推荐:
php中curl抓取网页响应数据
以上就是php使用curl多线程实现抓取网页功能的详细内容。
