前端localStorage实现缓存可存储任何数据设置有效期

PHP网站管理员 Published the article • 0 comments • 1281 views • 2017-07-25 23:29 • 来自相关话题

localStorage是HTML5的一个新特性,可以实现web存储,以前前端的存储最多是以cookie最为存储,可以设置键值对的有效期,但是cookie作为存储是有局限性的,存储量太小了,localStorage可以在不影响网站的性能实现大数据量的存储,然后这个localStorage没有时间的限制,多久都可以持续使用,只要用户不打开console控制台,清空localStorage的键值对
下面封装了对象的功能:前端缓存添加,前端缓存获取,前端缓存删除;
```js
/**
* Created by ydl on 2017/7/25.
*/
(function() {
if (!this.localStorage) {
throw 'nonsupport local storage';
}
var cache_instance = this.localStorage;
var cache = {
set: function(key, value) {
var data = JSON.stringify(value);
cache_instance.setItem(key, data);
},
get: function(key) {
var data = cache_instance.getItem(key);
return JSON.parse(data);
},
delete: function(key) {
cache_instance.removeItem(key);
}
}
this.cache = cache;
})(this);
```

上面的这个是缓存增加,获取,删除,但是没有实现有效期,下面我们只需要在数据里面添加一个字段,然后把这些数据放到一个对象里面,一个字段是expire_at还有一个字段是content,content这个字段就是存储我们的实际数据。
 
```js
(function() {
if (!this.localStorage) {
throw 'nonsupport local storage';
}

var getTimestamp = function() {
return Date.parse(new Date())
};

var cache_instance = this.localStorage;
console.log(cache_instance)
var Cache = {
set: function(key, value, ttl) {
if (ttl) {
value = {
expire_at: getTimestamp() + ttl * 1000,
content: value,
}
}
console.log(value);
var data = JSON.stringify(value);
cache_instance.setItem(key, data);
},

get: function(key) {
var _data = cache_instance.getItem(key),
data;
try {
data = JSON.parse(_data)
} catch (e) {
return _data;
}
console.log(data)
if (!data) {
return null;
} else if (typeof data.expire_at != 'undefined') {
if (data.expire_at > getTimestamp()) {
return data.content;
}
cache.delete(key);
return null;
} else {
return data;
}
},

delete: function(key) {
cache_instance.removeItem(key);
}
}
this.Cache = Cache;
})(this);
```

### 实例测试

代码里面多了一个函数获取时间戳的函数,这个时间戳函数获取的毫秒级数据,
所以我们的时间需要在乘以1000。 如下缓存的调用:
 
```js


Cache.set('a', '前端localStorage缓存'); // 设置永久缓存
Cache.set('ab', '前端开发', 100) // 设置100s缓存时间
console.log(Cache.get('ab')) // 获取键 ab 的值
Cache.delete('ab') // 删除缓存 ab


```
这是一个前端localStorage的开发流程,实现,输出案例。 查看全部
localStorage是HTML5的一个新特性,可以实现web存储,以前前端的存储最多是以cookie最为存储,可以设置键值对的有效期,但是cookie作为存储是有局限性的,存储量太小了,localStorage可以在不影响网站的性能实现大数据量的存储,然后这个localStorage没有时间的限制,多久都可以持续使用,只要用户不打开console控制台,清空localStorage的键值对
下面封装了对象的功能:前端缓存添加,前端缓存获取,前端缓存删除;
```js
/**
* Created by ydl on 2017/7/25.
*/
(function() {
if (!this.localStorage) {
throw 'nonsupport local storage';
}
var cache_instance = this.localStorage;
var cache = {
set: function(key, value) {
var data = JSON.stringify(value);
cache_instance.setItem(key, data);
},
get: function(key) {
var data = cache_instance.getItem(key);
return JSON.parse(data);
},
delete: function(key) {
cache_instance.removeItem(key);
}
}
this.cache = cache;
})(this);
```

上面的这个是缓存增加,获取,删除,但是没有实现有效期,下面我们只需要在数据里面添加一个字段,然后把这些数据放到一个对象里面,一个字段是expire_at还有一个字段是content,content这个字段就是存储我们的实际数据。
 
