= $strlength) { return $str; } elseif ($length < 0) { $length = $strlength + $length; if ($length < 0) { $length = $strlength; } } if (function_exists('mb_substr')) { $newstr = mb_substr($str, 0, $length, EC_CHARSET); } elseif (function_exists('iconv_substr')) { $newstr = iconv_substr($str, 0, $length, EC_CHARSET); } else { //$newstr = trim_right(substr($str, 0, $length)); $newstr = substr($str, 0, $length); } if ($append && $str != $newstr) { $newstr .= '...'; } return $newstr; } /** * 获得用户的真实IP地址 * * @access public * @return string */ function real_ip() { static $realip = NULL; if ($realip !== NULL) { return $realip; } if (isset($_SERVER)) { if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $realip=$_SERVER['HTTP_CF_CONNECTING_IP']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { // $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */ /* foreach ($arr AS $ip) { $ip = trim($ip); if ($ip != 'unknown') { $realip = $ip; break; } } */ $realip=$_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $realip = $_SERVER['HTTP_CLIENT_IP']; } else { if (isset($_SERVER['REMOTE_ADDR'])) { $realip = $_SERVER['REMOTE_ADDR']; } else { $realip = '0.0.0.0'; } } } else { if (getenv('HTTP_X_FORWARDED_FOR')) { $realip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('HTTP_CLIENT_IP')) { $realip = getenv('HTTP_CLIENT_IP'); } else { $realip = getenv('REMOTE_ADDR'); } } // preg_match("/[\d\.]{7,15}/", $realip, $onlineip); // $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0'; return $realip; } /** * 计算字符串的长度(汉字按照两个字符计算) * * @param string $str 字符串 * * @return int */ function str_len($str) { $length = strlen(preg_replace('/[\x00-\x7F]/', '', $str)); if ($length) { return strlen($str) - $length + intval($length / 3) * 2; } else { return strlen($str); } } /** * 获得用户操作系统的换行符 * * @access public * @return string */ function get_crlf() { /* LF (Line Feed, 0x0A, \N) 和 CR(Carriage Return, 0x0D, \R) */ if (stristr($_SERVER['HTTP_USER_AGENT'], 'Win')) { $the_crlf = '\r\n'; } elseif (stristr($_SERVER['HTTP_USER_AGENT'], 'Mac')) { $the_crlf = '\r'; // for old MAC OS } else { $the_crlf = '\n'; } return $the_crlf; } /** * 邮件发送 * * @param: $name[string] 接收人姓名 * @param: $email[string] 接收人邮件地址 * @param: $subject[string] 邮件标题 * @param: $content[string] 邮件内容 * @param: $type[int] 0 普通邮件, 1 HTML邮件 * @param: $notification[bool] true 要求回执, false 不用回执 * * @return boolean */ function send_mail($name, $email, $subject, $content, $type = 0, $notification=false) { /* 如果邮件编码不是EC_CHARSET,创建字符集转换对象,转换编码 */ if ($GLOBALS['_CFG']['mail_charset'] != EC_CHARSET) { $name = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $name); $subject = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $subject); $content = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $content); $shop_name = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $GLOBALS['_CFG']['shop_name']); } $charset = $GLOBALS['_CFG']['mail_charset']; /** * 使用mail函数发送邮件 */ if ($GLOBALS['_CFG']['mail_service'] == 0 && function_exists('mail')) { /* 邮件的头部信息 */ $content_type = ($type == 0) ? 'Content-Type: text/plain; charset=' . $charset : 'Content-Type: text/html; charset=' . $charset; $headers = array(); $headers[] = 'From: "' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>'; $headers[] = $content_type . '; format=flowed'; if ($notification) { $headers[] = 'Disposition-Notification-To: ' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>'; } $res = @mail($email, '=?' . $charset . '?B?' . base64_encode($subject) . '?=', $content, implode("\r\n", $headers)); if (!$res) { $GLOBALS['err'] ->add($GLOBALS['_LANG']['sendemail_false']); return false; } else { return true; } } /** * 使用smtp服务发送邮件 */ else { /* 邮件的头部信息 */ $content_type = ($type == 0) ? 'Content-Type: text/plain; charset=' . $charset : 'Content-Type: text/html; charset=' . $charset; $content = base64_encode($content); $headers = array(); $headers[] = 'Date: ' . gmdate('D, j M Y H:i:s') . ' +0000'; $headers[] = 'To: "' . '=?' . $charset . '?B?' . base64_encode($name) . '?=' . '" <' . $email. '>'; $headers[] = 'From: "' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>'; $headers[] = 'Subject: ' . '=?' . $charset . '?B?' . base64_encode($subject) . '?='; $headers[] = $content_type . '; format=flowed'; $headers[] = 'Content-Transfer-Encoding: base64'; $headers[] = 'Content-Disposition: inline'; if ($notification) { $headers[] = 'Disposition-Notification-To: ' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>'; } /* 获得邮件服务器的参数设置 */ $params['host'] = $GLOBALS['_CFG']['smtp_host']; $params['port'] = $GLOBALS['_CFG']['smtp_port']; $params['user'] = $GLOBALS['_CFG']['smtp_user']; $params['pass'] = $GLOBALS['_CFG']['smtp_pass']; if (empty($params['host']) || empty($params['port'])) { // 如果没有设置主机和端口直接返回 false $GLOBALS['err'] ->add($GLOBALS['_LANG']['smtp_setting_error']); return false; } else { // 发送邮件 if (!function_exists('fsockopen')) { //如果fsockopen被禁用,直接返回 $GLOBALS['err']->add($GLOBALS['_LANG']['disabled_fsockopen']); return false; } include_once(ROOT_PATH . 'includes/cls_smtp.php'); static $smtp; $send_params['recipients'] = $email; $send_params['headers'] = $headers; $send_params['from'] = $GLOBALS['_CFG']['smtp_mail']; $send_params['body'] = $content; if (!isset($smtp)) { $smtp = new smtp($params); } if ($smtp->connect() && $smtp->send($send_params)) { return true; } else { $err_msg = $smtp->error_msg(); if (empty($err_msg)) { $GLOBALS['err']->add('Unknown Error'); } else { if (strpos($err_msg, 'Failed to connect to server') !== false) { $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['smtp_connect_failure'], $params['host'] . ':' . $params['port'])); } else if (strpos($err_msg, 'AUTH command failed') !== false) { $GLOBALS['err']->add($GLOBALS['_LANG']['smtp_login_failure']); } elseif (strpos($err_msg, 'bad sequence of commands') !== false) { $GLOBALS['err']->add($GLOBALS['_LANG']['smtp_refuse']); } else { $GLOBALS['err']->add($err_msg); } } return false; } } } } /** * 获得服务器上的 GD 版本 * * @access public * @return int 可能的值为0,1,2 */ function gd_version() { include_once(ROOT_PATH . 'includes/cls_image.php'); $cls_gile = new cls_image(); return $cls_gile->gd_version(); } if (!function_exists('file_get_contents')) { /** * 如果系统不存在file_get_contents函数则声明该函数 * * @access public * @param string $file * @return mix */ function file_get_contents($file) { if (($fp = @fopen($file, 'rb')) === false) { return false; } else { $fsize = @filesize($file); if ($fsize) { $contents = fread($fp, $fsize); } else { $contents = ''; } fclose($fp); return $contents; } } } if (!function_exists('file_put_contents')) { define('FILE_APPEND', 'FILE_APPEND'); /** * 如果系统不存在file_put_contents函数则声明该函数 * * @access public * @param string $file * @param mix $data * @return int */ function file_put_contents($file, $data, $flags = '') { $contents = (is_array($data)) ? implode('', $data) : $data; if ($flags == 'FILE_APPEND') { $mode = 'ab+'; } else { $mode = 'wb'; } if (($fp = @fopen($file, $mode)) === false) { return false; } else { $bytes = fwrite($fp, $contents); fclose($fp); return $bytes; } } } if (!function_exists('floatval')) { /** * 如果系统不存在 floatval 函数则声明该函数 * * @access public * @param mix $n * @return float */ function floatval($n) { return (float) $n; } } /** * 文件或目录权限检查函数 * * @access public * @param string $file_path 文件路径 * @param bool $rename_prv 是否在检查修改权限时检查执行rename()函数的权限 * * @return int 返回值的取值范围为{0 <= x <= 15},每个值表示的含义可由四位二进制数组合推出。 * 返回值在二进制计数法中,四位由高到低分别代表 * 可执行rename()函数权限、可对文件追加内容权限、可写入文件权限、可读取文件权限。 */ function file_mode_info($file_path) { echo 'ddd'; /* 如果不存在,则不可读、不可写、不可改 */ if (!file_exists($file_path)) { echo 'ccc'; return false; } echo 'bbb'; $mark = 0; if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { /* 测试文件 */ $test_file = $file_path . '/cf_test.txt'; /* 如果是目录 */ if (is_dir($file_path)) { /* 检查目录是否可读 */ $dir = @opendir($file_path); if ($dir === false) { return $mark; //如果目录打开失败,直接返回目录不可修改、不可写、不可读 } if (@readdir($dir) !== false) { $mark ^= 1; //目录可读 001,目录不可读 000 } @closedir($dir); /* 检查目录是否可写 */ $fp = @fopen($test_file, 'wb'); if ($fp === false) { return $mark; //如果目录中的文件创建失败,返回不可写。 } if (@fwrite($fp, 'directory access testing.') !== false) { $mark ^= 2; //目录可写可读011,目录可写不可读 010 } @fclose($fp); @unlink($test_file); /* 检查目录是否可修改 */ $fp = @fopen($test_file, 'ab+'); if ($fp === false) { return $mark; } if (@fwrite($fp, "modify test.\r\n") !== false) { $mark ^= 4; } @fclose($fp); /* 检查目录下是否有执行rename()函数的权限 */ if (@rename($test_file, $test_file) !== false) { $mark ^= 8; } @unlink($test_file); } /* 如果是文件 */ elseif (is_file($file_path)) { /* 以读方式打开 */ $fp = @fopen($file_path, 'rb'); if ($fp) { $mark ^= 1; //可读 001 } @fclose($fp); /* 试着修改文件 */ $fp = @fopen($file_path, 'ab+'); if ($fp && @fwrite($fp, '') !== false) { $mark ^= 6; //可修改可写可读 111,不可修改可写可读011... } @fclose($fp); /* 检查目录下是否有执行rename()函数的权限 */ if (@rename($test_file, $test_file) !== false) { $mark ^= 8; } } } else { if (@is_readable($file_path)) { $mark ^= 1; } if (@is_writable($file_path)) { $mark ^= 14; } } return $mark; } function log_write($arg, $file = '', $line = '') { if ((DEBUG_MODE & 4) != 4) { return; } $str = "\r\n-- ". date('Y-m-d H:i:s'). " --------------------------------------------------------------\r\n"; $str .= "FILE: $file\r\nLINE: $line\r\n"; if (is_array($arg)) { $str .= '$arg = array('; foreach ($arg AS $val) { foreach ($val AS $key => $list) { $str .= "'$key' => '$list'\r\n"; } } $str .= ")\r\n"; } else { $str .= $arg; } file_put_contents(ROOT_PATH . DATA_DIR . '/log.txt', $str); } /** * 检查目标文件夹是否存在,如果不存在则自动创建该目录 * * @access public * @param string folder 目录路径。不能使用相对于网站根目录的URL * * @return bool */ function make_dir($folder) { $reval = false; if (!file_exists($folder)) { /* 如果目录不存在则尝试创建该目录 */ @umask(0); /* 将目录路径拆分成数组 */ preg_match_all('/([^\/]*)\/?/i', $folder, $atmp); /* 如果第一个字符为/则当作物理路径处理 */ $base = ($atmp[0][0] == '/') ? '/' : ''; /* 遍历包含路径信息的数组 */ foreach ($atmp[1] AS $val) { if ('' != $val) { $base .= $val; if ('..' == $val || '.' == $val) { /* 如果目录为.或者..则直接补/继续下一个循环 */ $base .= '/'; continue; } } else { continue; } $base .= '/'; if (!file_exists($base)) { /* 尝试创建目录,如果创建失败则继续循环 */ if (@mkdir(rtrim($base, '/'), 0777)) { @chmod($base, 0777); $reval = true; } } } } else { /* 路径已经存在。返回该路径是不是一个目录 */ $reval = is_dir($folder); } clearstatcache(); return $reval; } /** * 获得系统是否启用了 gzip * * @access public * * @return boolean */ function gzip_enabled() { static $enabled_gzip = NULL; if ($enabled_gzip === NULL) { $enabled_gzip = ($GLOBALS['_CFG']['enable_gzip'] && function_exists('ob_gzhandler')); } return $enabled_gzip; } /** * 递归方式的对变量中的特殊字符进行转义 * * @access public * @param mix $value * * @return mix */ function addslashes_deep($value) { if (empty($value)) { return $value; } else { return is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value); } } /** * 将对象成员变量或者数组的特殊字符进行转义 * * @access public * @param mix $obj 对象或者数组 * @author Xuan Yan * * @return mix 对象或者数组 */ function addslashes_deep_obj($obj) { if (is_object($obj) == true) { foreach ($obj AS $key => $val) { $obj->$key = addslashes_deep($val); } } else { $obj = addslashes_deep($obj); } return $obj; } /** * 递归方式的对变量中的特殊字符去除转义 * * @access public * @param mix $value * * @return mix */ function stripslashes_deep($value) { if (empty($value)) { return $value; } else { return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); } } /** * 将一个字串中含有全角的数字字符、字母、空格或'%+-()'字符转换为相应半角字符 * * @access public * @param string $str 待转换字串 * * @return string $str 处理后字串 */ function make_semiangle($str) { $arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 'y' => 'y', 'z' => 'z', '(' => '(', ')' => ')', '〔' => '[', '〕' => ']', '【' => '[', '】' => ']', '〖' => '[', '〗' => ']', '“' => '[', '”' => ']', '‘' => '[', '’' => ']', '{' => '{', '}' => '}', '《' => '<', '》' => '>', '%' => '%', '+' => '+', '—' => '-', '-' => '-', '~' => '-', ':' => ':', '。' => '.', '、' => ',', ',' => '.', '、' => '.', ';' => ',', '?' => '?', '!' => '!', '…' => '-', '‖' => '|', '”' => '"', '’' => '`', '‘' => '`', '|' => '|', '〃' => '"', ' ' => ' '); return strtr($str, $arr); } /** * 过滤用户输入的基本数据,防止script攻击 * * @access public * @return string */ function compile_str($str) { $arr = array('<' => '<', '>' => '>','"'=>'”',"'"=>'’'); return strtr($str, $arr); } /** * 检查文件类型 * * @access public * @param string filename 文件名 * @param string realname 真实文件名 * @param string limit_ext_types 允许的文件类型 * @return string */ function check_file_type($filename, $realname = '', $limit_ext_types = '') { if ($realname) { $extname = strtolower(substr($realname, strrpos($realname, '.') + 1)); } else { $extname = strtolower(substr($filename, strrpos($filename, '.') + 1)); } if ($limit_ext_types && stristr($limit_ext_types, '|' . $extname . '|') === false) { return ''; } $str = $format = ''; $file = @fopen($filename, 'rb'); if ($file) { $str = @fread($file, 0x400); // 读取前 1024 个字节 @fclose($file); } else { if (stristr($filename, ROOT_PATH) === false) { if ($extname == 'jpg' || $extname == 'jpeg' || $extname == 'gif' || $extname == 'png' || $extname == 'doc' || $extname == 'xls' || $extname == 'txt' || $extname == 'zip' || $extname == 'rar' || $extname == 'ppt' || $extname == 'pdf' || $extname == 'rm' || $extname == 'mid' || $extname == 'wav' || $extname == 'bmp' || $extname == 'swf' || $extname == 'chm' || $extname == 'sql' || $extname == 'cert'|| $extname == 'pptx' || $extname == 'xlsx' || $extname == 'docx') { $format = $extname; } } else { return ''; } } if ($format == '' && strlen($str) >= 2 ) { if (substr($str, 0, 4) == 'MThd' && $extname != 'txt') { $format = 'mid'; } elseif (substr($str, 0, 4) == 'RIFF' && $extname == 'wav') { $format = 'wav'; } elseif (substr($str ,0, 3) == "\xFF\xD8\xFF") { $format = 'jpg'; } elseif (substr($str ,0, 4) == 'GIF8' && $extname != 'txt') { $format = 'gif'; } elseif (substr($str ,0, 8) == "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") { $format = 'png'; } elseif (substr($str ,0, 2) == 'BM' && $extname != 'txt') { $format = 'bmp'; } elseif ((substr($str ,0, 3) == 'CWS' || substr($str ,0, 3) == 'FWS') && $extname != 'txt') { $format = 'swf'; } elseif (substr($str ,0, 4) == "\xD0\xCF\x11\xE0") { // D0CF11E == DOCFILE == Microsoft Office Document if (substr($str,0x200,4) == "\xEC\xA5\xC1\x00" || $extname == 'doc') { $format = 'doc'; } elseif (substr($str,0x200,2) == "\x09\x08" || $extname == 'xls') { $format = 'xls'; } elseif (substr($str,0x200,4) == "\xFD\xFF\xFF\xFF" || $extname == 'ppt') { $format = 'ppt'; } } elseif (substr($str ,0, 4) == "PK\x03\x04") { if (substr($str,0x200,4) == "\xEC\xA5\xC1\x00" || $extname == 'docx') { $format = 'docx'; } elseif (substr($str,0x200,2) == "\x09\x08" || $extname == 'xlsx') { $format = 'xlsx'; } elseif (substr($str,0x200,4) == "\xFD\xFF\xFF\xFF" || $extname == 'pptx') { $format = 'pptx'; }else { $format = 'zip'; } } elseif (substr($str ,0, 4) == 'Rar!' && $extname != 'txt') { $format = 'rar'; } elseif (substr($str ,0, 4) == "\x25PDF") { $format = 'pdf'; } elseif (substr($str ,0, 3) == "\x30\x82\x0A") { $format = 'cert'; } elseif (substr($str ,0, 4) == 'ITSF' && $extname != 'txt') { $format = 'chm'; } elseif (substr($str ,0, 4) == "\x2ERMF") { $format = 'rm'; } elseif ($extname == 'sql') { $format = 'sql'; } elseif ($extname == 'txt') { $format = 'txt'; } } if ($limit_ext_types && stristr($limit_ext_types, '|' . $format . '|') === false) { $format = ''; } return $format; } /** * 对 MYSQL LIKE 的内容进行转义 * * @access public * @param string string 内容 * @return string */ function mysql_like_quote($str) { return strtr($str, array("\\\\" => "\\\\\\\\", '_' => '\_', '%' => '\%', "\'" => "\\\\\'")); } /** * 获取服务器的ip * * @access public * * @return string **/ function real_server_ip() { static $serverip = NULL; if ($serverip !== NULL) { return $serverip; } if (isset($_SERVER)) { if (isset($_SERVER['SERVER_ADDR'])) { $serverip = $_SERVER['SERVER_ADDR']; } else { $serverip = '0.0.0.0'; } } else { $serverip = getenv('SERVER_ADDR'); } return $serverip; } /** * 自定义 header 函数,用于过滤可能出现的安全隐患 * * @param string string 内容 * * @return void **/ function ecs_header($string, $replace = true, $http_response_code = 0) { if (strpos($string, '../upgrade/index.php') === 0) { echo ''; } $string = str_replace(array("\r", "\n"), array('', ''), $string); if (preg_match('/^\s*location:/is', $string)) { @header($string . "\n", $replace); exit(); } if (empty($http_response_code) || PHP_VERSION < '4.3') { @header($string, $replace); } else { @header($string, $replace, $http_response_code); } } function ecs_iconv($source_lang, $target_lang, $source_string = '') { static $chs = NULL; /* 如果字符串为空或者字符串不需要转换,直接返回 */ if ($source_lang == $target_lang || $source_string == '' || preg_match("/[\x80-\xFF]+/", $source_string) == 0) { return $source_string; } if ($chs === NULL) { require_once(ROOT_PATH . 'includes/cls_iconv.php'); $chs = new Chinese(ROOT_PATH); } return $chs->Convert($source_lang, $target_lang, $source_string); } function ecs_geoip($ip) { $return = ''; if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) { $iparray = explode('.', $ip); if($iparray[0] == 10 || $iparray[0] == 127 || ($iparray[0] == 192 && $iparray[1] == 168) || ($iparray[0] == 172 && ($iparray[1] >= 16 && $iparray[1] <= 31))) { $return = 'LAN'; } elseif($iparray[0] > 255 || $iparray[1] > 255 || $iparray[2] > 255 || $iparray[3] > 255) { $return = 'Invalid IP Address'; } else { $tinyipfile = ROOT_PATH . 'includes/codetable/ipdata.dat'; //ipdata.dat-纯真网络IP库 $fullipfile = ROOT_PATH . 'includes/codetable/ipdata2.dat'; //ipdata.dat-纯真网络IP库 if(@file_exists($tinyipfile)||@file_exists($fullipfile)) { $return = mb_convert_encoding(convertip_tiny($ip, $tinyipfile), "UTF-8"); // $return = convertip_full($ip, $fulipfile); } } } return $return; } function convertip_full($ip, $ipdatafile) { if(!$fd = @fopen($ipdatafile, 'rb')) { return '- Invalid IP data file'; } $ip = explode('.', $ip); $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3]; if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ) return; @$ipbegin = implode('', unpack('L', $DataBegin)); if($ipbegin < 0) $ipbegin += pow(2, 32); @$ipend = implode('', unpack('L', $DataEnd)); if($ipend < 0) $ipend += pow(2, 32); $ipAllNum = ($ipend - $ipbegin) / 7 + 1; $BeginNum = $ip2num = $ip1num = 0; $ipAddr1 = $ipAddr2 = ''; $EndNum = $ipAllNum; while($ip1num > $ipNum || $ip2num < $ipNum) { $Middle= intval(($EndNum + $BeginNum) / 2); fseek($fd, $ipbegin + 7 * $Middle); $ipData1 = fread($fd, 4); if(strlen($ipData1) < 4) { fclose($fd); return '- System Error'; } $ip1num = implode('', unpack('L', $ipData1)); if($ip1num < 0) $ip1num += pow(2, 32); if($ip1num > $ipNum) { $EndNum = $Middle; continue; } $DataSeek = fread($fd, 3); if(strlen($DataSeek) < 3) { fclose($fd); return '- System Error'; } $DataSeek = implode('', unpack('L', $DataSeek.chr(0))); fseek($fd, $DataSeek); $ipData2 = fread($fd, 4); if(strlen($ipData2) < 4) { fclose($fd); return '- System Error'; } $ip2num = implode('', unpack('L', $ipData2)); if($ip2num < 0) $ip2num += pow(2, 32); if($ip2num < $ipNum) { if($Middle == $BeginNum) { fclose($fd); return '- Unknown'; } $BeginNum = $Middle; } } $ipFlag = fread($fd, 1); if($ipFlag == chr(1)) { $ipSeek = fread($fd, 3); if(strlen($ipSeek) < 3) { fclose($fd); return '- System Error'; } $ipSeek = implode('', unpack('L', $ipSeek.chr(0))); fseek($fd, $ipSeek); $ipFlag = fread($fd, 1); } if($ipFlag == chr(2)) { $AddrSeek = fread($fd, 3); if(strlen($AddrSeek) < 3) { fclose($fd); return '- System Error'; } $ipFlag = fread($fd, 1); if($ipFlag == chr(2)) { $AddrSeek2 = fread($fd, 3); if(strlen($AddrSeek2) < 3) { fclose($fd); return '- System Error'; } $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0))); fseek($fd, $AddrSeek2); } else { fseek($fd, -1, SEEK_CUR); } while(($char = fread($fd, 1)) != chr(0)) $ipAddr2 .= $char; $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0))); fseek($fd, $AddrSeek); while(($char = fread($fd, 1)) != chr(0)) $ipAddr1 .= $char; } else { fseek($fd, -1, SEEK_CUR); while(($char = fread($fd, 1)) != chr(0)) $ipAddr1 .= $char; $ipFlag = fread($fd, 1); if($ipFlag == chr(2)) { $AddrSeek2 = fread($fd, 3); if(strlen($AddrSeek2) < 3) { fclose($fd); return '- System Error'; } $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0))); fseek($fd, $AddrSeek2); } else { fseek($fd, -1, SEEK_CUR); } while(($char = fread($fd, 1)) != chr(0)) $ipAddr2 .= $char; } fclose($fd); if(preg_match('/http/i', $ipAddr2)) { $ipAddr2 = ''; } $ipaddr = "$ipAddr1 $ipAddr2"; $ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr); $ipaddr = preg_replace('/^\s*/is', '', $ipaddr); $ipaddr = preg_replace('/\s*$/is', '', $ipaddr); if(preg_match('/http/i', $ipaddr) || $ipaddr == '') { $ipaddr = '- Unknown'; } return iconv('gb2312', 'utf-8', $ipaddr); } function convertip_tiny($ip, $ipdatafile) { static $fp = NULL, $offset = array(), $index = NULL; $ipdot = explode('.', $ip); $ip = pack('N', ip2long($ip)); $ipdot[0] = (int)$ipdot[0]; $ipdot[1] = (int)$ipdot[1]; if($fp === NULL && $fp = @fopen($ipdatafile, 'rb')) { $offset = @unpack('Nlen', @fread($fp, 4)); $index = @fread($fp, $offset['len'] - 4); } elseif($fp == FALSE) { return 'Invalid IP data file'; } $length = $offset['len'] - 1028; $start = @unpack('Vlen', $index[$ipdot[0] * 4] . $index[$ipdot[0] * 4 + 1] . $index[$ipdot[0] * 4 + 2] . $index[$ipdot[0] * 4 + 3]); for ($start = $start['len'] * 8 + 1024; $start < $length; $start += 8) { if ($index{$start} . $index{$start + 1} . $index{$start + 2} . $index{$start + 3} >= $ip) { $index_offset = @unpack('Vlen', $index{$start + 4} . $index{$start + 5} . $index{$start + 6} . "\x0"); $index_length = @unpack('Clen', $index{$start + 7}); break; } } @fseek($fp, $offset['len'] + $index_offset['len'] - 1024); if($index_length['len']) { return @fread($fp, $index_length['len']); } else { return 'Unknown'; } } /** * 去除字符串右侧可能出现的乱码 * * @param string $str 字符串 * * @return string */ function trim_right($str) { $len = strlen($str); /* 为空或单个字符直接返回 */ if ($len == 0 || ord($str{$len-1}) < 127) { return $str; } /* 有前导字符的直接把前导字符去掉 */ if (ord($str{$len-1}) >= 192) { return substr($str, 0, $len-1); } /* 有非独立的字符,先把非独立字符去掉,再验证非独立的字符是不是一个完整的字,不是连原来前导字符也截取掉 */ $r_len = strlen(rtrim($str, "\x80..\xBF")); if ($r_len == 0 || ord($str{$r_len-1}) < 127) { return sub_str($str, 0, $r_len); } $as_num = ord(~$str{$r_len -1}); if ($as_num > (1<<(6 + $r_len - $len))) { return $str; } else { return substr($str, 0, $r_len-1); } } /** * 将上传文件转移到指定位置 * * @param string $file_name * @param string $target_name * @return blog */ function move_upload_file($file_name, $target_name = '') { if (function_exists("move_uploaded_file")) { if (move_uploaded_file($file_name, $target_name)) { @chmod($target_name,0755); return true; } else if (copy($file_name, $target_name)) { @chmod($target_name,0755); return true; } } elseif (copy($file_name, $target_name)) { @chmod($target_name,0755); return true; } return false; } /** * 将JSON传递的参数转码 * * @param string $str * @return string */ function json_str_iconv($str) { if (EC_CHARSET != 'utf-8') { if (is_string($str)) { return addslashes(stripslashes(ecs_iconv('utf-8', EC_CHARSET, $str))); } elseif (is_array($str)) { foreach ($str as $key => $value) { $str[$key] = json_str_iconv($value); } return $str; } elseif (is_object($str)) { foreach ($str as $key => $value) { $str->$key = json_str_iconv($value); } return $str; } else { return $str; } } return $str; } /** * 循环转码成utf8内容 * * @param string $str * @return string */ function to_utf8_iconv($str) { if (EC_CHARSET != 'utf-8') { if (is_string($str)) { return ecs_iconv(EC_CHARSET, 'utf-8', $str); } elseif (is_array($str)) { foreach ($str as $key => $value) { $str[$key] = to_utf8_iconv($value); } return $str; } elseif (is_object($str)) { foreach ($str as $key => $value) { $str->$key = to_utf8_iconv($value); } return $str; } else { return $str; } } return $str; } /** * 获取文件后缀名,并判断是否合法 * * @param string $file_name * @param array $allow_type * @return blob */ function get_file_suffix($file_name, $allow_type = array()) { $file_name_arr = explode('.', $file_name); $file_suffix = strtolower(array_pop($file_name_arr)); if (empty($allow_type)) { return $file_suffix; } else { if (in_array($file_suffix, $allow_type)) { return true; } else { return false; } } } /** * 读结果缓存文件 * * @params string $cache_name * * @return array $data */ function read_static_cache($cache_name) { if ((DEBUG_MODE & 2) == 2) { return false; } static $result = array(); if (!empty($result[$cache_name])) { return $result[$cache_name]; } $cache_file_path = ROOT_PATH . '/temp/static_caches/' . $cache_name . '.php'; if (file_exists($cache_file_path)) { include_once($cache_file_path); $result[$cache_name] = $data; return $result[$cache_name]; } else { return false; } } /** * 写结果缓存文件 * * @params string $cache_name * @params string $caches * * @return */ function write_static_cache($cache_name, $caches) { if ((DEBUG_MODE & 2) == 2) { return false; } $cache_file_path = ROOT_PATH . '/temp/static_caches/' . $cache_name . '.php'; $content = ""; file_put_contents($cache_file_path, $content, LOCK_EX); } function strtonum($strnum){ return str_replace( ',', '', $strnum ); } function hb_uuid() { return sprintf('%04x%04x%04x%04x%04x%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); } ?>