常用的common.php备忘记录

<?php
date_default_timezone_set('PRC'); 
//MD5加密
function getMD5($dataStr)
{
	$sign = md5($dataStr);
	return $sign;
}

//转换编码
function conv($str)
{
	$str = iconv("GB2312","UTF-8//IGNORE",$str);
	return $str;
}

// 获取当前时间戳(精确到毫秒):microtime_float()
function microtime_float()
{
	list($usec, $sec) = explode(" ", microtime());
	return ((float)$usec + (float)$sec);
}
 
// 格式化时间戳,精确到毫秒,x代表毫秒
// 时间戳转换时间:microtime_format('Y年m月d日 H时i分s秒 x毫秒', 1270626578.66000000) 或 microtime_format('Y-m-d H:i:s:x', microtime_float())
function microtime_format($tag, $time)
{
	list($usec, $sec) = explode(".", $time);
	$date = date($tag,$usec);
	return str_replace('x', $sec, $date);
}

// 获取当前日期年月日秒毫秒
function wholeNowTime()
{
	return microtime_format('Y-m-d H:i:s:x', microtime_float());
}

// 毫秒转日期
function microdate_format($time)
{
	return date('Y-m-d H:i:s', $time / 1000);
}

// 秒转日期
function time_format($time)
{	
	return date('Y-m-d H:i:s', $time);
}

// 带日期等统一输出的打印
function echo_info($echoinfo)
{
	echo wholeNowTime()." ".$echoinfo.PHP_EOL;
}

// 获得毫秒
function getMillisecond()
{
	list($t1, $t2) = explode(' ', microtime());
	return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
}

// 获取正确的时间日期字符数字,去除其他
function getRightDateTime($time_info)
{
	$time_arr = preg_split('/[- :]/',$time_info);
	$new_time_arr = array();
    foreach($time_arr as $tm)
    {
        if (preg_match('|(\d+)|', $tm, $r)) {
			//echo $r[1];
			$new_time_arr[] = $r[1];
		}
	}

	if(!empty($new_time_arr) && count($new_time_arr) == 6) {
		$time_info = $new_time_arr[0].'-'.$new_time_arr[1].'-'.$new_time_arr[2].' '.$new_time_arr[3].':'.$new_time_arr[4].':'.$new_time_arr[5];
	}
	
	return $time_info;
} 

//返回日期差
function diffdays($startdate, $enddate)
{
    $startdate_sec = strtotime($startdate);
    $enddate_sec = strtotime($enddate);
    $days = round(($enddate_sec - $startdate_sec) / 3600 / 24);
    return $days; //days为得到的天数;
}

//两个日期之间组成数组
function getdaybydate($startdate, $enddate)
{
    $stime = strtotime($startdate);
    $etime = strtotime($enddate);
    $datearr = [];
    while ($stime <= $etime)
    {
        $datearr[] = date('Y-m-d', $stime); //得到dataarr的日期数组。
        $stime = $stime + 86400;
    }
    return $datearr;
}

//生成MD5字符串
function getSign($dataStr)
{
	// 用于签名的密钥
	$secret_key = "123456";
	$sign = md5($dataStr.$secret_key);
	return $sign;
}

//随机数
function generate_code($length = 6) 
{
    return rand(pow(10, ($length - 1)), pow(10, $length) - 1);
}

//将中文字符串分割为数组
function mb_str_split($str){
    return preg_split('/(?<!^)(?!$)/u', $str );
}

//Unicode中文的截取处理:1个中文=2个字节
function substrUnicodeLen($dataStr, $needLen) {
	$cind = 0;
	$sLen = strlen($dataStr);
	$newStr = '';
	for ($i = 0; $i < $sLen; $i++) {
		$ch = substr($dataStr, $cind, 1);
		$vch = ord($ch);

		if ($vch < 192) { //如果为英文则取1个字节
			if ($needLen < 1) {
				break;
			}
            		$newStr .= $ch;
            		$cind++;
			$needLen -= 1;
        	} elseif($vch < 224) {
			if ($needLen < 2) {
				break;
			}

            		$newStr .= substr($dataStr, $cind, 2);
            		$cind += 2;
			$needLen -= 2;
        	} else {
			if ($needLen < 2) {
				break;
			}
            		$newStr .= substr($dataStr, $cind, 3);
            		$cind += 3;
			$needLen -= 2;
        	}
	}
	return $newStr;
}

//处理不为数字的字符串
function convStringZero($str) {
	if(is_numeric($str)) {
		$intstr = $str;
	} else {
		$intstr = "0";
	}
	return $intstr;	
}

// 过滤特定字符
function strFilter($str)
{
	$filter_str = array('`','·','~','!','!','@','#','$','¥','%','^','……','&','*','(',')','(',')','-','_','——','+'
		,'=','|','\\','[',']','【','】','{','}',';',';',':',':','\'','"','“','”',',',',','<','>','《','》','.','。'
		,'/','、','?','?');
	foreach($filter_str as $key => $value)
	{
		$str = str_replace($value, '', $str);
	}
    return trim($str);
}