```js
(function() {
if (!this.localStorage) {
throw 'nonsupport local storage';
}

var getTimestamp = function() {
return Date.parse(new Date())
};

var cache_instance = this.localStorage;
console.log(cache_instance)
var Cache = {
set: function(key, value, ttl) {
if (ttl) {
value = {
expire_at: getTimestamp() + ttl * 1000,
content: value,
}
}
console.log(value);
var data = JSON.stringify(value);
cache_instance.setItem(key, data);
},

get: function(key) {
var _data = cache_instance.getItem(key),
data;
try {
data = JSON.parse(_data)
} catch (e) {
return _data;
}
console.log(data)
if (!data) {
return null;
} else if (typeof data.expire_at != 'undefined') {
if (data.expire_at > getTimestamp()) {
return data.content;
}
cache.delete(key);
return null;
} else {
return data;
}
},

delete: function(key) {
cache_instance.removeItem(key);
}
}
this.Cache = Cache;
})(this);
```

### 实例测试

代码里面多了一个函数获取时间戳的函数,这个时间戳函数获取的毫秒级数据,
所以我们的时间需要在乘以1000。 如下缓存的调用:
 
```js

```
这是一个前端localStorage的开发流程,实现,输出案例。

网站如何防御ddos CC流量攻击,openresty+lua是不错的选择

Openresty网站管理员 Published the article • 0 comments • 2321 views • 2017-07-23 17:42 • 来自相关话题

> 下面的内容是github的有一个项目,但是他的实现方式是用内存共享的方式实现的,要知道,如果nginx重启之后,内存里面的东西就会被释放掉,这样我们记录的东西就会没有了,当流量大了,我们的内存可能吃不消,所以我们可以采用redis来存储,redis支持分布式的存储,持久化,大大的减少了这点的弊端。

### ngx_lua_waf

`ngx_lua_waf`是我刚入职趣游时候开发的一个基于ngx_lua的web应用防火墙。

代码很简单,开发初衷主要是使用简单,高性能和轻量级。

现在开源出来,遵从MIT许可协议。其中包含我们的过滤规则。如果大家有什么建议和想fa,欢迎和我一起完善。

###用途:

1. 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
2. 防止svn/备份之类文件泄漏
3. 防止ApacheBench之类压力测试工具的攻击
4. 屏蔽常见的扫描黑客工具,扫描器
5. 屏蔽异常的网络请求
6. 屏蔽图片附件类目录php执行权限
7. 防止webshell上传

###推荐安装:

推荐使用`lujit2.1`做lua支持
`ngx_lua`如果是0.9.2以上版本,建议正则过滤函数改为ngx.re.find,匹配效率会提高三倍左右。

###使用说明:

nginx安装路径假设为:`/usr/local/nginx/conf/`
把ngx_lua_waf下载到conf目录下,解压命名为waf
在nginx.conf的http段添加

```conf
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
```
配置config.lua里的waf规则目录(一般在waf/conf/目录下)

```lua
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
```
绝对路径如有变动,需对应修改

然后重启nginx即可

###配置文件详细说明:

```lua
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
--规则存放目录
attacklog = "off"
--是否开启攻击信息记录,需要配置logdir
logdir = "/usr/local/nginx/logs/hack/"
--log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
UrlDeny="on"
--是否拦截url访问
Redirect="on"
--是否拦截后重定向
CookieMatch = "on"
--是否拦截cookie攻击
postMatch = "on"
--是否拦截post攻击
whiteModule = "on"
--是否开启URL白名单
black_fileExt={"php","jsp"}
--填写不允许上传文件后缀类型
ipWhitelist={"127.0.0.1"}
--ip白名单,多个ip用逗号分隔
ipBlocklist={"1.0.0.1"}
--ip黑名单,多个ip用逗号分隔
CCDeny="on"
--是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
CCrate = "100/60"
--设置cc攻击频率,单位为秒.
--默认1分钟同一个IP只能请求同一个地址100次
html=[[Please go away~~]]
--警告内容,可在中括号内自定义
```
`备注:不要乱动双引号,区分大小写`

###检查规则是否生效

部署完毕可以尝试如下命令:

