<?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