七牛API代码中使用到的http类

<?php
/**
 * 规范化参数获取
 */

abstract class Http
{
	private static $curlHeaderInfo = array();

	/**
	 * 跳转页面
	 */
	public static function h($url)
	{
		if(!headers_sent())
		{
			header('Location: ' . $url);
		}
		else
		{
			echo "<script>Location.href='$url';</script>";
		}
	}

	/**
	 * 得到GET参数
	 */
	public static function get($key, $value = '')
	{
		if(isset($_GET[$key]))
		{
			return self::fv($_GET[$key]);
		}
		else
		{
			$_GET[$key] = $value;
			return $value;
		}
	}

	/**
	 * 得到POST参数
	 */
	public static function post($key, $value = '')
	{
		if(isset($_POST[$key]))
		{
			return self::fv($_POST[$key]);
		}
		else
		{
			$_POST[$key] = $value;
			return $value;
		}
	}

	/**
	 * 反转义处理
	 */
	public static function fv($value)
	{
		if(is_array($value))
		{
			foreach($value as $k => $v)
			{
				if(is_array($v))
				{
					$value[$k] = self::fv($v);
					return $value;
				}
				else
				{
					$value[$k] = stripslashes($v);
					return $value;
				}
			}
		}
		else
		{
			return stripslashes($value);
		}
	}