```bash
curl http://xxxx/test.php?id=../etc/passwd
```
返回"Please go away~~"字样,说明规则生效。
注意:默认,本机在白名单不过滤,可自行调整config.lua配置

###规则更新:

考虑到正则的缓存问题,动态规则会影响性能,所以暂没用共享内存字典和redis之类东西做动态管理。
规则更新可以把规则文件放置到其他服务器,通过crontab任务定时下载来更新规则,`nginx reload`即可生效。以保障`ngx lua waf`的高性能。
只记录过滤日志,不开启过滤,在代码里在check前面加上--注释即可,如果需要过滤,反之。

###一些说明:

过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割

1. args里面的规则get参数进行过滤的
2. url是只在get请求url过滤的规则
3. post是只在post请求过滤的规则
4. whitelist是白名单,里面的url匹配到不做过滤
5. user-agent是对user-agent的过滤规则

默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分`--`注释即可
日志文件名称格式如下:`虚拟主机名_sec.log` 查看全部

> 下面的内容是github的有一个项目,但是他的实现方式是用内存共享的方式实现的,要知道,如果nginx重启之后,内存里面的东西就会被释放掉,这样我们记录的东西就会没有了,当流量大了,我们的内存可能吃不消,所以我们可以采用redis来存储,redis支持分布式的存储,持久化,大大的减少了这点的弊端。

### ngx_lua_waf

`ngx_lua_waf`是我刚入职趣游时候开发的一个基于ngx_lua的web应用防火墙。

代码很简单,开发初衷主要是使用简单,高性能和轻量级。

现在开源出来,遵从MIT许可协议。其中包含我们的过滤规则。如果大家有什么建议和想fa,欢迎和我一起完善。

###用途:

1. 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
2. 防止svn/备份之类文件泄漏
3. 防止ApacheBench之类压力测试工具的攻击
4. 屏蔽常见的扫描黑客工具,扫描器
5. 屏蔽异常的网络请求
6. 屏蔽图片附件类目录php执行权限
7. 防止webshell上传

###推荐安装:

推荐使用`lujit2.1`做lua支持
`ngx_lua`如果是0.9.2以上版本,建议正则过滤函数改为ngx.re.find,匹配效率会提高三倍左右。

###使用说明:

nginx安装路径假设为:`/usr/local/nginx/conf/`
把ngx_lua_waf下载到conf目录下,解压命名为waf
在nginx.conf的http段添加

```conf
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
```
配置config.lua里的waf规则目录(一般在waf/conf/目录下)

```lua
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
```
绝对路径如有变动,需对应修改

然后重启nginx即可

###配置文件详细说明:

```lua
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
--规则存放目录
attacklog = "off"
--是否开启攻击信息记录,需要配置logdir
logdir = "/usr/local/nginx/logs/hack/"
--log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
UrlDeny="on"
--是否拦截url访问
Redirect="on"
--是否拦截后重定向
CookieMatch = "on"
--是否拦截cookie攻击
postMatch = "on"
--是否拦截post攻击
whiteModule = "on"
--是否开启URL白名单
black_fileExt={"php","jsp"}
--填写不允许上传文件后缀类型
ipWhitelist={"127.0.0.1"}
--ip白名单,多个ip用逗号分隔
ipBlocklist={"1.0.0.1"}
--ip黑名单,多个ip用逗号分隔
CCDeny="on"
--是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
CCrate = "100/60"
--设置cc攻击频率,单位为秒.
--默认1分钟同一个IP只能请求同一个地址100次
html=[[Please go away~~]]
--警告内容,可在中括号内自定义
```
`备注:不要乱动双引号,区分大小写`

###检查规则是否生效

部署完毕可以尝试如下命令:

```bash
curl http://xxxx/test.php?id=../etc/passwd
```
返回"Please go away~~"字样,说明规则生效。
注意:默认,本机在白名单不过滤,可自行调整config.lua配置

###规则更新:

考虑到正则的缓存问题,动态规则会影响性能,所以暂没用共享内存字典和redis之类东西做动态管理。
规则更新可以把规则文件放置到其他服务器,通过crontab任务定时下载来更新规则,`nginx reload`即可生效。以保障`ngx lua waf`的高性能。
只记录过滤日志,不开启过滤,在代码里在check前面加上--注释即可,如果需要过滤,反之。

