#77
展开↯#78
作者:广西河池市
php将远程图片下载保存到本地
/*
*功能:php完美实现下载远程图片保存到本地
*参数:文件url,保存文件目录,保存文件名称,使用的下载方式
*当保存文件名称为空时则使用远程文件原来的名称
*/
function getImage($url,$save_dir='',$filename='',$type=0){
if(trim($url)==''){
return array('file_name'=>'','save_path'=>'','error'=>1);
}
if(trim($save_dir)==''){
$save_dir='./';
}
if(trim($filename)==''){//保存文件名
$ext=strrchr($url,'.');
if($ext!='.gif'&&$ext!='.jpg'){
return array('file_name'=>'','save_path'=>'','error'=>3);
}
$filename=time().$ext;
}
if(0!==strrpos($save_dir,'/')){
$save_dir.='/';
}
//创建保存目录
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
return array('file_name'=>'','save_path'=>'','error'=>5);
}
//获取远程文件所采用的方法
if($type){
$ch=curl_init();
$timeout=5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$img=curl_exec($ch);
curl_close($ch);
}else{
ob_start();
readfile($url);
$img=ob_get_contents();
ob_end_clean();
}
//$size=strlen($img);
//文件大小
$fp2=@fopen($save_dir.$filename,'a');
fwrite($fp2,$img);
fclose($fp2);
unset($img,$url);
return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
}
Run code
Cut to clipboard
文章:nginx不浏览直接下载文件 发表时间:2023-05-31, 17:20:19
#79
作者:广西河池市
<?php
/*
* 生成随机字符串
* @param int $length 生成随机字符串的长度
* @param string $char 组成随机字符串的字符串
* @return string $string 生成的随机字符串
*/
function str_rand($length = 32, $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
if(!is_int($length) || $length < 0) {
return false;
}
$string = '';
for($i = $length; $i > 0; $i--) {
$string .= $char[mt_rand(0, strlen($char) - 1)];
}
return $string;
}
echo str_rand(),"<br />";
/*
* 生成32位唯一字符串
*/
$uniqid = md5(uniqid(microtime(true),true));
echo $uniqid;
Run code
Cut to clipboard
文章:PHP生成随机密码 发表时间:2023-05-31, 17:17:00
#80
作者:广西河池市
js中数组的合并和对象的合并
1 数组合并
1.1 concat 方法
1.2 循环遍历
1.3 apply
合并数组arr1和数组arr2,使用Array.prototype.push.apply(arr1,arr2) or arr1.push.apply(arr1,arr2);
2 对象合并
2.1 $.extend()
2.2 遍历赋值
2.3 Obj.assign()
可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
Object.assign(target, ...sources)
2.4 对象的深拷贝和浅拷贝
2.4.1 浅拷贝
2.4.2 深拷贝
1 数组合并
1.1 concat 方法
var a=[1,2,3],b=[4,5,6];
var c=a.concat(b);
console.log(c);// 1,2,3,4,5,6
console.log(a);// 1,2,3 不改变本身
Run code
Cut to clipboard
1.2 循环遍历
var arr1=['a','b'];
var arr2=['c','d','e'];
for(var i=0;i<arr2.length;i++){
arr1.push(arr2[i])
}
console.log(arr1);//['a','b','c','d','e']
Run code
Cut to clipboard
1.3 apply
合并数组arr1和数组arr2,使用Array.prototype.push.apply(arr1,arr2) or arr1.push.apply(arr1,arr2);
var arr1=['a','b'];
var arr2=['c','d','e'];
Array.prototype.push.apply(arr1,arr2);
//或者
arr1.push.apply(arr1,arr2);<br>console.log(arr1) //['a','b','c','d','e']
Run code
Cut to clipboard
2 对象合并
2.1 $.extend()
var obj1= {'a': 1};
var obj2= {'b': 1};
var c = $.extend(obj1, obj2);console.log(obj1); // {a: 1, b: 1} obj1已被修改//或者 <br>var obj3 = $.extend({}, obj1, obj2) <br>console.log(obj3); //{a: 1, b: 1} 不会改变obj1,obj2
Run code
Cut to clipboard
2.2 遍历赋值
var obj1={'a':1};
var obj2={'b':2,'c':3};
for(var key in obj2){
if(obj2.hasOwnProperty(key)===true){ <br> //此处hasOwnProperty是判断自有属性,使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问会避免原型对象扩展带来的干扰
obj1[key]=obj2[key];
}
}
console.log(obj1);//{'a':1,'b':2,'c':3};
Run code
Cut to clipboard
2.3 Obj.assign()
可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
Object.assign(target, ...sources)
//a. 复制一个对象<br>var obj = { a: 1 ,b:2};
var copyObj = Object.assign({}, obj);
console.log(copyObj); // { a: 1,b:2 }<br><br>//b.合并多个对象var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, 且目标对象自身也会改变
Run code
Cut to clipboard
2.4 对象的深拷贝和浅拷贝
2.4.1 浅拷贝
var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};
$.extend(obj1, obj2); //obj1拷贝了obj2的属性
console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1) // 22
obj2.b.b1=44; //obj2重新赋值
console.log(obj1.b.b1) // 44 obj1.b仅拷贝了对象的指引,所以受原obj2的影响
Run code
Cut to clipboard
2.4.2 深拷贝
var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};
$.extend(true,obj1, obj2); //第一个参数设为true表示深复制
console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1) // 22
obj2.b.b1=44; //obj2重新赋值
console.log(obj1.b.b1) // 22 obj1拷贝了obj2的所有属性以及值,并不受obj2的影响
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-31, 17:15:22
#81
作者:广西河池市
js数组与字符串的相互转换方法
1、数组转字符串
需要将数组元素用某个字符连接成字符串,示例代码如下:
var a, b;
a = new Array(0,1,2,3,4);
b = a.join("-"); //"0-1-2-3-4"
2、字符串转数组
实现方法为将字符串按某个字符切割成若干个字符串,并以数组形式返回,示例代码如下:
var s = "abc,abcd,aaa";
ss = s.split(",");// 在每个逗号(,)处进行分解 ["abc", "abcd", "aaa"]
var s1 = "helloworld";
ss1 = s1.split(''); //["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"]
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-31, 16:58:32
#82
作者:广西河池市
Js获取当前日期时间及其它操作
var myDate = new Date();
myDate.getYear(); //获取当前年份(2位)
myDate.getFullYear(); //获取完整的年份(4位,1970-????)
myDate.getMonth(); //获取当前月份(0-11,0代表1月)
myDate.getDate(); //获取当前日(1-31)
myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数)
myDate.getHours(); //获取当前小时数(0-23)
myDate.getMinutes(); //获取当前分钟数(0-59)
myDate.getSeconds(); //获取当前秒数(0-59)
myDate.getMilliseconds(); //获取当前毫秒数(0-999)
myDate.toLocaleDateString(); //获取当前日期
var mytime=myDate.toLocaleTimeString(); //获取当前时间
myDate.toLocaleString( ); //获取日期与时间
日期时间脚本库方法列表
Date.prototype.isLeapYear 判断闰年
Date.prototype.Format 日期格式化
Date.prototype.DateAdd 日期计算
Date.prototype.DateDiff 比较日期差
Date.prototype.toString 日期转字符串
Date.prototype.toArray 日期分割为数组
Date.prototype.DatePart 取日期的部分信息
Date.prototype.MaxDayOfDate 取日期所在月的最大天数
Date.prototype.WeekNumOfYear 判断日期所在年的第几周
StringToDate 字符串转日期型
IsValidDate 验证日期有效性
CheckDateTime 完整日期时间检查
daysBetween 日期天数差
js代码:
//---------------------------------------------------
// 判断闰年
//---------------------------------------------------
Date.prototype.isLeapYear = function()
{
return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));
}
//---------------------------------------------------
// 日期格式化
// 格式 YYYY/yyyy/YY/yy 表示年份
// MM/M 月份
// W/w 星期
// dd/DD/d/D 日期
// hh/HH/h/H 时间
// mm/m 分钟
// ss/SS/s/S 秒
//---------------------------------------------------
Date.prototype.Format = function(formatStr)
{
var str = formatStr;
var Week = ['日','一','二','三','四','五','六'];
str=str.replace(/yyyy|YYYY/,this.getFullYear());
str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100));
str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0' + this.getMonth());
str=str.replace(/M/g,this.getMonth());
str=str.replace(/w|W/g,Week[this.getDay()]);
str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate());
str=str.replace(/d|D/g,this.getDate());
str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours());
str=str.replace(/h|H/g,this.getHours());
str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes());
str=str.replace(/m/g,this.getMinutes());
str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds());
str=str.replace(/s|S/g,this.getSeconds());
return str;
}
//+---------------------------------------------------
//| 求两个时间的天数差 日期格式为 YYYY-MM-dd
//+---------------------------------------------------
function daysBetween(DateOne,DateTwo)
{
var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ('-'));
var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);
var OneYear = DateOne.substring(0,DateOne.indexOf ('-'));
var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf ('-'));
var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);
var TwoYear = DateTwo.substring(0,DateTwo.indexOf ('-'));
var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);
return Math.abs(cha);
}
//+---------------------------------------------------
//| 日期计算
//+---------------------------------------------------
Date.prototype.DateAdd = function(strInterval, Number) {
var dtTmp = this;
switch (strInterval) {
case 's' :return new Date(Date.parse(dtTmp) + (1000 * Number));
case 'n' :return new Date(Date.parse(dtTmp) + (60000 * Number));
case 'h' :return new Date(Date.parse(dtTmp) + (3600000 * Number));
case 'd' :return new Date(Date.parse(dtTmp) + (86400000 * Number));
case 'w' :return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number));
case 'q' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
case 'm' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
case 'y' :return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
}
}
//+---------------------------------------------------
//| 比较日期差 dtEnd 格式为日期型或者有效日期格式字符串
//+---------------------------------------------------
Date.prototype.DateDiff = function(strInterval, dtEnd) {
var dtStart = this;
if (typeof dtEnd == 'string' )//如果是字符串转换为日期型
{
dtEnd = StringToDate(dtEnd);
}
switch (strInterval) {
case 's' :return parseInt((dtEnd - dtStart) / 1000);
case 'n' :return parseInt((dtEnd - dtStart) / 60000);
case 'h' :return parseInt((dtEnd - dtStart) / 3600000);
case 'd' :return parseInt((dtEnd - dtStart) / 86400000);
case 'w' :return parseInt((dtEnd - dtStart) / (86400000 * 7));
case 'm' :return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);
case 'y' :return dtEnd.getFullYear() - dtStart.getFullYear();
}
}
//+---------------------------------------------------
//| 日期输出字符串,重载了系统的toString方法
//+---------------------------------------------------
Date.prototype.toString = function(showWeek)
{
var myDate= this;
var str = myDate.toLocaleDateString();
if (showWeek)
{
var Week = ['日','一','二','三','四','五','六'];
str += ' 星期' + Week[myDate.getDay()];
}
return str;
}
//+---------------------------------------------------
//| 日期合法性验证
//| 格式为:YYYY-MM-DD或YYYY/MM/DD
//+---------------------------------------------------
function IsValidDate(DateStr)
{
var sDate=DateStr.replace(/(^\s+|\s+$)/g,''); //去两边空格;
if(sDate=='') return true;
//如果格式满足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替换为''
//数据库中,合法日期可以是:YYYY-MM/DD(2003-3/21),数据库会自动转换为YYYY-MM-DD格式
var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,'');
if (s=='') //说明格式满足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D
{
var t=new Date(sDate.replace(/\-/g,'/'));
var ar = sDate.split(/[-/:]/);
if(ar[0] != t.getYear() || ar[1] != t.getMonth()+1 || ar[2] != t.getDate())
{
//alert('错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。');
return false;
}
}
else
{
//alert('错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。');
return false;
}
return true;
}
//+---------------------------------------------------
//| 日期时间检查
//| 格式为:YYYY-MM-DD HH:MM:SS
//+---------------------------------------------------
function CheckDateTime(str)
{
var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2 }):(\d{ 1,2 }):(\d{ 1,2 })$/;
var r = str.match(reg);
if(r==null)return false;
r[2]=r[2]-1;
var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]);
if(d.getFullYear()!=r[1])return false;
if(d.getMonth()!=r[2])return false;
if(d.getDate()!=r[3])return false;
if(d.getHours()!=r[4])return false;
if(d.getMinutes()!=r[5])return false;
if(d.getSeconds()!=r[6])return false;
return true;
}
//+---------------------------------------------------
//| 把日期分割成数组
//+---------------------------------------------------
Date.prototype.toArray = function()
{
var myDate = this;
var myArray = Array();
myArray[0] = myDate.getFullYear();
myArray[1] = myDate.getMonth();
myArray[2] = myDate.getDate();
myArray[3] = myDate.getHours();
myArray[4] = myDate.getMinutes();
myArray[5] = myDate.getSeconds();
return myArray;
}
//+---------------------------------------------------
//| 取得日期数据信息
//| 参数 interval 表示数据类型
//| y 年 m月 d日 w星期 ww周 h时 n分 s秒
//+---------------------------------------------------
Date.prototype.DatePart = function(interval)
{
var myDate = this;
var partStr='';
var Week = ['日','一','二','三','四','五','六'];
switch (interval)
{
case 'y' :partStr = myDate.getFullYear();break;
case 'm' :partStr = myDate.getMonth()+1;break;
case 'd' :partStr = myDate.getDate();break;
case 'w' :partStr = Week[myDate.getDay()];break;
case 'ww' :partStr = myDate.WeekNumOfYear();break;
case 'h' :partStr = myDate.getHours();break;
case 'n' :partStr = myDate.getMinutes();break;
case 's' :partStr = myDate.getSeconds();break;
}
return partStr;
}
//+---------------------------------------------------
//| 取得当前日期所在月的最大天数
//+---------------------------------------------------
Date.prototype.MaxDayOfDate = function()
{
var myDate = this;
var ary = myDate.toArray();
var date1 = (new Date(ary[0],ary[1]+1,1));
var date2 = date1.dateAdd(1,'m',1);
var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));
return result;
}
//+---------------------------------------------------
//| 取得当前日期所在周是一年中的第几周
//+---------------------------------------------------
Date.prototype.WeekNumOfYear = function()
{
var myDate = this;
var ary = myDate.toArray();
var year = ary[0];
var month = ary[1]+1;
var day = ary[2];
document.write('< script language=VBScript\> \n');
document.write('myDate = Datue(''+month+'-'+day+'-'+year+'') \n');
document.write('result = DatePart('ww', myDate) \n');
document.write(' \n');
return result;
}
//+---------------------------------------------------
//| 字符串转成日期类型
//| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd
//+---------------------------------------------------
function StringToDate(DateStr)
{
var converted = Date.parse(DateStr);
var myDate = new Date(converted);
if (isNaN(myDate))
{
//var delimCahar = DateStr.indexOf('/')!=-1?'/':'-';
var arys= DateStr.split('-');
myDate = new Date(arys[0],--arys[1],arys[2]);
}
return myDate;
}
若要显示:当前日期加时间(如:2009-06-12 12:00)
function CurentTime()
{
var now = new Date();
var year = now.getFullYear(); //年
var month = now.getMonth() + 1; //月
var day = now.getDate(); //日
var hh = now.getHours(); //时
var mm = now.getMinutes(); //分
var clock = year + "-";
if(month < 10)
clock += "0";
clock += month + "-";
if(day < 10)
clock += "0";
clock += day + " ";
if(hh < 10)
clock += "0";
clock += hh + ":";
if (mm < 10) clock += '0';
clock += mm;
return(clock);
}
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-31, 16:58:00
#83
作者:广西河池市
centos7关闭ipv6
centos7使用ipv6协议,如果出现问题了将会很难排查,所以想要关闭ipv6,该怎么关闭呢?下面我们就来看看详细的教程。
1、使用ifconfig命令查看网卡信息,如果出现inet6 fe80::20c:29ff:fed0:3514,说明机器开启了ipv6
2、编辑/etc/sysctl.conf配置,增加net.ipv6.conf.all.disable_ipv6=1
3、编辑/etc/sysconfig/network配置,增加 NETWORKING_IPV6=no,保存并退出
4、编辑/etc/sysconfig/network-scripts/ifcfg-eno16777736,确保IPV6INIT=no,ifcfg-eno16777736是根据自己机器的,实际网卡信息来看,不是固定的
5、关闭防火墙的开机自启动
systemctl disable ip6tables.service
6、执行sysctl -p或者reboot重启命令
7、再次使用ifconfig进行验证,只剩下ipv4,ipv6消失了,关闭成功
centos7使用ipv6协议,如果出现问题了将会很难排查,所以想要关闭ipv6,该怎么关闭呢?下面我们就来看看详细的教程。
1、使用ifconfig命令查看网卡信息,如果出现inet6 fe80::20c:29ff:fed0:3514,说明机器开启了ipv6
2、编辑/etc/sysctl.conf配置,增加net.ipv6.conf.all.disable_ipv6=1
3、编辑/etc/sysconfig/network配置,增加 NETWORKING_IPV6=no,保存并退出
4、编辑/etc/sysconfig/network-scripts/ifcfg-eno16777736,确保IPV6INIT=no,ifcfg-eno16777736是根据自己机器的,实际网卡信息来看,不是固定的
5、关闭防火墙的开机自启动
systemctl disable ip6tables.service
6、执行sysctl -p或者reboot重启命令
7、再次使用ifconfig进行验证,只剩下ipv4,ipv6消失了,关闭成功
文章:本地Linux CentOS7服务器安装笔记 发表时间:2023-05-30, 14:52:10
#84
作者:广西河池市
js 数组、对象转json 以及json转 数组、对象
1、JS对象转JSON
方式:JSON.stringify(obj)