// 入库过滤
function str_to_mysqldb_filter($str)
{
	$filter_str = array('`','·','~','!','@','#','$','¥','%','^','……','&nbsp;','&#12288;','*','(',')','——',
		'+','<span>','</span>','&12288','&amp;','&amp','amp','&quot;','&quot','quot','&lt;','&gt;','&lt','&gt'
		,'\\','[',']','{','}',';',':','\'','"',',','<br>','<br />','<p>','</p>','【【','】】','<','>','br','.',
		'/','?',' ',' ','\r','\n','\r\n');
	foreach($filter_str as $key => $value)
	{
		$str = str_replace($value, '', $str);
	}
    return trim($str);
}

/**
 * 字符串转Unicode(10进制)
 * $str 原始中文字符串
 * $encoding 原始字符串的编码,默认GBK
 * $prefix 编码后的前缀,默认"&#"
 * $postfix 编码后的后缀,默认";"
 */
function unicode_encode_str($str, $encoding = 'GBK', $prefix = '&#', $postfix = ';') {
    $str = iconv($encoding, 'UCS-2', $str);
    $arrstr = str_split($str, 2);
    $unistr = '';
    for($i = 0, $len = count($arrstr); $i < $len; $i++) {
        $dec = hexdec(bin2hex($arrstr[$i]));
        $unistr .= $prefix . $dec . $postfix;
    } 
    return $unistr;
} 
 
/**
 * Unicode(10进制)转字符串
 * $str Unicode编码后的字符串
 * $decoding 原始字符串的编码,默认GBK
 * $prefix 编码字符串的前缀,默认"&#"
 * $postfix 编码字符串的后缀,默认";"
 */
function unicode_decode_str($unistr, $encoding = 'GBK', $prefix = '&#', $postfix = ';') {
    $arruni = explode($prefix, $unistr);
    $unistr = '';
    for($i = 1, $len = count($arruni); $i < $len; $i++) {
        if (strlen($postfix) > 0) {
            $arruni[$i] = substr($arruni[$i], 0, strlen($arruni[$i]) - strlen($postfix));
        } 
        $temp = intval($arruni[$i]);
        $unistr .= ($temp < 256) ? chr(0) . chr($temp) : chr($temp / 256) . chr($temp % 256);
    } 
    return iconv('UCS-2', $encoding, $unistr);
}

//获得真实IP地址
function get_real_ip() {
	if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
		$ip = getenv("HTTP_CLIENT_IP"); 
	else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) 
		$ip = getenv("HTTP_X_FORWARDED_FOR"); 
	else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
		$ip = getenv("REMOTE_ADDR"); 
	else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
		$ip = $_SERVER['REMOTE_ADDR']; 
	else 
		$ip = "unknown"; 
	return($ip); 
}

//判断处理IP地址
function is_ip($str)
{
	$ip = explode(".", $str);
	if (count($ip)<4 || count($ip)>4) return 0;
	foreach($ip as $ip_addr) {
		if(!is_numeric($ip_addr)) return 0;
		if($ip_addr<0 || $ip_addr>255) return 0;
	}
	return 1;
}

//获得本机真实IP地址
function getLocalIP()
{
	$preg = "/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\Z/";

	//获取操作系统为win2000/xp、win7的本机IP真实地址
	exec("ipconfig", $out, $stats);
	if (!empty($out))
	{
		foreach ($out AS $row)
		{
			if (strstr($row, "IP") && strstr($row, ":") && !strstr($row, "IPv6"))
			{
    				$tmpIp = explode(":", $row);
				if (preg_match($preg, trim($tmpIp[1])))
				{
					return trim($tmpIp[1]);
 				}
			}
		}
	}

	//获取操作系统为linux类型的本机IP真实地址
	exec("ifconfig", $out, $stats);
	if (!empty($out))
	{
		if (isset($out[1]) && strstr($out[1], 'addr:'))
		{
			$tmpArray = explode(":", $out[1]);
			$tmpIp = explode(" ", $tmpArray[1]);
			if (preg_match($preg, trim($tmpIp[0])))
			{
				return trim($tmpIp[0]);
			}
		}
	}

	return '127.0.0.1';
}

// 移除数组中某个元素,数组的索引值也变化
// 注意:此方法删除指定值之后,键值重新排位
function array_remove_new($arr, $key)
{
	if ($key !== false) {
		array_splice($arr, $key, 1);
	}
	return $arr;
}


// $array为操作的数组,$k为要删除的值,数组的索引值不变化
// 注意:此方法删除指定值之后,其他项的键与值都与原来的保持一样
function array_remove_key($array, $k)
{
	foreach($array as $key=>$value)
	{    
		if($k == $key){       //删除键为$k的项        
			unset($array[$key]);    //unset()函数做删除操作        
		} 
	}
	return $array;
}