###一些说明:

过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割

1. args里面的规则get参数进行过滤的
2. url是只在get请求url过滤的规则
3. post是只在post请求过滤的规则
4. whitelist是白名单,里面的url匹配到不做过滤
5. user-agent是对user-agent的过滤规则

默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分`--`注释即可
日志文件名称格式如下:`虚拟主机名_sec.log`

从北京来到了重庆

我来重庆后网站管理员 Published the article • 0 comments • 487 views • 2017-07-22 22:23 • 来自相关话题

2017-06-07 
从北京来到了重庆。
毕业两年,跨专业来到了一个我当时向往的行业,在校期间已经开始动手编程了,也接过不少的私活,怀揣着侥幸心理,希望能被人可以,没想到自己是如此的幸运,遇到了我人生的贵人,也许是看着我干活比较认真,还有学习能力比较强的原因吧,我在毕业前两个月开始了互联网工作的实习期,我感觉我真的太幸运了,正式与互联网接轨。
这是一个创业公司,人不多,但是贵人是个大牛,见识广,可以说对于我一个没见过什么世面的人来说,他真的是打开我认知大门的人,这两个月学到了很多的东西,我的兴趣每天都在激涨,毕业后顺利的进入了这家公司,拿到了同学们羡慕惊叹的薪酬,我当时也觉得不可思议,生活质量从那时候起不断的在提升,品味也被不断的培养提升。
谢谢你。
在公司呆了快一年了,但是好景不长,我们经营不善,慢慢地进入了减员,给员工找出路的地步,多么地舍不得,我们是坚持到最后的,最后我们不得不离开了,我顺利的被我的老板推荐到了另一家有钱的公司,日子当然也过得越来越好,但是那种工作的激情再也没有了。
在这个时候我遇到了我的爱情,我想照顾一生的女人。
她,性格开朗,活泼自在,能给我的生活带来光明,是我的小太阳,她给了我很多生活的灵感。
我,内向闷骚,轻度抑郁,不知道是比较宅,还是个人枯燥。自从遇到了她,我的整个生活发生了变化,变得多姿多彩。
相处这么久了,发现自己越来越离不开她了。看着北京日趋上涨的房价,我的归属感越来越低,我想我要离开这里了。
对了,忘了说了,去年的这个时候我和她一起回到了她的家乡重庆,这是一个美丽的山城,轻轨,小面,火锅,美丽的夜景深深地吸引着我,我想我会和她在这个地方生活下去的
重庆是一个让人流连忘返的城市,所以我来了。
(接下来会谈谈我在重庆的工作和生活) 查看全部
2017-06-07 
从北京来到了重庆。
毕业两年,跨专业来到了一个我当时向往的行业,在校期间已经开始动手编程了,也接过不少的私活,怀揣着侥幸心理,希望能被人可以,没想到自己是如此的幸运,遇到了我人生的贵人,也许是看着我干活比较认真,还有学习能力比较强的原因吧,我在毕业前两个月开始了互联网工作的实习期,我感觉我真的太幸运了,正式与互联网接轨。
这是一个创业公司,人不多,但是贵人是个大牛,见识广,可以说对于我一个没见过什么世面的人来说,他真的是打开我认知大门的人,这两个月学到了很多的东西,我的兴趣每天都在激涨,毕业后顺利的进入了这家公司,拿到了同学们羡慕惊叹的薪酬,我当时也觉得不可思议,生活质量从那时候起不断的在提升,品味也被不断的培养提升。
谢谢你。
在公司呆了快一年了,但是好景不长,我们经营不善,慢慢地进入了减员,给员工找出路的地步,多么地舍不得,我们是坚持到最后的,最后我们不得不离开了,我顺利的被我的老板推荐到了另一家有钱的公司,日子当然也过得越来越好,但是那种工作的激情再也没有了。
在这个时候我遇到了我的爱情,我想照顾一生的女人。
她,性格开朗,活泼自在,能给我的生活带来光明,是我的小太阳,她给了我很多生活的灵感。
我,内向闷骚,轻度抑郁,不知道是比较宅,还是个人枯燥。自从遇到了她,我的整个生活发生了变化,变得多姿多彩。
相处这么久了,发现自己越来越离不开她了。看着北京日趋上涨的房价,我的归属感越来越低,我想我要离开这里了。
对了,忘了说了,去年的这个时候我和她一起回到了她的家乡重庆,这是一个美丽的山城,轻轨,小面,火锅,美丽的夜景深深地吸引着我,我想我会和她在这个地方生活下去的
重庆是一个让人流连忘返的城市,所以我来了。
(接下来会谈谈我在重庆的工作和生活)

