存档

2020年11月 的存档

全国互联网安全管理服务平台-beian.gov.cn备案的示例图片

2020年11月19日 评论已被关闭




分类: 张宏良张洪量 标签:

ubuntu服务器安装php geoip拓展教程

2020年11月13日 评论已被关闭

我们可以安装php的geoip拓展来实现获取国家等ip地理信息,简单的说就是实现这个链接的函数功能:https://www.php.net/manual/en/book.geoip.php,如果没有安装拓展,这个链接上面函数的功能是不能使用的。

参考链接:
https://www.maxmind.com/en/home
https://www.miyuru.lk/geoiplegacy(这里可以下载到geoip的dat文件)
https://pecl.php.net/package/geoip
https://www.php.net/manual/en/geoip.setup.php
https://www.php.net/manual/en/book.geoip.php
https://db-ip.com/
https://db-ip.com/db/download/ip-to-city-lite
https://members.ip-api.com/#pricing
https://serverpilot.io/docs/how-to-install-the-php-geoip-extension/
https://blog.csdn.net/xpy870663266/article/details/94742491
https://valynkin.ru/maxmind-geoip2-na-ubuntu-1604-php56.html
https://blog.csdn.net/weixin_34245082/article/details/92028414

简单总结下ubuntu服务器安装php geoip拓展的过程吧
一开始我是在一台vps下操作,源是阿里云的源,装了php5.6,按照网上的搜索依次执行命令,发现遇到各种问题,上方的链接有的也是其中的解决办法,但是就是不行。后来换了一台服务器是官方源,sudo apt-get update之后,可以看到有php5.6-geoip拓展,输入sudo apt-get install php5.6-(按tab键可提示),这样的话就简单了(我怀疑是源的问题,没调试了)
可以看到apt-get里面的拓展,这样就方便了,不用自己编译安装,执行:
sudo apt-get install php5.6-geoip
执行完毕在/usr/share/GeoIP可以看到.dat文件和ipv6的dat文件
是执行完毕后,重启php5.6-fpm,发现问题了,discuz论坛无法回帖了,不过还好,我的需求是php7.4支持就可以了(我的服务器上是php5.6和php7.4共存的),所以我只需要执行:
sudo apt-get install php7.4-geoip
执行完毕后,重启php7.4-fpm,搞定

ubuntu服务器安装php geoip拓展教程就写到这里,只适合本人自己阅读,网友仅供参考(服务器环境有很大区别)

下面备注自动更新数据库的操作方法:
打开maxmind.com:登录后,个人中心:Services->My License Key
创建key之后,点击Download Config下载GeoIP.conf到/etc/GeoIP.conf
sudo apt-get install geoipupdate
安装好之后,需要更新的时候执行:geoipupdate -v
这样就可以自动更新了(可以定时任务执行)
参考:https://www.awaimai.com/2117.html

可以先执行php:var_dump(geoip_database_info());打印当前版本的信息,然后更新之后,再运行一次php,对比2次版本不同。

可是我们发现,/usr/share/GeoIp下面的.dat文件并没有更新,经过测试,从https://www.miyuru.lk/geoiplegacy下载最新的,然后执行:
sduo cd /usr/share/GeoIp/
sudo mkdir test
cd test
sudo wget https://dl.miyuru.lk/geoip/maxmind/city/maxmind4.dat.gz
sudo gunzip maxmind4.dat.gz
sudo wget https://dl.miyuru.lk/geoip/maxmind/city/maxmind6.dat.gz
sudo gunzip maxmind6.dat.gz
cd ../
sudo mv GeoIP.dat GeoIP.dat.bk
sudo mv GeoIPv6.dat GeoIPv6.dat.bk
sudo mv test/maxmind4.dat GeoIP.dat
sudo mv test/maxmind6.dat GeoIPv6.dat
sudo service php7.4-fpm restart
最后php执行:var_dump(geoip_database_info());似乎报错,所以就不折腾了,可能拓展安装的只有等拓展更新了才能更新数据库?有待验证

特别备注:获取ipv6的信息,要使用:
var_dump(geoip_country_code_by_name_v6(‘2601:8:be00:cf20:ca60:ff:fe09:35b5’));


分类: php学习, ubuntu高手 标签: , , , ,

mysqldump选择gzip压缩之后为.tar.gz格式如何再次导入