// 展示分页数据,带上分页标识page和总页数,每页展示数由服务端决定
function perPageData($rediskey, $totalcount, $page, $asc=true)
{
	// 分页参数:记录总数、分页数、每页记录数、第几页
	global $pagecount;	//每页记录数

	// 客户端带上的分页标识如果为0或没带为空时,服务端默认下第一页。	
	if(empty($page)) $page = 0;
	
	$pagesize = ceil($totalcount / $pagecount);	//取整,分页数

	$min = 0 + $page * $pagecount;

	$max = ($page + 1) * $pagecount - 1;

	$perpagedata = array();
	if($asc) {
		$perpagedata = getRank($rediskey, $min, $max);
	} else {
		$perpagedata = getSortRank($rediskey, $min, $max);
	}

	return $perpagedata;
}

// 展示分页数据,客户端决定每页显示数、从第几个数据开始
function limitSkipData($rediskey, $limit, $index, $asc=true)
{
	//echo_info($rediskey.', '.$limit.', '.$skip);
	//limit=20,请求:0-19,20-39,40-59		
	$min = $index * $limit;
	$max = $min + $limit - 1;

	$limitskipdata = array();
	if($asc) {
		$limitskipdata = getRank($rediskey, $min, $max);
	} else {
		$limitskipdata = getSortRank($rediskey, $min, $max);
	}	

	return $limitskipdata;
}

//通用处理判断JSON结构体中是否存在对应的键值项
function getReqData($data, $field)
{
	if(!empty($data) && is_array($data) && array_key_exists($field, $data)) {
		$reqobj = $data[$field];
	} else {
		$reqobj = '';
	}

	return $reqobj;
}

//入库MySQL中时处理
function opToSqlData($data, $field)
{
	$sql_str = getReqData($data, $field);
	if(!empty($sql_str)) {
		$sql_str = str_replace('\\', '', $sql_str);
		$sql_str = str_replace('\'', '', $sql_str);
	}

	return $sql_str;
}

//字符串转Unicode(16进制),将内容进行UNICODE编码,编码后的内容格式:\u56fe\u7247 (原始:图片)  
function unicode_encode($name)  
{  
    $name = iconv('UTF-8', 'UCS-2', $name);  
    $len = strlen($name);  
    $str = '';  
    for ($i = 0; $i < $len - 1; $i = $i + 2)  
    {  
        $c = $name[$i];  
        $c2 = $name[$i + 1];  
        if (ord($c) > 0)  
        {    // 两个字节的文字  
            $str .= '\u'.base_convert(ord($c), 10, 16).base_convert(ord($c2), 10, 16);  
        }  
        else  
        {  
            $str .= $c2;  
        }  
    }  
    return $str;  
}  
  
// Unicode(16进制)转字符串,将UNICODE编码后的内容进行解码,编码后的内容格式:\u56fe\u7247 (原始:图片)  
function unicode_decode($name)  
{  
    // 转换编码,将Unicode编码转换成可以浏览的utf-8编码  
    $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';  
    preg_match_all($pattern, $name, $matches);  
    if (!empty($matches))  
    {  
        $name = '';  
        for ($j = 0; $j < count($matches[0]); $j++)  
        {  
            $str = $matches[0][$j];  
            if (strpos($str, '\\u') === 0)  
            {  
                $code = base_convert(substr($str, 2, 2), 16, 10);  
                $code2 = base_convert(substr($str, 4), 16, 10);  
                $c = chr($code).chr($code2);  
                $c = iconv('UCS-2', 'UTF-8', $c);  
                $name .= $c;  
            }  
            else  
            {  
                $name .= $str;  
            }  
        }  
    }  
    return $name;  
} 

//追加关联数组与缓存库
//说明:$a_id为A主键字段,$b_id为B字段,$a_key为A的JSON主键名,$b_ids为B的JSON数组名
function doAndLinkRedis($rediskey, $a_id, $b_id, $a_key, $b_ids)
{
	//以A为主键,将B用数组形式存储
	//先取出原库信息,再追加数组
	$ap_obj = getObjInfo($rediskey, $a_id);
	if(!empty($ap_obj) && array_key_exists($b_ids, $ap_obj) && !empty($ap_obj[$b_ids])) {
		$ap_obj[$b_ids][] = $b_id;
		
	} else {
		$pids_arr = array();
		$pids_arr[] = $b_id;
		$ap_obj = array(
			$a_key => $a_id,
			$b_ids => $pids_arr
		);
	}
	//数组去重
	$ap_obj[$b_ids] = array_unique($ap_obj[$b_ids]);
	setObjInfo($rediskey, $a_id, $ap_obj);
}

//移除关联数组记录
//说明:$a_id为A主键字段,$b_id为B字段,$a_key为A的JSON主键名,$b_ids为B的JSON数组名
function removeLinkRedis($rediskey, $a_id, $b_id, $a_key, $b_ids)
{
	//以A为主键,将B用数组形式存储
	//先取出原库信息,再追加数组
	$ap_obj = getObjInfo($rediskey, $a_id);
	
	if(!empty($ap_obj) && array_key_exists($b_ids, $ap_obj) && !empty($ap_obj[$b_ids])) {
		$ap_obj[$b_ids] = delByValue($ap_obj[$b_ids], $b_id);		
	}
	setObjInfo($rediskey, $a_id, $ap_obj);
}