mysql数据库400W如何处理数据去重

Linux网站管理员 Published the article • 0 comments • 909 views • 2017-07-22 21:08 • 来自相关话题

使用```select count```查看一下数据库数据量

```mysql
mysql> select count(*) from zyads_integral ;
+----------+
| count(*) |
+----------+
| 4130473 |
+----------+
1 row in set (0.01 sec)
```
``desc`查看一下数据表结构

```mysql
mysql> desc zyads_integral;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| hash | text | YES | | NULL | |
| sha1 | text | NO | | NULL | |
| name | text | NO | | NULL | |
| index | text | YES | | NULL | |
| size | text | YES | | NULL | |
+-------+---------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
```

样例数据

```mysql
mysql> select * from zyads_integral limit 1\G
*************************** 1. row ***************************
id: 6721212
hash: 0FA565EEFA9E688B1F87640815EE090C7326725D
sha1: 8c907b045bb7905cf2a63f0b1208eeb3bca857d6
name: 【无效链接】xxxxxx.html
index: 107
size: 78110108
1 row in set (0.01 sec)
```

接下来开始去掉重复数据
```mysql
mysql> select id, sha1, count(*) from zyads_integral group by sha1 limit 10;
+---------+------------------------------------------+----------+
| id | sha1 | count(*) |
+---------+------------------------------------------+----------+
| 7696 | | 1 |
| 5137851 | 0000000000000000000000000000000005325911 | 2 |
| 5363699 | 00000000000000000000000000000000097ecf88 | 5 |
| 4826139 | 000000000000000000000000000000000fd81983 | 1 |
| 6250586 | 000000000000000000000000000000001b41f909 | 1 |
| 5597063 | 000000000000000000000000000000001d385b7c | 2 |
| 5281295 | 000000000000000000000000000000002a91e078 | 2 |
| 6331972 | 000000000000000000000000000000003488380d | 2 |
| 4774906 | 00000000000000000000000000000000397db43d | 1 |
| 4550736 | 00000000000000000000000000000000494ec71f | 1 |
+---------+------------------------------------------+----------+
10 rows in set (24.71 sec)

mysql> select count(*) from zyads_integral where sha1= '0000000000000000000000000000000005325911';
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (1.03 sec)