2、JS数组转JSON
3、JS对象数组转JSON
4、JSON转JS数组
5、JSON转JS对象
#,广西河池市,2023-05-29,16:54:30, 小程序判断一个对象是否为空
ES6 新增的方法 Object.keys():
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。
如果我们的对象为空,他会返回一个空数组,如下:
我们可以依靠Object.keys()这个方法通过判断它的长度来知道它是否为空。
1、JS对象转JSON
方式:JSON.stringify(obj)
var json = {"name":"iphone","price":666}; //创建对象;
var jsonStr = JSON.stringify(json); //转为JSON字符串
console.log(jsonStr);
Run code
Cut to clipboard
2、JS数组转JSON
//数组转json串
var arr = [1,2,3, { a : 1 } ];
JSON.stringify( arr );
Run code
Cut to clipboard
3、JS对象数组转JSON
//数组转json串
var arr = [1,2,3, { a : 1 } ];
JSON.stringify( arr );
Run code
Cut to clipboard
4、JSON转JS数组
//json字符串转数组
var jsonStr = '[1,2,3,{"a":1}]';
var jsarr=JSON.parse( jsonStr );
alert(jsarr[0]);
Run code
Cut to clipboard
5、JSON转JS对象
var jsonString = '{"bar":"property","baz":3}';
var jsObject = JSON.parse(jsonString); //转换为json对象
alert(jsObject.bar); //取json中的值
Run code
Cut to clipboard
ES6 新增的方法 Object.keys():
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。
如果我们的对象为空,他会返回一个空数组,如下:
var a = {}
Object.keys(a) // []
Run code
Cut to clipboard
我们可以依靠Object.keys()这个方法通过判断它的长度来知道它是否为空。
if (Object.keys(object).length === 0) {
return false // 如果为空,返回false
}
return true // 如果不为空,则会执行到这一步,返回true
Run code
Cut to clipboard
文章:js 删除前confirm确认提示代码 发表时间:2023-05-29, 16:52:20
#85
作者:广西河池市
联表查询 group by order by desc 不支持排序
支持排序的代码SELECT * , count( mid ) AS mid
FROM (
SELECT A.mid, A.title, A.sortrank, A.pubdate
FROM `acms_archives` AS A
LEFT JOIN `acms_arctype` AS B ON A.typeid = B.id
WHERE B.topid =18
AND A.arcrank =0
AND A.sortrank = A.pubdate
AND A.pubdate >0
ORDER BY pubdate DESC
) AS z
GROUP BY z.mid
ORDER BY z.pubdate DESC
LIMIT 0 , 7
原代码
SELECT A.title,A.sortrank,A.pubdate FROM `acms_archives` as A left join `acms_arctype` as B ON A.typeid = B.id where B.topid=18 and A.arcrank=0 and A.sortrank = A.pubdate and A.pubdate > 0 group by A.mid order by A.pubdate desc limit 0,7
Run code
Cut to clipboard
文章:Mysql8.0及以上 only_full_group_by以及其他关于sql_mode原因报错详细解决方案 发表时间:2023-05-29, 16:40:11
#86
作者:广西河池市
php 写入文件,日志记录信息方法
private function write_log($data){
$years = date('Y-m');
//设置路径目录信息
$url = './public/log/txlog/'.$years.'/'.date('Ymd').'_request_log.txt';
$dir_name=dirname($url);
//目录不存在就创建
if(!file_exists($dir_name))
{
//iconv防止中文名乱码
$res = mkdir(iconv("UTF-8", "GBK", $dir_name),0777,true);
}
$fp = fopen($url,"a");//打开文件资源通道 不存在则自动创建
fwrite($fp,var_export($data,true)."\r\n");//写入文件
fclose($fp);//关闭资源通道
}
Run code
Cut to clipboard
文章:Thinkphp6配置使用Workerman WebSocket Socket 发表时间:2023-05-29, 16:38:04
#87
作者:广西河池市
小程序websocket(心跳连接)
websocket连接之后,如果隔一段时间不聊天,运营商会认为你空占网络资源,强行关闭你的websocket连接,
如果想要一直保持连接,就需要监听websocket关闭事件,等关闭时重新连接从而让websocket一直保持连接.
这个过程称为心跳
1、必须要有心跳,如果没有会自动断开连接。
2‘、断开后必须取消setTimeout,不然会继续执行一次。
3、发送消息只有在onSocketOpen后才会发送,所以添加一个消息数组,等连接成功后再发送。
4、如果在还没连接成功时退出连接,会导致无法关闭,所以添加了socketClose来关闭socket
下面是使用方法
websocket连接之后,如果隔一段时间不聊天,运营商会认为你空占网络资源,强行关闭你的websocket连接,
如果想要一直保持连接,就需要监听websocket关闭事件,等关闭时重新连接从而让websocket一直保持连接.
这个过程称为心跳
1、必须要有心跳,如果没有会自动断开连接。
2‘、断开后必须取消setTimeout,不然会继续执行一次。
3、发送消息只有在onSocketOpen后才会发送,所以添加一个消息数组,等连接成功后再发送。
4、如果在还没连接成功时退出连接,会导致无法关闭,所以添加了socketClose来关闭socket
// socket已经连接成功
var socketOpen = false
// socket已经调用关闭function
var socketClose = false
// socket发送的消息队列
var socketMsgQueue = []
// 判断心跳变量
var heart = ''
// 心跳失败次数
var heartBeatFailCount = 0
// 终止心跳
var heartBeatTimeOut = null;
// 终止重新连接
var connectSocketTimeOut = null;
var webSocket = {
/**
* 创建一个 WebSocket 连接
* @param {options}
* url String 是 开发者服务器接口地址,必须是 wss 协议,且域名必须是后台配置的合法域名
* header Object 否 HTTP Header , header 中不能设置 Referer
* method String 否 默认是GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
* protocols StringArray 否 子协议数组 1.4.0
* success Function 否 接口调用成功的回调函数
* fail Function 否 接口调用失败的回调函数
* complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行)
*/
connectSocket: function(options) {
wx.showLoading({
title: '',
mask: true,
})
socketOpen = false
socketClose = false
socketMsgQueue = []
wx.connectSocket({
url: '开发者服务器接口地',
success: function(res) {
if (options) {
// 成功回调
options.success && options.success(res);
}
},
fail: function(res) {
if (options) {
// 失败回调
options.fail && options.fail(res);
}
}
})
},
/**
* 通过 WebSocket 连接发送数据
* @param {options}
* data String / ArrayBuffer 是 需要发送的内容
* success Function 否 接口调用成功的回调函数
* fail Function 否 接口调用失败的回调函数
* complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行)
*/
sendSocketMessage: function(options) {
if (socketOpen) {
wx.sendSocketMessage({
data: options.msg,
success: function(res) {
if (options) {
options.success && options.success(res);
}
},
fail: function(res) {
if (options) {
options.fail && options.fail(res);
}
}
})
} else {
socketMsgQueue.push(options.msg)
}
},
/**
* 关闭 WebSocket 连接。
* @param {options}
* code Number 否 一个数字值表示关闭连接的状态号,表示连接被关闭的原因。如果这个参数没有被指定,默认的取值是1000 (表示正常连接关闭)
* reason String 否 一个可读的字符串,表示连接被关闭的原因。这个字符串必须是不长于123字节的UTF-8 文本(不是字符)
* fail Function 否 接口调用失败的回调函数
* complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行)
*/
closeSocket: function(options) {
if (connectSocketTimeOut) {
clearTimeout(connectSocketTimeOut);
connectSocketTimeOut = null;
}
socketClose = true;
var self = this;
self.stopHeartBeat();
wx.closeSocket({
success: function(res) {
console.log('WebSocket 已关闭!');
if (options) {
options.success && options.success(res);
}
},
fail: function(res) {
if (options) {
options.fail && options.fail(res);
}
}
})
},
// 收到消息回调
onSocketMessageCallback: function(msg) {
},
// 开始心跳
startHeartBeat: function() {
console.log('socket开始心跳')
var self = this;
heart = 'heart';
self.heartBeat();
},
// 结束心跳
stopHeartBeat: function() {
console.log('socket结束心跳')
var self = this;
heart = '';
if (heartBeatTimeOut) {
clearTimeout(heartBeatTimeOut);
heartBeatTimeOut = null;
}
if (connectSocketTimeOut) {
clearTimeout(connectSocketTimeOut);
connectSocketTimeOut = null;
}
},
// 心跳
heartBeat: function() {
var self = this;
if (!heart) {
return;
}
self.sendSocketMessage({
msg: JSON.stringify({
'msg_type': 'heart'
}),
success: function(res) {
console.log('socket心跳成功');
if (heart) {
heartBeatTimeOut = setTimeout(() => {
self.heartBeat();
}, 7000);
}
},
fail: function(res) {
console.log('socket心跳失败');
if (heartBeatFailCount > 2) {
// 重连
self.connectSocket();
}
if (heart) {
heartBeatTimeOut = setTimeout(() => {
self.heartBeat();
}, 7000);
}
heartBeatFailCount++;
},
});
}
}
// 监听WebSocket连接打开事件。callback 回调函数
wx.onSocketOpen(function(res) {
console.log('WebSocket连接已打开!')
wx.hideLoading();
// 如果已经调用过关闭function
if (socketClose) {
webSocket.closeSocket();
} else {
socketOpen = true
for (var i = 0; i < socketMsgQueue.length; i++) {
webSocket.sendSocketMessage(socketMsgQueue[i])
}
socketMsgQueue = []
webSocket.startHeartBeat();
}
})
// 监听WebSocket错误。
wx.onSocketError(function(res) {
console.log('WebSocket连接打开失败,请检查!', res)
})
// 监听WebSocket接受到服务器的消息事件。
wx.onSocketMessage(function(res) {
console.log('收到服务器内容:' + res.data)
webSocket.onSocketMessageCallback(res.data)
})
// 监听WebSocket关闭。
wx.onSocketClose(function(res) {
console.log('WebSocket 已关闭!')
if (!socketClose) {
clearTimeout(connectSocketTimeOut)
connectSocketTimeOut = setTimeout(() => {
webSocket.connectSocket();
}, 3000);
}
})
module.exports = webSocket;
Run code
Cut to clipboard
下面是使用方法
// socket连接
const webSocket = require('../../utils/webSocket.js');
onLoad: function(options) {
// 创建连接
webSocket.connectSocket();
// 设置接收消息回调
webSocket.onSocketMessageCallback = this.onSocketMessageCallback;
},
// socket收到的信息回调
onSocketMessageCallback: function(msg) {
console.log('收到消息回调', msg)
},
onUnload: function(options) {
// 页面销毁时关闭连接
webSocket.closeSocket();
},
Run code
Cut to clipboard
文章:Thinkphp6配置使用Workerman WebSocket Socket 发表时间:2023-05-29, 16:35:07
#88
作者:广西河池市
php 将图片转成base64
PHP保存Base64图片base64_decode的问题
PHP对Base64的支持非常好,有内置的base64_encode与base64_decode负责图片的Base64编码与解码。
编码上,只要将图片流读取到,而后使用base64_encode进行进行编码即可得到。
而解码就略微麻烦一点,究其原因在于把图片编码成base64字符串后,编码内会加入这些字符 data:image/png;base64,本来是用于base64进行识别的。但是如果直接放到php里用base64_decode函数解码会导致最终保存的图片文件格式损坏,而解决方法就是先去掉这一串字符:
PHP保存Base64图片base64_decode的问题
PHP对Base64的支持非常好,有内置的base64_encode与base64_decode负责图片的Base64编码与解码。
编码上,只要将图片流读取到,而后使用base64_encode进行进行编码即可得到。
/**
* 获取图片的Base64编码(不支持url)
* @date 2017-02-20 19:41:22
*
* @param $img_file 传入本地图片地址
*
* @return string
*/
function imgToBase64($img_file) {
$img_base64 = '';
if (file_exists($img_file)) {
$app_img_file = $img_file; // 图片路径
$img_info = getimagesize($app_img_file); // 取得图片的大小,类型等
//echo '<pre>' . print_r($img_info, true) . '</pre><br>';
$fp = fopen($app_img_file, "r"); // 图片是否可读权限
if ($fp) {
$filesize = filesize($app_img_file);
$content = fread($fp, $filesize);
$file_content = chunk_split(base64_encode($content)); // base64编码
switch ($img_info[2]) { //判读图片类型
case 1: $img_type = "gif";
break;
case 2: $img_type = "jpg";
break;
case 3: $img_type = "png";
break;
}
$img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content;//合成图片的base64编码
}
fclose($fp);
}
return $img_base64; //返回图片的base64
}
//调用使用的方法
$img_dir = dirname(__FILE__) . '/uploads/img/11213223.jpg';
$img_base64 = imgToBase64($img_dir);
echo '<img src="' . $img_base64 . '">'; //图片形式展示
echo '<hr>';
echo $img_base64; //输出Base64编码
Run code
Cut to clipboard
而解码就略微麻烦一点,究其原因在于把图片编码成base64字符串后,编码内会加入这些字符 data:image/png;base64,本来是用于base64进行识别的。但是如果直接放到php里用base64_decode函数解码会导致最终保存的图片文件格式损坏,而解决方法就是先去掉这一串字符:
$base64_string= explode(',', $base64_string); //截取data:image/png;base64, 这个逗号后的字符
$data= base64_decode($base64_string[1]); //对截取后的字符使用base64_decode进行解码
file_put_contents($url, $data); //写入文件并保存
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-29, 16:30:52
#89
作者:广西河池市
JS判断是否是微信打开页面
function isWeiXin(){
var ua = window.navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i) == 'micromessenger' || ua.match(/_SQ_/i) == '_sq_'){
return true;
}else{
return false;
}
}
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-29, 16:21:51
#90
作者:广西河池市
js Array vs [],以及是否为空的判断
两者基本相同,唯一不同点在于初始化:
也就是说Array(arg),其中的arg是指生成数组的长度。
参考:What’s the difference between “Array()” and “[]” while declaring a JavaScript array?
检查array是否为空:
两者基本相同,唯一不同点在于初始化:
var a = [], // these are the same
b = new Array(), // a and b are arrays with length 0
c = ['foo', 'bar'], // these are the same
d = new Array('foo', 'bar'), // c and d are arrays with 2 strings
// these are different:
e = [3] // e.length == 1, e[0] == 3
f = new Array(3), // f.length == 3, f[0] == undefined
Run code
Cut to clipboard
也就是说Array(arg),其中的arg是指生成数组的长度。
参考:What’s the difference between “Array()” and “[]” while declaring a JavaScript array?
检查array是否为空:
if (array === undefined || array.length == 0) {
// array empty or does not exist
}
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-29, 16:18:33
#91
作者:广西河池市
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
一、中文截取:mb_substr()
mb_substr( $str, $start, $length, $encoding )
$str,需要截断的字符串
$start,截断开始处,起始处为0
$length,要截取的字数
$encoding,网页编码,如utf-8,GB2312,GBK
实例:
复制代码 代码如下:
<?php
$str='脚本之家:http://www.jb51.net';
echo mb_substr($str,0,4,'utf-8');//截取头5个字,假定此代码所在php文件的编码为utf-8
?>
结果显示:脚本之家
二、获取中文长度:mb_strlen()
mb_strlen( $str, $encoding )
$str,要计算长度的字符串
$encoding,网页编码,如utf-8,GB2312,GBK
实例:
复制代码 代码如下:
<?php
$str='脚本之家:http://www.jb51.net';
echo mb_strlen($str,'utf-8');//假定此代码所在php文件的编码为utf-8
?>
结果显示:24
学习时的痛苦是暂时的 未学到的痛苦是终生的
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-29, 16:16:50
#92
作者:广西河池市
PHP获得当日零点时间戳
header("Content-type:text/html;charset=utf-8");
//设置北京时间为默认时区
date_default_timezone_set('PRC');
//输出当前时间
echo date("Y-m-d H:i:s",time()); //2016-08-11 10:30:32
//获得当日凌晨的时间戳
$today = strtotime(date("Y-m-d"),time());
echo '<br>';
echo $today; //1470844800
echo '<br>';
//验证当日凌晨的时间戳是否正确
echo date("Y-m-d H:i:s",$today); //2016-08-11 00:00:00
echo '<br>';
//当天的24点时间戳
$end = $today+60*60*24;
//验证当天的24点时间戳是否正确
echo date("Y-m-d H:i:s", $end); //2016-08-12 00:00:00
echo '<br>';
//获得指定时间的零点的时间戳
$time = strtotime('2014-06-06');
echo '<br>';
echo $time; //1401984000
echo '<br>';
//验证是否是指定时间的时间戳
echo date("Y-m-d H:i:s",$time); //2014-06-06 00:00:00
Run code
Cut to clipboard
文章:js获取本周、本月、本季度、本年开始,结束时间 发表时间:2023-05-29, 16:16:19
#93
作者:广西河池市
PHP根据经纬度,计算2点之间的距离的2种方法
计算地球表面2点之间的球面距离
#,广西河池市,2023-05-29,16:01:58, PHP,Mysql根据经纬度计算距离并排序
网上给出的计算公式是这样的:

Lng1表示A点纬度和经度,Lat2 Lng2 表示B点纬度和经度
a = Lat1 – Lat2为两点纬度之差 b = Lng1 -Lng2 为两点经度之差
6378.137为地球半径,单位为公里
计算出来的结果单位为公里
#,广西河池市,2023-05-29,16:03:47, php根据经纬度排序,根据经纬度筛选距离段
SQL 语句:select location.* from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance from bsx_training where (px_state = 1) and (type_id != '') and (((px_lat >= 27.683290277922) and (px_lat <= 45.653769722078)) and ((px_lon >= 105.81826766053) and (px_lon <= 128.22245033947))) order by distance limit 0,10) location where (1=1) and (location.distance <= 500)
先忽略上面这条SQL语句。一一解释
根据SQL排序的SQl语句
这是一个生成根据SQL排序函数代码
接下来下面是设置经纬度范围内的数据
下面算出经纬度范围内的数据控制函数
要实现根据经纬度排序
就直接调用distance_sql(lon1,lat1,lon2,lat2)传入参数 并且as 一个别名例如 as distance, 然后sql语句中 order by 排序 根据 distance排序
如果筛选距离段 1000米-2000米的数据
那就sql语句嵌套sql
select *.loation from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance) from table location where (location.distance >= 1000) and (location.distance <= 2000))
如果实现根据最近位置排序sql
select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance order by distance
计算地球表面2点之间的球面距离
/**
* @param $lat1
* @param $lng1
* @param $lat2
* @param $lng2
* @return int
*/
function getDistance($lat1, $lng1, $lat2, $lng2){
//将角度转为狐度
$radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度
$radLat2=deg2rad($lat2);
$radLng1=deg2rad($lng1);
$radLng2=deg2rad($lng2);
$a=$radLat1-$radLat2;
$b=$radLng1-$radLng2;
$s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137;
return $s;
}
/**
* @param $lat1
* @param $lon1
* @param $lat2
* @param $lon2
* @param float $radius 星球半径
* @return float
*/
function distance($lat1, $lon1, $lat2,$lon2,$radius = 6378.137)
{
$rad = floatval(M_PI / 180.0);
$lat1 = floatval($lat1) * $rad;
$lon1 = floatval($lon1) * $rad;
$lat2 = floatval($lat2) * $rad;
$lon2 = floatval($lon2) * $rad;
$theta = $lon2 - $lon1;
$dist = acos(sin($lat1) * sin($lat2) +
cos($lat1) * cos($lat2) * cos($theta)
);
if ($dist < 0 ) {
$dist += M_PI;
}
return $dist = $dist * $radius;
}
$lat1 = '31.253411';
$lon1 = '121.518998';
$lat2 = '31.277117';
$lon2 = '120.744587';
echo getDistance($lat1, $lon1, $lat2, $lon2); // 73.734589823361
echo distance($lat1, $lon1, $lat2, $lon2); // 73.734589823354
Run code
Cut to clipboard
网上给出的计算公式是这样的:
Lng1表示A点纬度和经度,Lat2 Lng2 表示B点纬度和经度
a = Lat1 – Lat2为两点纬度之差 b = Lng1 -Lng2 为两点经度之差
6378.137为地球半径,单位为公里
计算出来的结果单位为公里
select *,(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(111.86141967773438-lng)/360),2)+COS(PI()*33.07078170776367/180)* COS(lat * PI()/180)*POW(SIN(PI()*(33.07078170776367-lat)/360),2)))) as juli from `area`
order by juli asc limit 0,20
Run code
Cut to clipboard
SQL 语句:select location.* from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance from bsx_training where (px_state = 1) and (type_id != '') and (((px_lat >= 27.683290277922) and (px_lat <= 45.653769722078)) and ((px_lon >= 105.81826766053) and (px_lon <= 128.22245033947))) order by distance limit 0,10) location where (1=1) and (location.distance <= 500)
先忽略上面这条SQL语句。一一解释
根据SQL排序的SQl语句
// lon1当前用户经度 lat1当前用户纬度,lon2 sql的经度字段 lat sql的纬度字段function distance_sql($lon1,$lat1,$lon2,$lat2)
{
$sql = "round(6378.138*2*asin(sqrt(pow(sin( ({$lat1}*pi()/180-{$lat2}*pi()/180)/2),2)+cos({$lat1}*pi()/180)*cos({$lat2}*pi()/180)* pow(sin( ({$lon1}*pi()/180-{$lon2}*pi()/180)/2),2)))*1000) ";
return $sql;
}
Run code
Cut to clipboard
这是一个生成根据SQL排序函数代码
接下来下面是设置经纬度范围内的数据
// 当前登录用户经纬度if(I("post.location")){
// 用户经纬度
$location = explode(",",I("post.location"));
$userLon = $location[0];
$userLat = $location[1];
// 经纬距离筛选筛选
$location = getAround($userLat,$userLon,1000000);
$wheres1.=" and (((px_lat >= {$location["minLat"]}) and (px_lat <= {$location['maxLat']})) and ((px_lon >= {$location['minLng']}) and (px_lon <= {$location['maxLng']})))";
// 经纬度距离优先排序,距离最近优先显示
if(I("post.distance_sort")){
$distanceSql = ",".distance_sql($userLon,$userLat,"px_lon","px_lat")." as distance";
$orderBy = " distance";
}
if(I("post.km")){ $kmStr = I("post.km"); // 距离 1千米-1万米之前
// $kmStr = "1000,10000"; // 距离小于1千米 //$kmStr = "<1000"; //距离大于1千米 //$kmStr = ">1000";
if(strpos($kmStr,"<") !== false){
$km = explode("<",$kmStr);
$wheres2 .= " and (location.distance <= {$km[1]})";
}else if(strpos($kmStr,"-") !== false){
$km = explode("-",$kmStr);
$wheres2 .= " and ((location.distance >= {$km[0]}) and (location.distance <= {$km[1]}))";
}else if(strpos($kmStr,">") !== false){
$km = explode(">",$kmStr);
$wheres2 .= " and (location.distance >= {$km[1]})";
}
}
}
Run code
Cut to clipboard
下面算出经纬度范围内的数据控制函数
/**
*
* @param $latitude 纬度
* @param $longitude 经度
* @param $raidus 半径范围(单位:米)
* @return multitype:number
*/
function getAround($latitude,$longitude,$raidus)
{
$PI = 3.14159265;
$degree = (24901*1609)/360.0;
$dpmLat = 1/$degree;
$radiusLat = $dpmLat*$raidus;
$minLat = $latitude - $radiusLat;
$maxLat = $latitude + $radiusLat;
$mpdLng = $degree*cos($latitude * ($PI/180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng*$raidus;
$minLng = $longitude - $radiusLng;
$maxLng = $longitude + $radiusLng;
return array (minLat=>$minLat, maxLat=>$maxLat, minLng=>$minLng, maxLng=>$maxLng);
}
Run code
Cut to clipboard
要实现根据经纬度排序
就直接调用distance_sql(lon1,lat1,lon2,lat2)传入参数 并且as 一个别名例如 as distance, 然后sql语句中 order by 排序 根据 distance排序
如果筛选距离段 1000米-2000米的数据
那就sql语句嵌套sql
select *.loation from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance) from table location where (location.distance >= 1000) and (location.distance <= 2000))
如果实现根据最近位置排序sql
select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance order by distance
public function training_list()
{
$wheres1 = "(px_state = 1)";
$wheres2 = " where (1=1)";
$orderBy = " px_id desc";
if(I("post.location")){
// 用户经纬度
$location = explode(",",I("post.location"));
$userLon = $location[0];
$userLat = $location[1];
// 经纬度筛选
$location = getAround($userLat,$userLon,1000000);
$wheres1.=" and (((px_lat >= {$location["minLat"]}) and (px_lat <= {$location['maxLat']})) and ((px_lon >= {$location['minLng']}) and (px_lon <= {$location['maxLng']})))";
// 经纬度距离筛选
if(I("post.distance_sort")){
$distanceSql = ",".distance_sql($userLon,$userLat,"px_lon","px_lat")." as distance";
$orderBy = " distance";
}
if(I("post.km")){
$kmStr = htmlspecialchars_decode(I("post.km"));
if(strpos($kmStr,"<") !== false){
$km = explode("<",$kmStr);
$wheres2 .= " and (location.distance <= {$km[1]})";
}else if(strpos($kmStr,"-") !== false){
$km = explode("-",$kmStr);
$wheres2 .= " and ((location.distance >= {$km[0]}) and (location.distance <= {$km[1]}))";
}else if(strpos($kmStr,">") !== false){
$km = explode(">",$kmStr);
$wheres2 .= " and (location.distance >= {$km[1]})";
}
}
}
$showNum = 10;
if(I("post.page")){
$page = I("post.page");
}else{
$page = 1;
}
$n = ($page-1)*$showNum;
$field = "*{$distanceSql}";
$sql = "select location.* from (select {$field} from bsx_training where {$wheres1} order by {$orderBy} limit {$n},{$showNum}) location {$wheres2}";
$training = M()->query($sql);
dump(M()->getlastsql());die;
}
Run code
Cut to clipboard
文章:JavaScript经纬度算距离 发表时间:2023-05-29, 16:01:11
#94
作者:广西河池市
Linux查看某个用户账号过期信息
设置新用户缺省密码的过期时间
vi /etc/login.defs修改PASS_MAX_DAYS的值即可。值得一提的是,这里的设置只适用于该设置以后新添加的用户,也就是说修改的这个设置将作为新添加用户的缺省设置。
对于系统已存在的账号,使用命令:passwd -x 90 [要修改的账号]
设置某个用户的密码有效期
chage -m 0 -M 90 -W 15 [要设置的用户]
-m:密码可以更改的最小天数。为零代表任何时候都可以更改密码。
-M:密码保持有效的最大天数
-W:在密码过期前15天对用户进行提醒
-E:账号到期的日期,过了这天,此账号将不可用
-d:指定密码最后修改日期
-i:停滞时期,如果一个密码已过期这些天,那么此账号将不可用
-l:列出当前用户设置
查看某个用户的密码状态
chage -l root
Last password change : Jul 09, 2019【最近一次修改密码的时间】
Password expires : never【密码过期时间】
Password inactive : never【密码失效时间】
Account expires : never【账户过期时间】
Minimum number of days between password change : 0【两次改变密码之间相距最小天数】
Maximum number of days between password change : 99999【两次密码改变密码相距最大天数】
Number of days of warning before password expires : 7【密码过期前开始警告的天数】
Password expires和Password inactive区别
Last passwrd change + M天数 = Password expires
Maximum number of days between password chang=M天数
Password expires + I 天数 = Password inactive,看到此时 Password inactive 改成了在 Password expires基础上再加l天
Password expires期限之前,系统会提示你多少天后密码会到期
Password inactive之前登陆,系统会强制你改密码才能登陆,改完密码后Last password change,Password expires,Password inactive 都会根据你改时候的系统日期和相应的M和I的参数改变,改完系统照常进入
总结:密码到期(Password expires)登陆改完还能进系统,密码失效(Password inactive)就得找管理员啦~ #,广西河池市,2023-05-29,15:20:08,
Centos7修改用户密码失效时间
vim /etc/login.defs
#,广西河池市,2023-05-29,15:21:02, 等保认证--CentOS7设置定期更改密码(密码有效天数)
可以通过查看用户账号密码有效期等策略
设置新用户缺省密码的过期时间
vi /etc/login.defs修改PASS_MAX_DAYS的值即可。值得一提的是,这里的设置只适用于该设置以后新添加的用户,也就是说修改的这个设置将作为新添加用户的缺省设置。
对于系统已存在的账号,使用命令:passwd -x 90 [要修改的账号]
设置某个用户的密码有效期
chage -m 0 -M 90 -W 15 [要设置的用户]
-m:密码可以更改的最小天数。为零代表任何时候都可以更改密码。
-M:密码保持有效的最大天数
-W:在密码过期前15天对用户进行提醒
-E:账号到期的日期,过了这天,此账号将不可用
-d:指定密码最后修改日期
-i:停滞时期,如果一个密码已过期这些天,那么此账号将不可用
-l:列出当前用户设置
查看某个用户的密码状态
chage -l root
Last password change : Jul 09, 2019【最近一次修改密码的时间】
Password expires : never【密码过期时间】
Password inactive : never【密码失效时间】
Account expires : never【账户过期时间】
Minimum number of days between password change : 0【两次改变密码之间相距最小天数】
Maximum number of days between password change : 99999【两次密码改变密码相距最大天数】
Number of days of warning before password expires : 7【密码过期前开始警告的天数】
Password expires和Password inactive区别
Last passwrd change + M天数 = Password expires
Maximum number of days between password chang=M天数
Password expires + I 天数 = Password inactive,看到此时 Password inactive 改成了在 Password expires基础上再加l天
Password expires期限之前,系统会提示你多少天后密码会到期
Password inactive之前登陆,系统会强制你改密码才能登陆,改完密码后Last password change,Password expires,Password inactive 都会根据你改时候的系统日期和相应的M和I的参数改变,改完系统照常进入
总结:密码到期(Password expires)登陆改完还能进系统,密码失效(Password inactive)就得找管理员啦~
Centos7修改用户密码失效时间
vim /etc/login.defs
修改如下参数
PASS_MAX_DAYS 90#设置登录密码有效期90天
PASS_MIN_DAYS 1 #登录密码最短修改时间,增加可以防止非法用户短期更改多次
PASS_MIN_LEN 8 #登录密码最小长度8位
PASS_WARN_AGE 7 #登录密码过期提前7天提示修改
FAIL_DELAY 10 #登录错误时等待时间10秒
FAILLOG_ENAB yes #登录错误记录到日志
SYSLOG_SU_ENAB yes #当限定超级用户管理日志时使用
SYSLOG_SG_ENAB yes #当限定超级用户组管理日志时使用
MD5_CRYPT_ENAB yes #当使用md5为密码的加密方法时使用
Run code
Cut to clipboard
可以通过
chage -l root
Run code
Cut to clipboard
系统已有用户:
chage [选项] 用户名
-m : 密码可更改的最小天数,为0时代表任何时候都可以更密码
-M : 密码保持有效的最大天数
-I : 列出用户以及密码的有效期
-w : 用户密码到期前,提前收到警告信息的天数
#chage -M 90 root 设置root用户的过期时间为90天后
# chage -I 5 root 设置root用户密码过期五天后,密码自动失效,用户将无法登陆系统
新用户:
编辑 /etc/login.defs
#PASS_MAX_DAYS 90
#PASS_MIN_DAYS 7
#PASS_MIN_LEN 8
#PASS_WARN_AGE 7
Run code
Cut to clipboard
文章:本地Linux CentOS7服务器安装笔记 发表时间:2023-05-29, 14:40:15
#95
作者:广西河池市
Linux中ping不通外网
在linux中ping www.baidu.com 无法ping通,可能原因是DNS没配置好
方法一:修改
方法二:
方法三:
如果添加了DNS还是无法ping外网,那就要查看路由中的网关设置
这就表示网关没有设置,添加路由网关
再次查看
添加成功,但是这种方法不是永久的,
重启服务器或者重启网卡后悔失效
保存退出,重启网卡验证
#,广西河池市,2023-05-27,15:30:43, 解决VMWARE虚拟机中CENTOS 7
报错PING: WWW.XXX.COM: NAME OR SERVICE NOT KNOWN
问题:CentOS 7中无法联网,如下所示:

其他可能由于网络原因造成的报错:
用yum时,报错cannot find a valid baseurl for repobase7x86_64;
以及用git clone时,报错Could not resolve host: github.com; Unknown error等。
3. 问题排查与解决
3.1 检查网络连接设置
使用命令,如果网络未连接,结果如下:
进一步确认
用
解决办法:输入,把里面的ONBOOT=no修改为ONBOOT=yes,保存退出。也可以在图形界面找到/etc/sysconfig/network-scripts/ifcfg-ens33进行点击修改,然后保存。
再输入重启网卡即可。
再ping,发现成功,解决问题。如果问题还在,继续往后看。
3.2 检查网关问题
使用命令查看网关配置,如果显示如下:
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
说明此时没有配置网关。
解决办法:修改/etc/resolv.conf文件,命令为,修改为如下内容:
通常虚拟机中cat /etc/resolv.conf默认是:
,再ping,
#,广西河池市,2023-05-27,15:33:14, centos7 name or service not known
centos7配置IP
使用 ip addr命令查看查看网卡名和是否有网络,获知网卡名为ens33
输入 ,修改ifcfg-ens33配置文件
输入systemctl restart network重启网络服务,使修改的配置文件生效
配置centos7的IP、子网掩码、网关
设置DNS地址
#,广西河池市,2023-05-27,15:35:26, CentOS 7 ISO 镜像下载
1、官网下载地址: https://www.centos.org/download/
具体镜像地址: http://isoredirect.centos.org/centos/7/isos/x86_64/
2、选择阿里云站点进行下载 http://mirrors.aliyun.com/centos/7/isos/x86_64/
各个版本的ISO镜像文件说明:
CentOS-7-x86_64-DVD-1708.iso 标准安装版(推荐)
CentOS-7-x86_64-Everything-1708.iso 完整版,集成所有软件(以用来补充系统的软件或者填充本地镜像)
CentOS-7-x86_64-LiveGNOME-1708.iso GNOME桌面版
CentOS-7-x86_64-LiveKDE-1708.iso KDE桌面版
CentOS-7-x86_64-Minimal-1708.iso 精简版,自带的软件最少
CentOS-7-x86_64-NetInstall-1708.iso 网络安装版(从网络安装或者救援系统)
#,广西河池市,2023-05-29,15:17:26,
制作启动盘
国内下载源和版本选择
选择 DVD 这个下载就可以了
使用UltraISO软碟通制作启动盘