2020年11月12日 评论已被关闭

在使用mysqldump备份数据库的时候导出的时候一般有2种选择,压缩和不压缩

参见文章:
【实战】linux下mysql导入和导出数据库,source和mysqldump命令
http://www.zhanghongliang.com/article/498

这里我们记录下压缩的格式再次导入的特殊问题:mysqldump选择gzip压缩之后为.tar.gz格式如何再次导入

在上方链接的文章中,压缩命令是:

mysqldump -hlocalhost -uroot -p --quick 数据库名称 | gzip > /backup/备份文件名.sql.gz

但是往往有些人会用这个命令,导致压缩包格式为.tar.gz

mysqldump -hlocalhost -uroot -p --quick 数据库名称 | gzip > /backup/备份文件名.sql.tar.gz

那么当mysqldump选择gzip压缩之后为.tar.gz格式如何再次导入?请参考:
A,假设我们在windows服务器上操作,直接把备份文件名.sql.tar.gz(比如abc.sql.tar.gz)下载到本地windows,然后选择7-zip来操作,右键abc.sql.tar.gz,7-zip,提取到“abc.sql.tar\”;再使用source命令导入abc.sql.tar即可完成再次导入

B,假设我们在linux服务器上直接再次导入,可以
1,执行sudo gunzip abc.sql.tar.gz,得到:abc.sql.tar
2,source abc.sql.tar

这样我们就解决了.tar.gz再次导入的问题

php自定义的magicStr过滤类

2020年11月2日 评论已被关闭
<?php
//使用说明:http://www.zhanghongliang.com/article/1507
class magicStr{
	//入库操作
	function encode($str,$inputType='text'){
		if($inputType=='text'){
			//此种类型应该过滤换行符,再去左右空格(建议过滤nl换行,不过滤也不影响)
			return trim(str_replace(array("\\r\\n","\\r","\\n"),'',str_replace(array("\r\n","\r","\n"),'',$str)));
		}
		else if($inputType=='textarea'){return $str;}
		else if($inputType=='editor'){return $str;}
		else {return '';}
	}
	
    //pc+h5端返回处理函数
    function decode($str,$inputType='text'){
        if($inputType=='text'){return htmlspecialchars(trim($str),ENT_QUOTES);}
		else if($inputType=='in_text'){return htmlspecialchars($str,ENT_QUOTES);}
        else if($inputType=='textarea'){return nl2br(htmlspecialchars($str,ENT_QUOTES));}
        else if($inputType=='in_textarea'){return htmlspecialchars($str,ENT_QUOTES);}
        else if($inputType=='editor'){return $this->replaceLabel($this->removeScript($str));}
        else if($inputType=='in_editor'){
			//kindeditor要求必须是转为实体之后的赋值,也可以增加$this->removeScript($str),因为只要前台过滤即可
            return htmlspecialchars($str,ENT_QUOTES);
        }
		else if($inputType=='meta_title'){
			//当输出到meta中的title的时候,不建议使用textarea或者editor内容,只建议用input type="text"这种输入框
			return htmlspecialchars($str,ENT_QUOTES);
		}
		else if($inputType=='meta_keywords'){return htmlspecialchars($this->compress_html($str),ENT_QUOTES);}
		else if($inputType=='meta_description'){return mb_substr(htmlspecialchars($this->compress_html($str),ENT_QUOTES),0,210);}
        else {return '';}
    }

    //app端返回处理函数(在需要php处理的情况下)
	//$withHtmlBody为是否app端拼接了标准的html头和尾标签:<!doctype html><html><head><meta charset="utf-8"><title>标题</title></head><body>$str</body></html>
    function decodeApp($str,$inputType='text',$withHtmlBody=true){
		if($inputType=='text'){return $str;}
		else if($inputType=='in_text'){return $str;}
        else if($inputType=='textarea'){
			//如果app端拼接html头和尾则应该转义后返回(我们的项目实际上都拼了),否则可以直接返回
			if($withHtmlBody===true){return htmlspecialchars($str,ENT_QUOTES);}
			else {return $str;}
		}
        else if($inputType=='in_textarea'){return $str;}
        else if($inputType=='editor'){return preg_replace('/<br\\s*?\/??>/i','',$this->replaceLabel($this->removeScript($str)));}
        else if($inputType=='in_editor'){return 'app不允许富文本编辑';}
        else {return '';}
    }
	