mysql> select id, count(*) from zyads_integral group by sha1 having count(*) > 1;
+---------+----------+
| id | count(*) |
+---------+----------+
| 5137851 | 2 |
| 5363699 | 5 |
| 5597063 | 2 |
| 5281295 | 2 |
...
| 4712249 | 6 |
| 1581236 | 3 |
| 5126827 | 2 |
| 1872277 | 7 |
+---------+----------+
836343 rows in set (33.77 sec)
mysql> select id from zyads_integral group by sha1 having count(*) >= 1;
+---------+
| id |
+---------+
| 7696 |
| 5137851 |
| 5363699 |
| 4826139 |
| 6250586 |
...
| 5126827 |
| 570573 |
| 1872277 |
| 4514446 |
+---------+
2466076 rows in set (3 min 36.80 sec)
```

### 删除数据

```mysql
mysql> delete from zyads_integral where id in (select a.id from (select id from zyads_integral group by sha1 having count(*) > 1) a);
CREATE TABLE `zyads_integral_tmp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hash` varchar(100),
`sha1` varchar(100) NOT NULL,
`name` varchar(1000) NOT NULL,
`index` varchar(10),
`size` varchar(10),
UNIQUE KEY `sha1` (`sha1`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6756155 DEFAULT CHARSET=gbk

INSERT INTO zyads_integral_tmp (`hash`,`sha1`,`name`,`index`,`size`) SELECT `hash`,`sha1`,`name`,`index`,`size` from zyads_integral group by sha1 having count(*)>=1;

mysql> rename zyads_integral zyads_integral_tmp_1 ;

``` 查看全部

使用```select count```查看一下数据库数据量

```mysql
mysql> select count(*) from zyads_integral ;
+----------+
| count(*) |
+----------+
| 4130473 |
+----------+
1 row in set (0.01 sec)
```
``desc`查看一下数据表结构

```mysql
mysql> desc zyads_integral;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| hash | text | YES | | NULL | |
| sha1 | text | NO | | NULL | |
| name | text | NO | | NULL | |
| index | text | YES | | NULL | |
| size | text | YES | | NULL | |
+-------+---------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
```

样例数据

```mysql
mysql> select * from zyads_integral limit 1\G
*************************** 1. row ***************************
id: 6721212
hash: 0FA565EEFA9E688B1F87640815EE090C7326725D
sha1: 8c907b045bb7905cf2a63f0b1208eeb3bca857d6
name: 【无效链接】xxxxxx.html
index: 107
size: 78110108
1 row in set (0.01 sec)
```

接下来开始去掉重复数据
```mysql
mysql> select id, sha1, count(*) from zyads_integral group by sha1 limit 10;
+---------+------------------------------------------+----------+
| id | sha1 | count(*) |
+---------+------------------------------------------+----------+
| 7696 | | 1 |
| 5137851 | 0000000000000000000000000000000005325911 | 2 |
| 5363699 | 00000000000000000000000000000000097ecf88 | 5 |
| 4826139 | 000000000000000000000000000000000fd81983 | 1 |
| 6250586 | 000000000000000000000000000000001b41f909 | 1 |
| 5597063 | 000000000000000000000000000000001d385b7c | 2 |
| 5281295 | 000000000000000000000000000000002a91e078 | 2 |
| 6331972 | 000000000000000000000000000000003488380d | 2 |
| 4774906 | 00000000000000000000000000000000397db43d | 1 |
| 4550736 | 00000000000000000000000000000000494ec71f | 1 |
+---------+------------------------------------------+----------+
10 rows in set (24.71 sec)

mysql> select count(*) from zyads_integral where sha1= '0000000000000000000000000000000005325911';
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (1.03 sec)

mysql> select id, count(*) from zyads_integral group by sha1 having count(*) > 1;
+---------+----------+
| id | count(*) |
+---------+----------+
| 5137851 | 2 |
| 5363699 | 5 |
| 5597063 | 2 |
| 5281295 | 2 |
...
| 4712249 | 6 |
| 1581236 | 3 |
| 5126827 | 2 |
| 1872277 | 7 |
+---------+----------+
836343 rows in set (33.77 sec)
mysql> select id from zyads_integral group by sha1 having count(*) >= 1;
+---------+
| id |
+---------+
| 7696 |
| 5137851 |
| 5363699 |
| 4826139 |
| 6250586 |
...
| 5126827 |
| 570573 |
| 1872277 |
| 4514446 |
+---------+
2466076 rows in set (3 min 36.80 sec)
```

### 删除数据

```mysql
mysql> delete from zyads_integral where id in (select a.id from (select id from zyads_integral group by sha1 having count(*) > 1) a);
CREATE TABLE `zyads_integral_tmp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hash` varchar(100),
`sha1` varchar(100) NOT NULL,
`name` varchar(1000) NOT NULL,
`index` varchar(10),
`size` varchar(10),
UNIQUE KEY `sha1` (`sha1`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6756155 DEFAULT CHARSET=gbk

INSERT INTO zyads_integral_tmp (`hash`,`sha1`,`name`,`index`,`size`) SELECT `hash`,`sha1`,`name`,`index`,`size` from zyads_integral group by sha1 having count(*)>=1;

mysql> rename zyads_integral zyads_integral_tmp_1 ;

```

简单验证码识别测试 tesseract

默认分类网站管理员 Published the article • 0 comments • 513 views • 2017-07-22 21:06 • 来自相关话题

### php使用tesseract实现简单验证码识别测试

### 源码如下
```php 查看全部
### php使用tesseract实现简单验证码识别测试

### 源码如下
```php
/**
* Created by unkown ide ps.
* User: phantom
* Date Time: 3/30/17 12:47 PM
*/
$ttt = time();
$a = `
curl http://wenshu.court.gov.cn/User/ValidateCode?t={$ttt} -o a.png -c /tmp/cookie.txt
tesseract a.png /tmp/result -l eng
`;

$result = `cat /tmp/result.txt`;

var_dump($result);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://wenshu.court.gov.cn/Content/CheckVisitCode');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'ValidateCode' => (int)$result,
));