//foreach遍历后unset删除,这种方法也是最容易想到的方法  
function delByValue($arr, $value)
{  
    if(!is_array($arr)){  
        return $arr;  
    }  
    foreach($arr as $k=>$v){  
        if($v == $value){  
            unset($arr[$k]);  
        }  
    }  
    return $arr;  
}  

//根据value值返回text文本
function getTextByValue($infoarr, $value)
{
    $text = "";
    foreach($infoarr as $val)
    {
      if($val["value"] == $value) {
        $text = $val["text"];
        break;
      }
    }

    return $text;
}

//JSON decode判定处理
function jsonDecodeArray($arr)
{
	if(!is_array($arr) && !empty($arr)) {
		$arr = json_decode($arr, true);
	}
	return $arr;
}

//是否存在于数组中
function isexistarray($arr, $val_str)
{
	$isexist = false;
	foreach($arr as $aval)
	{
		if($aval == $val_str) {
			$isexist = true;
		}
	}
	return $isexist;
}

//$str为要进行截取的字符串,$length为截取长度(汉字算一个字,字母算半个字)
function strCut($str, $length)
{
	$str = trim($str);
	$string = "";
	if(strlen($str) > $length)
	{
		for($i = 0 ; $i<$length ; $i++)
		{
			if(ord($str) > 127)
			{
				$string .= $str[$i] . $str[$i+1] . $str[$i+2];
				$i = $i + 2;
			}
			else
			{
				$string .= $str[$i];
			}
		}
		$string .= "...";
		return $string;
	}
	return $str;
}

//请求URL
function curlgets($url) 
{
    $timeout = 30;
    
    $ch = curl_init();
    $header = array(
        'agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
    );
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_USERAGENT, json_encode($header));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $page_content = curl_exec($ch);
    curl_close($ch);
    return $page_content;
}

//参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$cookies,参数5:gzip解压缩处理
function curl_request($url,$post='',$cookie='', $returnCookie=0, $gzip=false)
{
   $curl = curl_init();
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36');
   curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
   if($gzip) curl_setopt($curl, CURLOPT_ENCODING, "gzip"); // 关键在这里
   curl_setopt($curl, CURLOPT_REFERER, $url);
   if($post) {
	   curl_setopt($curl, CURLOPT_POST, 1);
	   curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
   }

   if($cookie) {
	   curl_setopt($curl, CURLOPT_COOKIE, $cookie);
   }

   curl_setopt($curl, CURLOPT_HEADER, $returnCookie);
   curl_setopt($curl, CURLOPT_TIMEOUT, 10);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   $data = curl_exec($curl);

   if (curl_errno($curl)) {
	   return curl_error($curl);
   }

   curl_close($curl);

   if($returnCookie) {
	   list($header, $body) = explode("\r\n\r\n", $data, 2);
	   preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);
	   $info['cookie']  = substr($matches[1][0], 1);
	   $info['content'] = $body;
	   return $info;
   } else {
	   return $data;
   }
}

//SSL请求
function curlSSLRequest($url, $postData = '', $timeOut = 10, $httpHeader = array())
{
	$handle = curl_init();
	curl_setopt($handle, CURLOPT_URL, $url);

	if ($httpHeader) {
		curl_setopt($handle, CURLOPT_HTTPHEADER, $httpHeader);
	}

	curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($handle, CURLOPT_HEADER, 0);
	curl_setopt($handle, CURLOPT_TIMEOUT, $timeOut);
	curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36');        
	curl_setopt($handle, CURLOPT_ENCODING, 'gzip,deflate,sdch');

	if (!empty($postData)) {
		curl_setopt($handle, CURLOPT_POST, 1);
		curl_setopt($handle, CURLOPT_POSTFIELDS, $postData);
	}

	$result['response'] = curl_exec($handle);
	$result['httpStatus'] = curl_getinfo($handle, CURLINFO_HTTP_CODE);
	$result['fullInfo'] = curl_getinfo($handle);
	$result['errorMsg'] = '';
	$result['errorNo'] = 0;
	if (curl_errno($handle)) {
		$result['errorMsg'] = curl_error($handle);
		$result['errorNo'] = curl_errno($handle);
	}

	curl_close($handle);

	return $result;
}

//SSL方式用法:echo $result['response'];