    //小程序端返回处理函数(在需要php处理的情况下)
    function decodeWeixin($str,$inputType='text'){
		if($inputType=='text'){return $str;}
		else if($inputType=='in_text'){return $str;}
        else if($inputType=='textarea'){return $str;}
        else if($inputType=='in_textarea'){return $str;}
        else if($inputType=='editor'){
			//经过测试,微信小程序端只有editor类型需要处理,其他类型直接返回即可
        	//经过测试,小程序端和app端不一样,小程序端不需要和removeScript,但是要做下方处理:
			return $this->replaceLabel(htmlspecialchars_decode(preg_replace('/<br\\s*?\/??>/i','',$str),ENT_QUOTES));
		}
        else if($inputType=='in_editor'){return 'weixin不允许富文本编辑';}
        else {return '';}
    }

	//替换指定的html标签(富文本编辑器修改了插入标签之后的代码,显示的时候需要替换正确)
	function replaceLabel($str){
		return preg_replace('/(\[)(embed.*?)(\/\])/is','<$2>',preg_replace('/\]\[\/iframe\]/is','></iframe>',preg_replace('/\[iframe/is','<iframe',$str)));
		//也可以是<$2/>表示用单标签结尾
    }
	
	//压缩html
	function compress_html($string) {
		return trim(preg_replace(array("/> *([^ ]*) *</","/<!--[^!]*-->/","'/\*[^*]*\*/'","/\r\n/","/\n/","/\t/",'/>[ ]+</'),array(">\\1<",'','','','','','><'),$string));
	}

	//过滤一些script标签和代码
    function removeScript($str=''){
		return preg_replace(array(
			"/(java|vb)script/i",
			"/href *= *[\s\S]*script *:/si",
			
			//过滤字符串中的on***=,(onclick,onchange,onblur等等等)事件,忽略大小写(i),特殊字符圆点,中包含换行符 \n(s)
			"/on([a-z]+)\s*=/si",
			
			//不用preg_replace("/<(i?frame.*?)>(.*?)<(\/i?frame.*?)>/si",'',$str);的原因是比如<iframe src="https://www.a.com">会无法过滤,但是前段可以正常显示
			//同样会过滤frameset
			"/<(\/?i?frame.*?)>/si",
			"/<(\/?object.*?)>/si",//道理同上方的iframe过滤
			"/<(\/?embed.*?)>/si",//道理同上方的iframe过滤
			
			//过滤所有<script(任意字符)>(任意字符)</script(任意字符)>结尾的标签字符 和前条过滤script标签重合
			//不用preg_replace("/<(\/?script.*)>/si",'',$str);是因为</script>不闭合的话,前段无法执行
			"/<(script.*?)>(.*?)<(\/script.*?)>/si",
			
			//使用preg_replace("/<(\/?head.*?|\/?title.*?|meta.*?|link.*?)>/si",'',$str);可以保留中间的内容
        	//使用下方的会过滤中间的内容
			"'<head[^>]*?>.*?</head>'is",
            "'<title[^>]*?>.*?</title>'is",
            "'<meta[^>]*?>'is",
            "'<link[^>]*?>'is"
		),'',$str);
    }
	
	//ajax返回处理函数(ajax建议用前端magicStr.js处理,节省php资源)
	/*
    function decodeAjax($str,$inputType='text'){
        if($inputType=='text'){return htmlspecialchars($str,ENT_QUOTES);}
		else if($inputType=='in_text'){return $str;}
        else if($inputType=='textarea'){return nl2br(htmlspecialchars($str,ENT_QUOTES));}
        else if($inputType=='in_textarea'){
            return $str;//和decode()不一样,ajax直接返回即可,因为前端是.val赋值
        }
        else if($inputType=='editor'){return $this->replaceLabel($this->removeScript($str));}
        else if($inputType=='in_editor'){
            //和decode()不一样,ajax直接返回即可,因为前端是.val赋值
			//编辑器输出的时候,其实可以不用走$inputType=='editor'中的$this->removeScript($str),因为只要前台过滤即可
			return $str;
        }
		else if($inputType=='meta_title'){return htmlspecialchars($str,ENT_QUOTES);}
        else {return '';}
    }
	*/

}

具体请参照文件:magicStr.rar

分类: html总结, php学习 标签: , , , ,
css.php