$ret = curl_exec($ch);
curl_close($ch);
var_dump($ret);
if ($ret == 1) {
var_dump('=================== verify success ==========================');
} else {
var_dump('=================== verify failed ==========================');
}

```

PHP 迭代器(LimitIterator)

默认分类网站管理员 Published the article • 0 comments • 700 views • 2017-07-22 21:04 • 来自相关话题

### PHP 迭代器(LimitIterator)分页

```php 查看全部
### PHP 迭代器(LimitIterator)分页

```php

$fruits = new ArrayIterator(array(
'apple',
'banana',
'cherry',
'damson',
'elderberry'
));

// Loop over first three fruits only
$step = 2;
$count = count($fruits) / $step;
for ($i = 0; $i < $count; $i++) {
foreach (new LimitIterator($fruits, $i*$step, $step) as $fruit) {
var_dump($fruit);
}
var_dump('=======================================');
}
```

### Output
```
string(5) "apple"
string(6) "banana"
string(39) "======================================="
string(6) "cherry"
string(6) "damson"
string(39) "======================================="
string(10) "elderberry"
string(39) "======================================="
```
### 目录迭代
```php
$path = realpath('../auto');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach ($objects as $name => $object) {
echo"$name\n";
}
```
### 正则替换迭代器
 
```php

$a = new ArrayIterator(array('test1', 'test2', 'test3'));
$i = new RegexIterator($a, '/^(test)(\d+)/', RegexIterator::REPLACE);
$i->replacement = '$2:$1';
print_r(iterator_to_array($i));
```

rsync+inotify实现多服务器文件共享

默认分类网站管理员 Published the article • 0 comments • 457 views • 2017-07-22 21:00 • 来自相关话题

### rsyncd服务端配置

rsyncd.conf

```
##rsyncd.conf start##
#工作中指定用户(需要指定用户)
uid = root
gid = root
#相当于黑洞.出错定位
use chroot = no
#有多少个客户端同时传文件
max connections = 200
#超时时间
timeout = 300
#进程号文件
pid file = /var/run/rsyncd.pid
#日志文件
lock file = /var/run/rsync.lock
#日志文件
log file = /var/log/rsyncd.log
#模块开始
#这个模块对应的是推送目录
#模块名称随便起
[backup]
#需要同步的目录
path = /backup/
#表示出现错误忽略错误
ignore errors
#表示网络权限可写(本地控制真正可写)
read only = false
#这里设置IP或让不让同步
list = false
#指定允许的网段
hosts allow = 123.125.5.30/24
#拒绝链接的地址,一下表示没有拒绝的链接。
hosts deny = 0.0.0.0/32
#不要动的东西(默认情况)
#虚拟用户
auth users = root
#虚拟用户的密码文件
secrets file = /etc/rsync.password
#配置文件的结尾
#rsync_config_______________end
服务端密码/etc/rsync.password
```

#### 设置服务端密码
```bash
[root@cloud backup]# cat /etc/rsync.password
root:a1755b20c452
[root@cloud backup]# chmod 600 /etc/rsync.password
```

#### 启动服务端监听
```bash
/usr/bin/rsync -c /etc/rsyncd.conf --daemon
```

### rsync客户端配置

#### 环境需求

rsync + inotify
apt-get install inotify-tools
apt-get install rsync

#### 监听脚本
```
#!/usr/bin/env bash

host=test.ydl.com
src=/backup/ ## 需要备份的目录
des=backup ## 远程模块
user=root
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files; do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/tmp/rsync.passwd $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
```