然后就会加载很多的文件夹(如果加载不出来就是软碟通的版本问题)

写入U盘,建议先格式化




设置为U盘为默认启动项后,电脑会进入下面这个页面

选中Install CentOS Linux 7,按e(有些事按Tab)进入编辑模式后,在屏幕的最下面会出现当前运行的脚本命令
在linux中ping www.baidu.com 无法ping通,可能原因是DNS没配置好
方法一:修改
vi /etc/resolv.conf
增加如下内容:
nameserver 114.114.114.114 (电信的DNS)
nameserver 8.8.8.8(googel的DNS)
Run code
Cut to clipboard
方法二:
ip a 或者 ifconfig 查看使用的网卡然后进入/etc/sysconfig/network-scripts找到对应的网卡进行修改
vi /etc/sysconfig/network-scripts/ifcfg-ethx
DEVICE=ethx
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.101
NETMASK=255.255.255.0
DNS1=114.114.114.114
重启网卡 service network restart
Run code
Cut to clipboard
方法三:
如果添加了DNS还是无法ping外网,那就要查看路由中的网关设置
netstat -rn
Run code
Cut to clipboard
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.129.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Run code
Cut to clipboard
这就表示网关没有设置,添加路由网关
route add default gw 192.168.129.2(我的路由网关是这个)
Run code
Cut to clipboard
再次查看
netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.129.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.129.2 0.0.0.0 UG 0 0 0 eth0
Run code
Cut to clipboard
添加成功,但是这种方法不是永久的,
重启服务器或者重启网卡后悔失效
静态路由加到/etc/sysconfig/static-routes 文件中就行了,没有这个文件就新建一个
如 route add default gw 192.168.129.2
则文件中加入
any net default gw 192.168.129.2
Run code
Cut to clipboard
保存退出,重启网卡验证
报错PING: WWW.XXX.COM: NAME OR SERVICE NOT KNOWN
问题:CentOS 7中无法联网,如下所示:
其他可能由于网络原因造成的报错:
用yum时,报错cannot find a valid baseurl for repobase7x86_64;
以及用git clone时,报错Could not resolve host: github.com; Unknown error等。
3. 问题排查与解决
3.1 检查网络连接设置
使用命令
sudo nmcli d
Run code
Cut to clipboard
用
ls /etc/sysconfig/network-scripts/ifcfg-e*查看文件,因为每个人的网卡文件名可能有不同,我的这里是cat /etc/sysconfig/network-scripts/ifcfg-ens33,然后使用命令cat /etc/sysconfig/network-scripts/ifcfg-ens33,结果如下:[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=5db68001-983a-4391-8c8c-ad61b31799ba
DEVICE=ens33
ONBOOT=no # 设置不启动网卡果然这里设置默认不启动连接网络。
Run code
Cut to clipboard
解决办法:输入
vi /etc/sysconfig/network-scripts/ifcfg-ens33
Run code
Cut to clipboard
再输入
service network restart
Run code
Cut to clipboard
再ping,发现成功,解决问题。如果问题还在,继续往后看。
3.2 检查网关问题
使用
cat /etc/resolv.conf
Run code
Cut to clipboard
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
说明此时没有配置网关。
解决办法:修改/etc/resolv.conf文件,命令为
vi /etc/resolv.conf
Run code
Cut to clipboard
# Generated by NetworkManager
search localdomain
nameserver 192.168.211.2 # 虚拟机默认分配的
nameserver 114.114.114.114 # 电信的DNS
nameserver 8.8.8.8 # googel的DNS
Run code
Cut to clipboard
通常虚拟机中cat /etc/resolv.conf默认是:
search localdomain
nameserver 192.168.xxx.xxx # 这里取决于你的网络,每个人会有所区别
也可以添加一下DNS
nameserver 114.114.114.114 # 电信的DNS
nameserver 8.8.8.8 # googel的DNS
:wq保存退出后
Run code
Cut to clipboard
centos7配置IP
使用 ip addr命令查看查看网卡名和是否有网络,获知网卡名为ens33
输入
vi /etc/sysconfig/network-scripts/ifcfg-ens33
Run code
Cut to clipboard
输入systemctl restart network重启网络服务,使修改的配置文件生效
配置centos7的IP、子网掩码、网关
配置IP地址网关
cd /etc/sysconfig/network-scripts/ //进入到network-scripts目录下
vi ifcfg-ens33 //注意:显示有ip addr查看,编辑对应的ensxx
//修改以下内容
BOOTPROTO=static //启用静态IP地址
ONBOOT=yes //开启自动启用网络连接
//添加vmnet8的子网掩码和网关,ip要保证在192.168.126.x,还要保证唯一性
IPADDR=192.168.126.124 //设置IP地址
NETMASK=255.255.255.0 //子网掩码
GATEWAY=192.168.126.2 //设置网关
Run code
Cut to clipboard
设置DNS地址
vi /etc/resolv.conf //编辑 resolv.conf文件
nameserver 114.114.114.114 //添加DNS地址
Run code
Cut to clipboard
1、官网下载地址: https://www.centos.org/download/
具体镜像地址: http://isoredirect.centos.org/centos/7/isos/x86_64/
2、选择阿里云站点进行下载 http://mirrors.aliyun.com/centos/7/isos/x86_64/
各个版本的ISO镜像文件说明:
CentOS-7-x86_64-DVD-1708.iso 标准安装版(推荐)
CentOS-7-x86_64-Everything-1708.iso 完整版,集成所有软件(以用来补充系统的软件或者填充本地镜像)
CentOS-7-x86_64-LiveGNOME-1708.iso GNOME桌面版
CentOS-7-x86_64-LiveKDE-1708.iso KDE桌面版
CentOS-7-x86_64-Minimal-1708.iso 精简版,自带的软件最少
CentOS-7-x86_64-NetInstall-1708.iso 网络安装版(从网络安装或者救援系统)
制作启动盘
国内下载源和版本选择
选择 DVD 这个下载就可以了
使用UltraISO软碟通制作启动盘
然后就会加载很多的文件夹(如果加载不出来就是软碟通的版本问题)
写入U盘,建议先格式化
设置为U盘为默认启动项后,电脑会进入下面这个页面
选中Install CentOS Linux 7,按e(有些事按Tab)进入编辑模式后,在屏幕的最下面会出现当前运行的脚本命令
文章:本地Linux CentOS7服务器安装笔记 发表时间:2023-05-27, 15:25:28
1.使用 curl
比如我们有下面这两张图片:
$images = [ 'https://dn-laravist.qbox.me/2015-09-22_00-17-06j.png', 'https://dn-laravist.qbox.me/2015-09-23_00-58-03j.png' ];
第一步,我们可以直接来使用最简单的代码实现:
function download($url, $path = 'images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); }
那在下载远程图片的时候就可以这样:
foreach ( $images as $url ) { download($url); }
2.封装一个类
缕清思路之后,我们可以将这个基本的功能封装到一个类中:
class Spider { public function downloadImage($url, $path = 'images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); } }
在者,我们还可以这样稍微优化一下:
public function downloadImage($url, $path='images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $this->saveAsImage($url, $file, $path); } private function saveAsImage($url, $file, $path) { $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); }
封装成类之后,我们可以这样调用代码来下载图片:
$spider = new Spider(); foreach ( $images as $url ) { $spider->downloadImage($url); }