//多线程多URL地址同时抓取
//输入参数为urls数组,返回结果为对应的网页源码数组
function curl_multi_html($urls)
{
	if (!is_array($urls) or count($urls) == 0) {  
        return false;  
    }   
    $num=count($urls);  
    $curl = $curl2 = $text = array();  
    $handle = curl_multi_init();  
    function createCh($url) {  
        $ch = curl_init();  
        curl_setopt ($ch, CURLOPT_URL, $url);  
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko');//设置头部  
        curl_setopt ($ch, CURLOPT_REFERER, $url); //设置来源  
        curl_setopt ($ch, CURLOPT_ENCODING, "gzip"); // 编码压缩  
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);  
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);//是否采集301、302之后的页面  
        curl_setopt ($ch, CURLOPT_MAXREDIRS, 5);//查找次数,防止查找太深  
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在         
        curl_setopt ($ch, CURLOPT_TIMEOUT, 20);  
        curl_setopt ($ch, CURLOPT_HEADER, 0);//输出头部  
        return $ch;  
    }  
    foreach($urls as $k=>$v){  
        $url=$urls[$k];  
        $curl[$k] = createCh($url);  
        curl_multi_add_handle ($handle,$curl[$k]);  
    }  
    $active = null;  
    do {  
        $mrc = curl_multi_exec($handle, $active);  
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);  
  
    while ($active && $mrc == CURLM_OK) {  
        if (curl_multi_select($handle) != -1) {  
            usleep(100);  
        }  
        do {  
            $mrc = curl_multi_exec($handle, $active);  
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);  
    }   
  
    foreach ($curl as $k => $v) {  
        if (curl_error($curl[$k]) == "") {  
            $text[$k] = (string) curl_multi_getcontent($curl[$k]);   
        }  
        curl_multi_remove_handle($handle, $curl[$k]);  
        curl_close($curl[$k]);  
    }   
    curl_multi_close($handle);  
    return $text;
}

// 获取HTML内容
function getHtml($url, $charset='utf-8')
{
   $curl = curl_init();
   //curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:192.168.168.1', 'CLIENT-IP:192.168.168.1'));//IP
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_REFERER, "");  //来路
   $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31';
   curl_setopt($curl, CURLOPT_USERAGENT, $user_agent);
   // 只需返回HTTP header
   // curl_setopt($curl, CURLOPT_HEADER, 1);
   // 页面内容我们并不需要
   // curl_setopt($curl, CURLOPT_NOBODY, 1);
   // 返回结果,而不是输出它
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   $html = curl_exec($curl);
   //$info = curl_getinfo($curl);
   //echo var_dump($info);
   if ($html === false) {
	   //echo "cURL Error: " . curl_error($ch);
	   return '';
   }

   curl_close($curl);

   if ($charset != 'utf-8')
   {
	   $html = iconv($charset, "UTF-8", $html);
   }

   return $html;
}



/**
* Post 方式请求网页数据
*
* @param string $url     网页地址
* @prarm string $host    主机
* @param string $session 会话值
* @prarm string $type    类型(POST、GET)
* @prarm string $port    端口
* @prarm string $data    数据
*/
function getPageConent( $url, $host, $session = "", $type = "POST", $port = "", $data = "")
{
	if( empty($port)) $port = 80;     
	 
	/* 请求数据 */
	$post_data = $data;
	$lenght = strlen($post_data);
	
	$headers  = "{$type} {$url} HTTP/1.1\r\n";
	$headers .= "Accept: * /*\r\n";
	$headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
	$headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; CIBA; .NET CLR 4.0.20506)\r\n";
	if($session != "") $headers .= "Cookie:JSESSIONID={$session}\r\n";
	$headers .= "Host: {$host}:{$port}\r\n";
	$headers .= "Content-Length: {$lenght}\r\n";
	$headers .= "Connection: Close\r\n\r\n";
	$headers .= $post_data;
 
	if( $fp = fsockopen( $host, $port, $errno, $errstr, 100)) {
		fwrite($fp, $headers);        
		  $header   = fread($fp, 1024);    
		  $content  = fread($fp, 1024);    
		  $content .= fread($fp, 1024);
		  $content .= fread($fp, 1024);
		  $content .= fread($fp, 1024);
		fclose($fp);        
	}

	if( $data != "") {
		//echo $headers;
		//echo "<hr />";
		//echo $header;
		//echo "<hr />";
		return $content;
		//echo "<hr />";
		exit;
	} else {
		return $content;
	}
}

function curldata($url)
{
   //访问外部URL获取返回数据
   $ch = curl_init();
   curl_setopt ($ch, CURLOPT_URL, $url);
   curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
   curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
   $str = curl_exec($ch); 
	   
   return $str;
}

// 模拟发送GET数据
function http_get_data($url)
{  
	$ch = curl_init(); 
 	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');  
 	curl_setopt($ch, CURLOPT_URL, $url);  
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(  
 		'Content-Type: application/json; charset=utf-8')
	);
	//ob_start();  
	curl_exec($ch);  
	$return_content = ob_get_contents();  
 	//ob_end_clean();  
	  
	$return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
	curl_close($ch);

 	return array($return_code, $return_content);  
} 