#### 设置密码,密码文件
```bash
root@debian:/mnt# cat /tmp/rsync.passwd
#a1755b20c452
```
#### 测试
```bash
root@debian:/backup# touch ab > /backup/a
```
#### 日志文件返回结果
```
sending incremental file list
a
5 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1/4)
sent 111 bytes received 27 bytes 276.00 bytes/sec
total size is 5 speedup is 0.04
```

#### 最后需要做的就是设置脚本服务器自启动 查看全部
### rsyncd服务端配置

rsyncd.conf

```
##rsyncd.conf start##
#工作中指定用户(需要指定用户)
uid = root
gid = root
#相当于黑洞.出错定位
use chroot = no
#有多少个客户端同时传文件
max connections = 200
#超时时间
timeout = 300
#进程号文件
pid file = /var/run/rsyncd.pid
#日志文件
lock file = /var/run/rsync.lock
#日志文件
log file = /var/log/rsyncd.log
#模块开始
#这个模块对应的是推送目录
#模块名称随便起
[backup]
#需要同步的目录
path = /backup/
#表示出现错误忽略错误
ignore errors
#表示网络权限可写(本地控制真正可写)
read only = false
#这里设置IP或让不让同步
list = false
#指定允许的网段
hosts allow = 123.125.5.30/24
#拒绝链接的地址,一下表示没有拒绝的链接。
hosts deny = 0.0.0.0/32
#不要动的东西(默认情况)
#虚拟用户
auth users = root
#虚拟用户的密码文件
secrets file = /etc/rsync.password
#配置文件的结尾
#rsync_config_______________end
服务端密码/etc/rsync.password
```

#### 设置服务端密码
```bash
[root@cloud backup]# cat /etc/rsync.password
root:a1755b20c452
[root@cloud backup]# chmod 600 /etc/rsync.password
```

#### 启动服务端监听
```bash
/usr/bin/rsync -c /etc/rsyncd.conf --daemon
```

### rsync客户端配置

#### 环境需求

rsync + inotify
apt-get install inotify-tools
apt-get install rsync

#### 监听脚本
```
#!/usr/bin/env bash

host=test.ydl.com
src=/backup/ ## 需要备份的目录
des=backup ## 远程模块
user=root
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files; do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/tmp/rsync.passwd $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
```

#### 设置密码,密码文件
```bash
root@debian:/mnt# cat /tmp/rsync.passwd
#a1755b20c452
```
#### 测试
```bash
root@debian:/backup# touch ab > /backup/a
```
#### 日志文件返回结果
```
sending incremental file list
a
5 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1/4)
sent 111 bytes received 27 bytes 276.00 bytes/sec
total size is 5 speedup is 0.04
```

#### 最后需要做的就是设置脚本服务器自启动

wecenter检查用户名是否符合规则

默认分类网站管理员 Published the article • 0 comments • 447 views • 2017-07-22 19:58 • 来自相关话题

### wecenter检查用户名是否符合规则

```php 查看全部
### wecenter检查用户名是否符合规则

```php

function check_username_action()
{
if ($this->model('account')->check_username_char($_POST['username'])
|| $this->model('account')->check_username_sensitive_words($_POST['username']))
{
H::ajax_json_output(AWS_APP::RSM(null, -1, AWS_APP::lang()->_t('用户名不符合规则')));
}

if ($this->model('account')->check_username($_POST['username']))
{
H::ajax_json_output(AWS_APP::RSM(null, -1, AWS_APP::lang()->_t('用户名已被注册')));
}

H::ajax_json_output(AWS_APP::RSM(null, 1, null));
}
```

简单的网页通知

默认分类网站管理员 Published the article • 0 comments • 336 views • 2017-07-22 17:47 • 来自相关话题

友情连接
 
https://xcx.sourcedev.cc/article/page/1

最新Wecenter伊人集清新社区整站源码分享

默认分类网站管理员 Published the article • 0 comments • 601 views • 2017-07-22 17:41 • 来自相关话题

最新Wecenter伊人集清新社区整站源码分享,Wecenter伊人集社区完美修复BUG一键安装版
 
200 一套
最新Wecenter伊人集清新社区整站源码分享,Wecenter伊人集社区完美修复BUG一键安装版
 
200 一套