LXSEA */ namespace xin\helper; /** * 系统相关操作工具类 * * @package xin\helper */ final class Server{ /** * 获取客户的IP地址 * * @return string */ public static function getRemoteIp(){ if(isset($_SERVER ["HTTP_X_FORWARDED_FOR"])){ $ip = $_SERVER ["HTTP_X_FORWARDED_FOR"]; }elseif(isset($_SERVER ["HTTP_CLIENT_IP"])){ $ip = $_SERVER ["HTTP_CLIENT_IP"]; }elseif(isset($_SERVER ["REMOTE_ADDR"])){ $ip = $_SERVER ["REMOTE_ADDR"]; }else{ $ip = "0.0.0.0"; } return $ip; } /** * 获取客户端端口号 * * @return int */ public static function getRemotePort(){ $port = 0; if(isset($_SERVER ["REMOTE_PORT"])){ $port = $_SERVER ["REMOTE_PORT"]; }elseif(isset($_COOKIE ["REMOTE_PORT"])){ $port = $_COOKIE ["REMOTE_PORT"]; }elseif(isset($_POST ["REMOTE_PORT"])){ $port = $_POST ["REMOTE_PORT"]; }elseif(isset($_GET ["REMOTE_PORT"])){ $port = $_GET ["REMOTE_PORT"]; } return $port; } /** * 获取主机名称 * * @return string */ public static function getHostName(){ return $_SERVER ['SERVER_NAME']; } /** * 获取当前访问的文件 * * @return string */ public static function getExecuteFile(){ $urls = explode('/', strip_tags($_SERVER ['REQUEST_URI']), 2); return count($urls) > 1 ? $urls [1] : ''; } /** * 获取所有请求头信息 * * @return array */ public static function getAllHeader(){ $headers = []; foreach($_SERVER as $key => $value){ if('HTTP_' == substr($key, 0, 5)){ $headers [str_replace('_', '-', substr($key, 5))] = $value; } } if(isset ($_SERVER ['PHP_AUTH_DIGEST'])){ $headers ['AUTHORIZATION'] = $_SERVER ['PHP_AUTH_DIGEST']; }elseif(isset ($_SERVER ['PHP_AUTH_USER']) && isset ($_SERVER ['PHP_AUTH_PW'])){ $headers ['AUTHORIZATION'] = base64_encode($_SERVER ['PHP_AUTH_USER'].':'.$_SERVER ['PHP_AUTH_PW']); } if(isset ($_SERVER ['CONTENT_LENGTH'])){ $headers ['CONTENT-LENGTH'] = $_SERVER ['CONTENT_LENGTH']; } if(isset ($_SERVER ['CONTENT_TYPE'])){ $headers ['CONTENT-TYPE'] = $_SERVER ['CONTENT_TYPE']; } return $headers; } /** * 获取终端名称 * * @param bool $isVersion 是否要返回版本号 * @return string */ public static function getClientName($isVersion = true){ // 获取客户端版本信息 $getVersion = function($str, $checkname){ $pos = strpos($str, $checkname); $len = strpos($str, ';', $pos); $len = $len ? $len - $pos : strlen($str) - $pos; return substr($str, $pos, $len); }; $info = self::getClientInfo(); if(strpos($info ['info_str'], 'windows phone') !== false){ if(!$isVersion) return "windows phone"; return $getVersion($info ['info_str'], 'windows phone'); }else{ if(strpos($info ['info_str'], 'windows') !== false){ if(!$isVersion) return "windows"; return $getVersion($info ['info_str'], 'windows'); }elseif(strpos($info ['info_str'], 'android') !== false){ if(!$isVersion) return "android"; return $getVersion($info ['info_str'], 'android'); }elseif(strpos($info ['info_str'], 'iphone') !== false){ if(!$isVersion) return "iphone"; return $getVersion($info ['info_str'], 'iphone'); }elseif(strpos($info ['info_str'], 'mac os') !== false){ if(!$isVersion) return "mac os"; return $getVersion($info ['info_str'], 'mac os'); }elseif(is_array($info ['info'])){ if($isVersion == false){ $info ['info'] = explode(" ", $info ['info'] [0]); } return $info ['info'] [0]; }else{ return "other"; } } } /** * 获取终端信息 * * @return array */ public static function getClientInfo(){ $info = []; $user_agent = strtolower($_SERVER ['HTTP_USER_AGENT']); $firstSpilt = strpos($user_agent, ')'); $user_agent2 = substr($user_agent, 0, $firstSpilt); $user_agents = explode(" ", $user_agent2, 2); $mozilla = explode("/", $user_agents [0], 2); $info [$mozilla [0]] = $mozilla [1]; $user_agent2 = substr($user_agents [1], 1); $info ['info'] = explode("; ", $user_agent2); $info ['info_str'] = $user_agent2; // applewebkit/537.36 $user_agent2 = substr($user_agent, $firstSpilt + 2, strlen($user_agent) - $firstSpilt); $user_agent2 = preg_replace('/(\(.*\))\s/', "", $user_agent2); $user_agents = explode(" ", $user_agent2); $len = count($user_agents); for($i = 0; $i < $len; $i++){ $temps = explode("/", $user_agents [$i], 2); $info [$temps [0]] = $temps [1]; } return $info; } /** * 获取序列化参数 * * @param bool $isExportStyle * @return string */ public static function serializeParams($isExportStyle = true){ if($isExportStyle){ return var_export([ "GET" => $_GET, "POST" => $_POST, "COOKIE" => $_COOKIE, "SESSION" => $_SESSION, "SERVER" => $_SERVER, ], true); } return "[GET=".http_build_query($_GET)."]," ."[POST=".http_build_query($_POST, false)."],". "[COOKIE=".http_build_query($_COOKIE, false)."],". "[SESSION=".http_build_query($_SESSION, false)."],". "[SERVER=".http_build_query($_SERVER, false)."]"; } /** * 是否移动端访问访问 * * @return bool */ public static function isMobileVisit(){ // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if(isset ($_SERVER['HTTP_X_WAP_PROFILE'])){ return true; } // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息 if(isset ($_SERVER['HTTP_VIA'])){ // 找不到为flase,否则为true return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false; } // 脑残法,判断手机发送的客户端标志,兼容性有待提高 if(isset ($_SERVER['HTTP_USER_AGENT'])){ $clientkeywords = [ 'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile', ]; // 从HTTP_USER_AGENT中查找手机浏览器的关键字 if(preg_match("/(".implode('|', $clientkeywords).")/i", strtolower($_SERVER['HTTP_USER_AGENT']))){ return true; } } // 协议法,因为有可能不准确,放到最后判断 if(isset ($_SERVER['HTTP_ACCEPT'])){ // 如果只支持wml并且不支持html那一定是移动设备 // 如果支持wml和html但是wml在html之前则是移动设备 if((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))){ return true; } } return false; } /** * 调用客户端回掉函数 * * @param $callback * @param $param */ public static function flushScriptCall($callback, $param = ''){ if(is_string($param)){ $param = '"'.addslashes($param).'"'; }else{ if(is_array($param)){ if(key($param) == 0){ $tmpStr = ''; $len = count($param); for($i = 0; $i < $len; $i++){ if($i != 0) $tmpStr .= ","; $tmpStr .= '"'.addslashes($param).'"'; } $param = $tmpStr; }else{ $param = json_encode($param); } } } self::flushScript("{$callback} ( ".json_encode($param)." )"); } /** * 发送到客户端script * * @param string $script */ public static function flushScript($script){ echo ""; flush(); ob_flush(); } /** * URL重定向 * * @param string $url 重定向的URL地址 * @param integer $time 重定向的等待时间(秒) * @param string $msg 重定向前的提示信息 * @return void */ public static function redirect($url, $time = 0, $msg = ''){ //多行URL地址支持 $url = str_replace(["\n", "\r"], '', $url); if(empty($msg)){ $msg = "系统将在{$time}秒之后自动跳转到{$url}!"; } if(!headers_sent()){ // redirect if(0 === $time){ header('Location: '.$url); }else{ header("refresh:{$time};url={$url}"); echo($msg); } exit(); }else{ $str = ""; if(0 != $time){ $str .= $msg; } exit($str); } } }