// 模拟发送POST数据
function http_post_data($url, $data_string)
{  
	$ch = curl_init(); 
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
 	curl_setopt($ch, CURLOPT_URL, $url);  
 	curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);  
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(  
 		'Content-Type: application/json; charset=utf-8',  
		'Content-Length: ' . strlen($data_string))  
	);
	//ob_start();  
	curl_exec($ch);  
	$return_content = ob_get_contents();  
 	//ob_end_clean();
  
	$return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
	curl_close($ch);

 	return array($return_code, $return_content);  
} 

// 根据开始字符串和结束字符串截取需要的采集内容数据
function strCutByStr(&$str, $findStart, $findEnd = false, $encoding = 'utf-8')
{  
   if(is_array($findStart)) {  
	   if(count($findStart) === count($findEnd)) {  
		   foreach($findStart as $k => $v){  
			   if(($result = strCutByStr($str, $v, $findEnd[$k], $encoding)) !== false){  
				   return $result;  
			   }  
		   }  
		   return false;  
	   } else {  
		   return false;  
	   }  
   }  
	   
   if(($start = mb_strpos($str, $findStart, 0, $encoding)) === false){  
	   return false;  
   }  
	   
   $start += mb_strlen($findStart, $encoding);  
	   
   if($findEnd === false){  
	   return mb_substr($str, $start, NULL, $encoding);  
   }  
	   
   if(($length = mb_strpos($str, $findEnd, $start, $encoding)) === false){  
	   return false;  
   }  
	   
   return mb_substr($str, $start, $length - $start, $encoding);  
}  


//模拟表单POST请求
function curl_form($post_data,$sumbit_url,$http_url)
{        
   //初始化
   $ch = curl_init();
   //设置变量
   curl_setopt($ch, CURLOPT_URL, $sumbit_url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);//执行结果是否被返回,0是返回,1是不返回
   curl_setopt($ch, CURLOPT_HEADER, 0);//参数设置,是否显示头部信息,1为显示,0为不显示
   curl_setopt($ch, CURLOPT_REFERER, $http_url); 
   //表单数据,是正规的表单设置值为非0
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_TIMEOUT, 1);//设置curl执行超时时间最大是多少
   //使用数组提供post数据时,CURL组件大概是为了兼容@filename这种上传文件的写法,
   //默认把content_type设为了multipart/form-data。虽然对于大多数web服务器并
   //没有影响,但是还是有少部分服务器不兼容。本文得出的结论是,在没有需要上传文件的
   //情况下,尽量对post提交的数据进行http_build_query,然后发送出去,能实现更好的兼容性,更小的请求数据包。
   curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
   //执行并获取结果
   ob_start();  
   curl_exec($ch);  
   $return_content = ob_get_contents();  
   ob_end_clean();  

   $return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
   return array($return_code, $return_content);
}

function removeBom($contents){
	$charset[1]=substr($contents,0,1);
	$charset[2]=substr($contents,1,1);
	$charset[3]=substr($contents,2,1);
	if(ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191){
		return substr($contents,3);
	}
	return $contents;
}

function format_ErrorJson($data,$quotes_key=false)
{
   $con = str_replace('\'', '"', $data);//替换单引号为双引号
   $con = str_replace(array('\\"'), array('<|YH|>'), $con);//替换
   $con = preg_replace('/(\w+):[ {]?((?<YinHao>"?).*?\k<YinHao>[,}]?)/is', '"$1": $2', $con);//若键名没有双引号则添加
   if ($quotes_key) {
	   $con = preg_replace('/("\w+"): ?([^"\s]+)([,}])[\s]?/is', '$1: "$2"$3', $con);//给键值添加双引号
   }
   $con = str_replace(array('<|YH|>'), array('\\"'), $con);//还原替换
   return $con;
}

