<?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('`','·','~','!','@','#','$','¥','%','^','……',' ',' ','*','(',')','——',
'+','<span>','</span>','&12288','&','&','amp','"','"','quot','<','>','<','>'
,'\\','[',']','{','}',';',':','\'','"',',','<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;
}