	/**
	 * 是否GET调用
	 */
	public static function isGet()
	{
		if(!isset($_SERVER['REQUEST_METHOD']))
		{
			return false;
		}

		if(strtolower($_SERVER['REQUEST_METHOD']) == 'get')
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 是否POST调用
	 */
	public static function isPost()
	{
		if(!isset($_SERVER['REQUEST_METHOD']))
		{
			return false;
		}

		if(strtolower($_SERVER['REQUEST_METHOD']) == 'post')
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 是否ajax调用
	 */
	public static function isAjax()
	{
		if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']))
		{
			return false;
		}

		if(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 是否flash调用
	 */
	public static function isFlash()
	{
		if(!isset($_SERVER['HTTP_USER_AGENT']))
		{
			return false;
		}

		if(strtolower($_SERVER['HTTP_USER_AGENT']) == 'shockwave flash')
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 得到用户IP
	 */
	public static function getUserIP()
	{
		if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
		{
			$ip = getenv("HTTP_CLIENT_IP");
		}
		elseif(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
		{
			$ip = getenv("HTTP_X_FORWARDED_FOR");
		}
		elseif(getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
		{
			$ip = getenv("REMOTE_ADDR");
		}
		elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
		{
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		else
		{
			$ip = "unknown";
		}

		return $ip;
	}

	/**
	 * 获得用户操作系统的换行符
	 *
	 * @access  public
	 * @return  string
	 */
	public static function getUserCrlf()
	{
		if(stristr($_SERVER['HTTP_USER_AGENT'], 'Win'))
		{
			$theCrlf = '\r\n';
		}
		else if(stristr($_SERVER['HTTP_USER_AGENT'], 'Mac'))
		{
			$theCrlf = '\r'; // for old MAC OS
		}
		else
		{
			$theCrlf = '\n';
		}

		return $theCrlf;
	}

	/**
	 * 得到用户浏览器详细信息
	 */
	public static function getUserBrowserByCap()
	{
		if(ini_get('browscap') == '')
		{
			return false;
		}

		$info = get_browser(null, true);

		$browserInfo['os'] = $info['platform'];
		$browserInfo['browser'] = $info['browser'];
		$browserInfo['device_name'] = $info['device_name'];
		$browserInfo['device_maker'] = $info['device_maker'];
		$browserInfo['version'] = $info['version'];
		$browserInfo['max_version'] = $info['majorver'];
		$browserInfo['min_version'] = $info['minorver'];
		$browserInfo['cookie_support'] = $info['cookies'];
		$browserInfo['javaapplet_support'] = $info['javaapplets'];
		$browserInfo['javascript_support'] = $info['javascript'];
		$browserInfo['css_version'] = $info['cssversion'];

		return $browserInfo;
	}

	/**
	 * 得到用户浏览器
	 */
	public static function getUserBrowser()
	{
	     $Agent = $_SERVER['HTTP_USER_AGENT'];

	     $browser = '';
	     $browserver = '';

	     // TT Maxthon TheWorld Chrome Safari Firefox IE Opera
	     // Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; TheWorld)
	     // 无版本信息
	     if(false!==strpos($Agent, 'TheWorld'))
	     {
	         $browser = 'TheWorld';
	     }

	     // Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
	     // 4.0
	     elseif(false!==strpos($Agent, 'TencentTraveler'))
	     {
	         $temp = explode('TencentTraveler', $Agent);
	         $part = $temp[1];
	         $temp = explode(';', $part);
	         $browserver = $temp[0];
	         $browserver = preg_replace('/([^\d.]+)/', '', $browserver); // 去掉非'数字'或非'.'字符
	         $browser = 'TT';
	     }

	     // Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; MAXTHON 2.0)
	     // 2.0
	     elseif(false!==strpos($Agent, 'MAXTHON'))
	     {
	         $temp = explode('MAXTHON', $Agent);
	         $browserver= $temp[1];
	         $browserver = preg_replace('/([^\d.]+)/', '', $browserver); // 去掉非'数字'或非'.'字符
	         $browser = 'Maxthon';
	     }

	     // Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Tride14:42 2009-10-8nt/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
	     // 8.0
	     elseif(false!==strpos($Agent, 'MSIE'))
	     {
	         $temp = explode('MSIE', $Agent);
	         $browserver = $temp[1];
	         $temp = explode(';', $browserver);
	         $browserver = $temp[0];
	         $browserver = preg_replace('/([^\d.]+)/', '', $browserver); // 去掉非'数字'或非'.'字符
	         $browser = 'IE';
	     }

	     // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.25 Safari/532.0
	     // 3.0.195.25
	     elseif(false!==strpos($Agent, 'Chrome'))
	     {
	         $temp = explode('Chrome', $Agent);
	         $browserver = explode(' ', $temp[1]);
	         $temp = $browserver[0];
	         $browserver = $temp;
	         $browserver = preg_replace('/([^\d.]+)/', '', $browserver); // 去掉非'数字'或非'.'字符
	         $browser = 'Chrome';
	     }

	     // Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9.1
	     // 4.0.3
	     elseif(false!==strpos($Agent, 'Safari'))
	     {
	         $temp = explode('Version', $Agent);
	         $browserver = $temp[1];
	         $browserver = explode(' ', $browserver);
	         $temp = $browserver[0];
	         $browserver = $temp;
	         $browserver = preg_replace('/([^\d.]+)/', '', $browserver); // 去掉非'数字'或非'.'字符
	         $browser = 'Safari';
	     }

	     // Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
	     // 3.5.3
	     elseif(false!==strpos($Agent, 'Firefox'))
	     {
	         $browserver = explode('Firefox', $Agent);
	         $temp = $browserver[1];
	         $browserver = $temp;
	         $browserver = preg_replace('/([^\d.]+)/', '', $browserver); // 去掉非'数字'或非'.'字符
	         $browser = 'Firefox';
	     }

	     // Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/10.00
	     // 10.00
	     elseif(false!==strpos($Agent, 'Opera'))
	     {
	         $browserver = explode('Version', $Agent);
	         $temp = $browserver[1];
	         $browserver = $temp;
	         $browserver = preg_replace('/([^\d.]+)/', '', $browserver); // 去掉非'数字'或非'.'字符
	         $browser = 'Opera';
	     }
	     else
	     {
	         $browser = 'unknown';
	         $browserver = 0;
	     }

	     $browserInfo['browser'] = $browser;
	     $browserInfo['ver'] = $browserver;

	     return $browserInfo;
	}

	/**
	 * 得到浏览器用户语言
	 */
	public static function getUserLanguage()
	{
		return $_SERVER['HTTP_ACCEPT_LANGUAGE'];
	}

	/**
	 * 得到用户操作系统
	 */
	public static function getUserOS()
	{
		$sys = $_SERVER['HTTP_USER_AGENT'];

		if(stripos($sys, "NT 6.1"))
		{
			$os = "Windows 7";
		}
		elseif(stripos($sys, "NT 6.0"))
		{
			$os = "Windows Vista";
		}
		elseif(stripos($sys, "NT 5.1"))
		{
			$os = "Windows XP";
		}
		elseif(stripos($sys, "NT 5.2"))
		{
			$os = "Windows Server 2003";
		}
		elseif(stripos($sys, "NT 5"))
		{
			$os = "Windows 2000";
		}
		elseif(stripos($sys, "NT 4.9"))
		{
			$os = "Windows ME";
		}
		elseif(stripos($sys, "NT 4"))
		{
			$os = "Windows NT 4.0";
		}
		elseif(stripos($sys, "98"))
		{
			$os = "Windows 98";
		}
		elseif(stripos($sys, "95"))
		{
			$os = "Windows 95";
		}
		elseif(stripos($sys, "Mac"))
		{
			$os = "Mac";
		}
		elseif(stripos($sys, "Linux"))
		{
			$os = "Linux";
		}
		elseif(stripos($sys, "Unix"))
		{
			$os = "Unix";
		}
		elseif(stripos($sys, "FreeBSD"))
		{
			$os = "FreeBSD";
		}
		elseif(stripos($sys, "SunOS"))
		{
			$os = "SunOS";
		}
		elseif(stripos($sys, "BeOS"))
		{
			$os = "BeOS";
		}
		elseif(stripos($sys, "OS/2"))
		{
			$os = "OS/2";
		}
		elseif(stripos($sys, "PC"))
		{
			$os = "Macintosh";
		}
		elseif(stripos($sys, "AIX"))
		{
			$os = "AIX";
		}
		else
		{
			$os = "unknown";
		}

		return $os;
	}

	/**
	 * 得到请求方式
	 */
	public static function getMethod()
	{
		return $_SERVER['REQUEST_METHOD'];
	}

	/**
	 * 根据URL得到图片宽高和大小
	 */
	public static function getImageInfoFromUrl($url)
	{
		$imageInfo = array();
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_RANGE, "0-800");
		//curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: bytes=0-800"));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HEADER, true);
		$content = curl_exec($ch);
		$header = curl_getinfo($ch);

		curl_close($ch);

		if(!$content)
		{
			return $imageInfo;
		}

		$block = explode("\r\n\r\n", $content);

		$result = @exif_read_data("data://image/jpeg;base64," . base64_encode($block[1]));
		if(empty($result['COMPUTED']['Width']) || empty($result['COMPUTED']['Height']))
		{
			return $imageInfo;
		}

		$imageInfo['width'] = $result['COMPUTED']['Width'];
		$imageInfo['height'] = $result['COMPUTED']['Height'];
		$imageInfo['size'] = 0;

		preg_match('/Content-Range:(\s+)bytes(\s+)(\d+)-(\d+)\/(\d+)/ism',$block[0], $t);
		if(count($t) == 6)
		{
			//KB
			$imageInfo['size'] = round(trim($t[5]) / 1000, 0);
		}

		return $imageInfo;
	}

	/**
	 * 请求链接
	 * @param $urls array('item1' => array('url' => '', 'ssl' => false, 'timeout' => 1, 'proxy_type' => 'http', 'proxy_ip' => '192.168.1.100', 'proxy_port' => 8080, 'useragent' => '', 'cookie' => '', 'referer' => '', 'httpheader' => array(''), 'data' => array('loginname' => 'aa', 'password' => 'bb')))
	 * @param $params
	 * 此函数在长时间大批量时会吃光内存
	 * 命令行长时间不要使用此函数
	 */
	public static function requests($urls)
	{
		$queue = curl_multi_init();
    		$map = array();

		foreach ($urls as $key => $url)
		{
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $url['url']);
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
			curl_setopt($ch, CURLOPT_AUTOREFERER, true);
		  	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		  	curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'self::requestHeader');

		  	if(isset($url['ssl']) || (substr($url['url'], 0, 5) == 'https'))
		  	{
		  		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
				curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
		  	}

			if(isset($url['data']) && !empty($url['data']))
			{
				curl_setopt($ch, CURLOPT_POST, true);

				if(is_array($url['data']))
				{
					curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($url['data']));
				}
				else
				{
					curl_setopt($ch, CURLOPT_POSTFIELDS, $url['data']);
				}
			}

		  	if(isset($url['timeout']) && !empty($url['timeout']))
		  	{
		  		curl_setopt($ch, CURLOPT_TIMEOUT, $url['timeout']);
		  	}
		  	else
		  	{
		  		curl_setopt($ch, CURLOPT_TIMEOUT, 5);
		  	}

			if(isset($url['proxy_type'])  && !empty($url['proxy_type']) && isset($url['proxy_ip']) && !empty($url['proxy_ip']) && isset($url['proxy_port']) && !empty($url['proxy_port']))
			{
				if($url['proxy_type'] == 'http')
				{
					curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
				}
				else
				{
					curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
				}

				curl_setopt($ch, CURLOPT_PROXY, $url['proxy_ip']);
				curl_setopt($ch, CURLOPT_PROXYPORT, $url['proxy_port']);
			}

			if(isset($url['useragent']) && !empty($url['useragent']))
			{
				curl_setopt($ch, CURLOPT_USERAGENT, $url['useragent']);
			}
			else
			{
				curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)');
			}

			if(isset($url['cookie']) && !empty($url['cookie']))
			{
				curl_setopt($ch, CURLOPT_COOKIE, $url['cookie']);
			}

			if(isset($url['httpheader']) && !empty($url['httpheader']))
			{
				curl_setopt($ch, CURLOPT_HTTPHEADER, $url['httpheader']);
			}

			if(isset($url['referer']) && !empty($url['referer']))
			{
				curl_setopt($ch, CURLOPT_REFERER, $url['referer']);
			}

			curl_multi_add_handle($queue, $ch);
        		$map[(string) $ch] = $url['url'];
        		curl_close($ch);
        		unset($ch);
		}

		$responses = array();
		//此处循环吃光内存,原因不明
		do{
			while(($code = curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM);

			if($code != CURLM_OK)
			{
				break;
			}

			// a request was just completed -- find out which one
			while($done = curl_multi_info_read($queue))
			{
				// get the info and content returned on the request
				$results = curl_multi_getcontent($done['handle']);
				$error = curl_error($done['handle']);
				if(!empty($error))
				{
					$results = '';
				}

				$header = array();
				$header['code'] = curl_getinfo($done['handle'], CURLINFO_HTTP_CODE);
				if(isset(self::$curlHeaderInfo[(string) $done['handle']]))
				{
					$header = array_merge($header, self::$curlHeaderInfo[(string) $done['handle']]);
				}

				$responses[$map[(string) $done['handle']]] = array('error' => $error, 'header' => $header, 'html' => $results);
				unset($header);

				// remove the curl handle that just completed
				curl_multi_remove_handle($queue, $done['handle']);
				curl_close($done['handle']);
			}

			// Block for data in / output; error handling is done by curl_multi_exec
			if ($active > 0)
			{
				curl_multi_select($queue, 0.5);
			}

		} while($active);

		curl_multi_close($queue);
		self::$curlHeaderInfo = null;

		$result = array();
		foreach($urls as $key => $url)
		{
			$result[$key] = $responses[$urls[$key]['url']];
		}

		unset($queue);
		unset($map);
		unset($responses);
		unset($urls);

		return $result;
	}

	/**
	 * 请求链接
	 * @param $urls array('url' => '', 'ssl' => false, 'timeout' => 1, 'proxy_type' => 'http', 'proxy_ip' => '192.168.1.100', 'proxy_port' => 8080, 'useragent' => '', 'cookie' => '', 'fake_ip' => '', 'referer' => '', 'httpheader' => array(''), 'data' => array('loginname' => 'aa', 'password' => 'bb'))
	 * @param $params
	 */
	public static function request($url)
	{
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url['url']);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
		curl_setopt($ch, CURLOPT_AUTOREFERER, true);
	  	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	  	curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'self::requestHeader');

	  	if(isset($url['ssl']) || (substr($url['url'], 0, 5) == 'https'))
	  	{
	  		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
			curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
	  	}

		if(isset($url['data']))
		{
			curl_setopt($ch, CURLOPT_POST, true);

			if(is_array($url['data']))
			{
				if($url['data']['upload_file'])
				{
					unset($url['data']['upload_file']);
					curl_setopt($ch, CURLOPT_POSTFIELDS, $url['data']);
				}
				else
				{
					unset($url['data']['upload_file']);
					curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($url['data']));
				}
			}
			else
			{
				curl_setopt($ch, CURLOPT_POSTFIELDS, $url['data']);
			}
		}

	  	if(isset($url['timeout']) && !empty($url['timeout']))
	  	{
	  		curl_setopt($ch, CURLOPT_TIMEOUT, $url['timeout']);
	  	}
	  	else
	  	{
	  		curl_setopt($ch, CURLOPT_TIMEOUT, 5);
	  	}

		if(isset($url['proxy_type'])  && !empty($url['proxy_type']) && isset($url['proxy_ip']) && !empty($url['proxy_ip']) && isset($url['proxy_port']) && !empty($url['proxy_port']))
		{
			if($url['proxy_type'] == 'http')
			{
				curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
			}
			else
			{
				curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
			}

			curl_setopt($ch, CURLOPT_PROXY, $url['proxy_ip']);
			curl_setopt($ch, CURLOPT_PROXYPORT, $url['proxy_port']);
		}

		if(isset($url['useragent']) && !empty($url['useragent']))
		{
			curl_setopt($ch, CURLOPT_USERAGENT, $url['useragent']);
		}
		else
		{
			curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)');
		}

		if(isset($url['cookie']) && !empty($url['cookie']))
		{
			curl_setopt($ch, CURLOPT_COOKIE, $url['cookie']);
		}

		if(isset($url['httpheader']) && !empty($url['httpheader']))
		{
			curl_setopt($ch, CURLOPT_HTTPHEADER, $url['httpheader']);
		}

		if(isset($url['referer']) && !empty($url['referer']))
		{
			curl_setopt($ch, CURLOPT_REFERER, $url['referer']);
		}

		if(!empty($url['fake_ip']))
		{
			curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:' . $url['fake_ip'], 'CLIENT-IP:' . $url['fake_ip']));
		}

		$html = curl_exec($ch);

		$result['error'] = curl_error($ch);
		$result['header']['code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		$result['header'] = array_merge($result['header'], self::$curlHeaderInfo[(string) $ch]);
		$result['html'] = $html;

		curl_close($ch);
		self::$curlHeaderInfo = null;
		unset($html);

		return $result;
	}

	/**
	 * 供requestGet及requestPost使用的得到头信息函数
	 */
	private static function requestHeader($ch, $header)
	{
		preg_match("#([^:]+):\s*(.*)#", $header, $matches);
		if(!empty($matches))
		{
			if(trim(strtolower($matches[1])) == 'set-cookie')
			{
				self::$curlHeaderInfo[(string) $ch][trim(strtolower($matches[1]))][] = trim($matches[2]);
			}
			else
			{
				self::$curlHeaderInfo[(string) $ch][trim(strtolower($matches[1]))] = trim($matches[2]);
			}
		}

		unset($matches);

		return strlen($header);
	}
}
?>


转载于:https://my.oschina.net/u/151766/blog/287410

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值