//获取Location真实URL地址
function curlpost_header($url, $refererurl, $post_data) 
{
    $timeout = 30;
    
    $ch = curl_init();
    $header = array(
        'agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
    );
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    // 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
    curl_setopt($ch, CURLOPT_HEADER, true);
    // 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_USERAGENT, json_encode($header));
    curl_setopt($ch, CURLOPT_REFERER, $refererurl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    // 不用 POST 方式请求, 意思就是通过 GET 请求
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
    $page_content = curl_exec($ch);
    // 获得响应结果里的:头大小
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    // 获取Location真实URL地址
    $location_realurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    // 根据头大小去获取头信息内容
    $header = substr($page_content, 0, $headerSize);
    //echo $header;
    curl_close($ch);
    return $location_realurl;
}

//获取Location真实URL地址
function curlget_header($url, $refererurl) 
{
    $timeout = 30;
    
    $ch = curl_init();
    $header = array(
        'agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
    );
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    // 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
    curl_setopt($ch, CURLOPT_HEADER, true);
    // 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_USERAGENT, json_encode($header));
    curl_setopt($ch, CURLOPT_REFERER, $refererurl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    // 不用 POST 方式请求, 意思就是通过 GET 请求
    curl_setopt($ch, CURLOPT_POST, false);
    $page_content = curl_exec($ch);
    // 获得响应结果里的:头大小
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    // 获取Location真实URL地址
    $location_realurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    // 根据头大小去获取头信息内容
    $header = substr($page_content, 0, $headerSize);
    //echo $header;
    curl_close($ch);
    return $location_realurl;
}

//获取本地服务器外网IP
function getLocalServerOuterIP()
{
   $serveip = curl_request('http://members.3322.org/dyndns/getip');
   $serveip = str_replace('\n', '', $serveip);
   return trim($serveip);
}

//获取本地服务器外网地区与IP
function getLocalServerAreaIP()
{
   $citySN_arr = array();
   $areaip = curl_request('http://pv.sohu.com/cityjson');
   
   if(!empty($areaip)) {        
	   $areaip = str_replace(';', '', $areaip);
	   //var returnCitySN = {"cip": "122.235.184.30", "cid": "330100", "cname": "浙江省杭州市"};
	   $area_arr = explode('{', $areaip);
	   $returnCitySN = '{'. $area_arr[1];
	   $returnCitySN = iconv('GBK', 'UTF-8', $returnCitySN);
	   $citySN_arr = json_decode($returnCitySN, true);
   }

   return $citySN_arr;
}

//循环删除目录和文件函数  
function delDirAndFile($dirName)  
{
    if($handle = opendir("$dirName")) {  
        while(false !== ($item = readdir($handle))) {  
            if($item != "." && $item != "..") {  
                if(is_dir("$dirName/$item")) {  
                    delDirAndFile("$dirName/$item");  
                } else {  
                    if(unlink("$dirName/$item")) echo "Del File Success: $dirName/$item <br />\n";  
                }  
            }  
        }  
        closedir( $handle);  
        if(rmdir($dirName)) echo "Del Dir Success: $dirName <br />\n";  
    }  
}

//循环目录下的所有文件,不删除目录
function delFileUnderDir($dirName, $prefilename=null)  
{  
    if($handle = opendir("$dirName")) {  
        while(false !== ($item = readdir($handle))) {  
            if($item != "." && $item != "..") {  
                if(is_dir("$dirName/$item")) {  
                    delFileUnderDir("$dirName/$item");  
                } else {  
                    if(!empty($prefilename)) {
                        if(stripos("$dirName/$item", $prefilename)) {
                            if(unlink("$dirName/$item")) echo "Del File Success: $dirName/$item \n";  
                        } 
                    } else {
                        if(unlink("$dirName/$item")) echo "Del File Success: $dirName/$item \n";
                    }                                       
                }
            }
        }  
        closedir($handle);  
    }  
}

$DS_TIME_TimeSign = array(
	array('yyyy','<#0x01#>','Y'),
	array('yy','<#0x02#>','y'),
	array('MM','<#0x03#>','F'),
	array('mm','<#0x04#>','m'),
	array('M','<#0x05#>','M'),
	array('m','<#0x06#>','n'),
	array('t','<#0x07#>','t'),
	array('dd','<#0x08#>','d'),
	array('d','<#0x09#>','j'),
	array('DD','<#0x10#>','l'),
	array('D','<#0x11#>','jS'),
	array('z','<#0x12#>','z'),
	array('W','<#0x13#>','W'),
	array('HH','<#0x14#>','H'),
	array('hh','<#0x15#>','h'),
	array('H','<#0x16#>','G'),
	array('h','<#0x17#>','g'),
	array('ii','<#0x18#>','i'),
	array('ss','<#0x19#>','s'),
	array('c','<#0x20#>','c'),
	array('r','<#0x21#>','r'),
	array('a','<#0x22#>','a'),
	array('A','<#0x23#>','A')
);

$DS_TIME_SpecialChars = array(
	'd','D','j','l','N','S','w','z',
	'W','F','m','M','n','t','L','o',
	'Y','y','a','A','B','g','G','h',
	'H','i','s','e','I','O','T','Z',
	'c','r','U'
);

/*
yyyy = 四位数年份
yy = 两位数年份

MM = 月份,英文完整单词
mm = 月份,数字,自动补0
M = 月份,英文缩写单词
m = 月份,数字,不补0
t = 月份天数,数字

dd = 日期,数字,自动补0
d = 日期,数字,不补0
DD = 星期,完整单词
D = 日期,数字,带st、nd、rd或th后缀
z = 天,数字,表示本年第几天

W = 周,数字,表示本年第几周

a = am或pm
A = AM或PM
HH = 小时,数字,24小时制,自动补0
hh = 小时,数字,12小时制,自动补0
H = 小时,数字,24小时制,不补0
h = 小时,数字,12小时制,不补0

ii = 分钟,数字,自动补0
ss = 秒钟,数字,自动补0

c = ISO 8601 格式的日期
r = RFC 822 格式的日期 

*/

function PHPTimeFormatFromCommon($TimeFormat)
{
	global $DS_TIME_TimeSign,$DS_TIME_SpecialChars;
	foreach ($DS_TIME_TimeSign as $Item)
	{
		$TimeFormat = str_replace($Item[0],$Item[1],$TimeFormat);
	}

	foreach ($DS_TIME_SpecialChars as $Item)
	{
		$TimeFormat = str_replace($Item,'//'.$Item,$TimeFormat);
	}

	foreach ($DS_TIME_TimeSign as $Item)
	{
		$TimeFormat = str_replace($Item[1],$Item[2],$TimeFormat);
	}

	return $TimeFormat;
}

function PHPTimeFormatToCommon($TimeFormat)
{
	global $DS_TIME_TimeSign,$DS_TIME_SpecialChars;
	foreach ($DS_TIME_TimeSign as $Item)
	{
		$TimeFormat = str_replace($Item[2],$Item[1],$TimeFormat);
	}

	foreach ($DS_TIME_SpecialChars as $Item)
	{
		$TimeFormat = str_replace('//'.$Item,$Item, $TimeFormat);
	}

	foreach ($DS_TIME_TimeSign as $Item)
	{
		$TimeFormat = str_replace($Item[1],$Item[0],$TimeFormat);
	}
	
	return $TimeFormat;
}

//将秒数转化为时分秒
function secondsToHour($seconds)
{  
	if(intval($seconds) < 60)  
		$tt ="00:00:".sprintf("%02d",intval($seconds%60));  

	if(intval($seconds) >=60)
	{  
		$h =sprintf("%02d",intval($seconds/60));  
		$s =sprintf("%02d",intval($seconds%60));  
		if($s == 60){  
			$s = sprintf("%02d",0);  
			++$h;  
		}  
		$t = "00";  
		if($h == 60){  
			$h = sprintf("%02d",0);  
			++$t;  
		}  
		if($t){  
			$t  = sprintf("%02d",$t);  
		}  
		$tt= $t.":".$h.":".$s;  
	}  

	if(intval($seconds)>=60*60)
	{  
		$t= sprintf("%02d",intval($seconds/3600));  
		$h =sprintf("%02d",intval($seconds/60)-$t*60);  
		$s =sprintf("%02d",intval($seconds%60));  
		if($s == 60){  
			$s = sprintf("%02d",0);  
			++$h;  
		}  
		if($h == 60){  
			$h = sprintf("%02d",0);  
			++$t;  
		}  
		if($t){  
			$t  = sprintf("%02d",$t);  
		}  
		$tt= $t.":".$h.":".$s;  
	}  
	
	return $tt;  
}

//检测图片地址
function checkImgUrl($img_url)
{
    $is_exist = false;
    $responseHead = response_info($img_url);

    $content_type = get_response_content_type($responseHead);
    if(strstr($content_type, 'image')) {
        $is_exist = true;
    }

    return $is_exist;
}

//返回响应的Content-Type
function get_response_content_type($responseHead)
{
    $content_type = 'image/jpeg';//text/html
    $headArr = explode("\r\n", $responseHead);
    foreach ($headArr as $loop)
    {
        if(strpos($loop, "Content-Type") !== false) {
            $loop = str_replace(':', '', $loop);
            $content_type = trim(substr($loop, 12));            
            break;
        }
    }

    return $content_type;
}

//检测站点返回
function checkSiteUrl($site_url)
{
    $is_exist = true;
    $responseHead = response_info($site_url);

    $nginx_cache = get_response_nginx_cache($responseHead);
    if(strstr($nginx_cache, 'MISS')) {
        $is_exist = false;
    }

    return $is_exist;
}

//返回响应的Content-Type
function get_response_nginx_cache($responseHead)
{
	/*
	1.  MISS      未命中,请求被传送到后台处理
	2.  HIT         缓存命中
	3.  EXPIRED     缓存已经过期,请求被传送到后台处理
	4.  UPDATING   正在更新缓存,将使用旧的应答
	5.  STALE         后端得到过期的应答
	*/
    $nginx_cache = 'EXPIRED';//MISS
    $headArr = explode("\r\n", $responseHead);
    foreach ($headArr as $loop)
    {
        if(strpos($loop, "Nginx-Cache") !== false) {
            $loop = str_replace(':', '', $loop);
			$nginx_cache = trim(substr($loop, 11)); 
			echo 'nginx_cache:'.$nginx_cache.PHP_EOL;
            break;
        }
    }

    return $nginx_cache;
}

//返回响应头部信息
function response_info($url)
{
    $oCurl = curl_init();
    $timeout = 10;
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_HEADER, 1);// 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);    
    curl_setopt($oCurl, CURLOPT_NOBODY, true);  // 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文    
    curl_setopt($oCurl, CURLOPT_POST, false);   // 不用 POST 方式请求, 意思就是通过 GET 请求
    curl_setopt($oCurl, CURLOPT_CONNECTTIMEOUT, $timeout);

    $sContent = curl_exec($oCurl);
    $headerSize = curl_getinfo($oCurl, CURLINFO_HEADER_SIZE);   // 获得响应结果里的:头大小    
    $header = substr($sContent, 0, $headerSize);    // 根据头大小去获取头信息内容
    echo $header;

    return $header;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值