X Tutup
array( 'method'=>"GET", 'timeout'=>$timeout, 'header'=> "Accept-Language: zh-cn\r\n" . "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)\r\n" . "Referer: $url\r\n" . (!empty($cookies)?"Cookie: ".self::cookie_build($cookies)."\r\n":""). "Connection: Close\r\n" , ) ); $url .= empty($params)?"":"?".http_build_query($params); $context = stream_context_create($opts); $result = file_get_contents($url,false,$context); if($returnHeader){ return array("result"=>$result,"header"=>$http_response_header); }else{ return $result; } } /** * get multi urls * * @param array $url_array=array("url"=>"","parameters"=>array(),"timeout"=>1,"method"=>"get"); * @param int $timeout=1 * @return string | array */ public static function getArray($url_array,$timeout = 1) { if (!is_array($url_array)) return false; $data = array(); $handle = array(); if(!function_exists("curl_multi_init")) { foreach($url_array as $key=>$value){ $_tmp = parse_url($value['url']); $_tmp['port'] = empty($_tmp['port'])?80:$_tmp['port']; $requests[$key]=$_tmp; } $timeout = 1; $status = array(); $retdata = array(); $sockets = array(); $e = array(); $data = array(); foreach($url_array as $key=>$value){ $url = $value['url']; $method="GET"; if(isset($value['method']))$method=$value['method']; if(strcasecmp($value['method'],"POST")==0){ $method="POST"; }else{ if(!empty($value['parameters'])){ $url = $value['url']."?".http_build_query($value['parameters']); } } $_tmp = parse_url($value['url']); $_tmp['port'] = empty($_tmp['port'])?80:$_tmp['port']; $host = $_tmp['host']; $port = $_tmp['port']; $errno = 0; $errstr = ""; $s = @stream_socket_client( "$host:$port", $errno, $errstr, !isset($value['timeout'])?$value['timeout']:$timeout, STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT ); $data[$key]=array("error"=>"","errno"=>"","result"=>""); if ($s) { $_p = $_tmp['path']; if($method!="POST" && !empty($value['parameters'])){ $_p = $_tmp['path']."?".http_build_query($value['parameters']); } $content=""; if($method=="POST" && !empty($value['parameters'])){ $content = http_build_query($value['parameters']); fwrite($s, "$method $_p HTTP/1.0\r\nHost: ".$host."\r\nContent-Length:".strlen($content)."\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n$content\r\n\r\n"); }else{ fwrite($s, "$method $_p HTTP/1.0\r\nHost: ".$host."\r\nConnection: close\r\n\r\n"); } $sockets[$s] = $s; } else { $data[$key]=array("error"=>$errstr,"errno"=>$errno,"result"=>""); } $handle[$s] = array("key"=>$key,"ch"=>$s,"req"=>$_tmp); } while (count($sockets)) { $read = $write = $sockets; $n = stream_select($read, $write=null, $e=null, $timeout); if ($n > 0) { foreach ($read as $r) { $_r = ($handle[$r]); $_data = stream_get_contents($r); $_key = $_r['key']; if (strlen($_data) == 0) { fclose($r); unset($sockets[$r]); } else { preg_match("/Content-Length: (\d+)/i",$_data,$_m); if(!empty($_m[1])){ $_data=substr($_data,0-$_m[1]); } $data[$_key]['result']=$_data; } } } else { foreach ($sockets as $id => $s) { $status[$id] = "timed out " . $status[$id]; } break; } } return $data; }else{ $running = 0; $mh = curl_multi_init(); $i = 0; foreach($url_array as $key=>$value) { $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, isset($value['timeout'])?$value['timeout']:$timeout); curl_setopt($ch, CURLOPT_USERAGENT, 'RESTful Request'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect curl_setopt($ch, CURLOPT_MAXREDIRS, 5); if(!isset($value['method'])){ $value['method']="GET"; } curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $value['method']); if(strcasecmp($value['method'],"POST")==0){ curl_setopt($ch, CURLOPT_POST, 1); if(!empty($value['parameters'])){ curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($value['parameters'])); } curl_setopt($ch, CURLOPT_URL, $value['url']); }else{ if(!empty($value['parameters'])){ $url = $value['url']."?".http_build_query($value['parameters']); }else{ $url = $value['url']; } curl_setopt($ch, CURLOPT_URL, $url); } curl_multi_add_handle($mh, $ch); $data[$key]=array("error"=>"","errno"=>"","result"=>""); $handle[$ch] = array("key"=>$key,"ch"=>$ch); } do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); while($info=curl_multi_info_read($mh)){ $ch = $info['handle']; $key = $handle[$ch]['key']; if($info['result']==0){ $data[$key]['result'] = curl_multi_getcontent($info['handle']); }else{ $data[$key]['errno']=$info['result']; $data[$key]['error']=curl_error($info['handle']); } } } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach($handle as $c) { curl_multi_remove_handle($mh, $c['ch']); } curl_multi_close($mh); return $data; } } /** * post url * * @param string $url * @param array | string $params * @param array $cookies * @param boolean $returnHeader * @return string | array */ public static function post( $url, $params=array(), $cookies=array(), $returnHeader=false, $timeout=1){ if(is_array($params)){ $content = empty($params)?"":http_build_query($params); }else{ $content=$params; } $opts = array( 'http'=>array( 'method' => 'POST', 'timeout'=>$timeout, 'header' => "Accept-Language: zh-cn\r\n" . "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)\r\n" . "Referer: $url\r\n" . "Connection: Close\r\n" . (!empty($cookies)?"Cookie: ".self::cookie_build($cookies)."\r\n":""). "Content-Type: application/x-www-form-urlencoded\r\n" . "Content-Length: ".strlen($content)."\r\n", 'content' => $content ) ); $context = stream_context_create($opts); $result = file_get_contents($url,false,$context); if($returnHeader){ return array("result"=>$result,"header"=>$http_response_header); }else{ return $result; } } public static function cookie_parse( $header ) { $cookies = array(); foreach( $header as $line ) { if( preg_match_all ("/Set-Cookie: (.+?)=(.+?);/i", $line, $_match,PREG_SET_ORDER)){ $cdata=array(); $key = $_match[0][1]; $value =$_match[0][2]; $csplit = explode( ';', substr($line,strpos($line,$value)+strlen($value)) ); foreach( $csplit as $data ) { $cinfo = explode( '=', $data ,2); if(count($cinfo)<2)continue; $key2 = trim($cinfo[0]); $value2 = $cinfo[1]; if($key==$key2)continue; if( in_array( strtolower($key2), array( 'domain', 'expires', 'path', 'secure', 'comment' ) ) ) { $key2 = strtolower($key2); if( $key2 == 'expires' ) $value2 = strtotime( $value2 ); if( $key2 == 'secure' ) $value2 = "true"; } $cdata[$key2]=$value2; } $cdata['value']['key'] = $key; $cdata['value']['value'] = $value; $cookies[$key] = $cdata; } } return $cookies; } public static function cookie_build( $data ) { if( is_array( $data ) ) { $cookie = ''; foreach( $data as $d ) { if(!empty($d['expires']) && $d['expires'] 0 ) { return trim( implode( '; ', $cookie ) ); } } return false; } } ?>
X Tutup