PHP+MYSQL 用什么方式缓存要频繁写入的数据好,还是直接写入数据库?

2016-01-22 17:39:07 +08:00
 yeyeye
一查搜索引擎,清一色的用文件做缓存,或者内存缓存类(但是需要其他插件来辅助),普通的 php+mysql 虚拟主机是没有的。

我有一些数据需要频繁写入,比如想记录每个 IP 访问次数,用来限制访问频率,但是这样修改文件的频率会很高很高,也没有更好的方式存储数据呢
6881 次点击
所在节点    PHP
24 条回复
Zzzzzzzzz
2016-01-22 17:47:00 +08:00
没中间件的话最多插入 memory 表或者 crontab 跑命令分析日志了, 虚拟主机真的无所谓追求性能了.
keinx
2016-01-22 18:42:45 +08:00
存到 session or cookie 里,判断 IP 访问次数。不知道你是想做什么。
其实站库分离,存到数据库还是不错的,频繁写入文件可能硬盘 IO 会很高。
quericy
2016-01-22 21:10:26 +08:00
用 redis 或者 memcached.只存储 ip 和访问次数,过期销毁,内存占用应该不会太大.
ab
2016-01-22 21:53:35 +08:00
memcached
yeyeye
2016-01-22 22:02:57 +08:00
@keinx
@Zzzzzzzzz 主要是我的 wordpress 博客,内容不多,但是 wordpress 很慢,最近查日志发现垃圾流量真多,常常还有扫漏洞的,还有坚持几天几夜扫后台密码的(虽然被插件拦住了,但是也消耗 0.x 秒的时间去处理,因为 WP 的结构的关系,根本没办法快速处理,缓存插件不缓存 404 页面,也全是交给 index.php 处理的,看着非常蛋疼!)

蛋疼是有的扫描软件会控制频率, 1 秒一次,有的 1 秒 10 次(一天就数万动态页面啊),想想如果我是 IDC ,我也不能忍服务器被这样搞死(如果一个服务器上架了很多 WP 站点,那得浪费多少性能啊……),难怪以前被强烈要求删除后台登陆文件……甚至越疱代俎去限制访客!

无奈之下在 wp-config 里做了一个防火墙,防住了大部分垃圾请求,恶意请求,自动黑名单机制(行为不同期限也不同,我是 php 菜鸟,每个指令都翻手册的),但是在日志里有些请求看不出毛病,还好这类虽然不知道为什么,但是也不干坏事,可以说基本上完善了。



但是在心里还是有点不舒服,第一个是防不住日志里看起来正常的请求(我的规则是参照日志写的,所以不影响正常使用,但是干坏事的一下就抓出来了),有的看不出毛病但是频率非常之快,跟攻击差不多了,我就想消灭这类, session 可以里写的话可以防住正常用户按住 F5 的情况,防不住那些不带 cookie 的请求(不带 cookie 那么 session 也废了),所以想把每个 IP 的频率记录下来,这样就能做分析然后丢入黑名单了。(由于前台没有登陆功能,所以 session 也没开启,所以比较想通过 IP 访问频率来掌控)

最终就出现了这个主题……似乎最终还是只能频繁写入数据库或者文件了……这时候我就会怀念一下 ASP 的 application 变量了(站点级别的变量,如果不删除掉,重启 IIS 之前一直会存在,任何访问该站点的请求都可以调用)
yeyeye
2016-01-22 22:08:49 +08:00
@ab
@quericy 似乎最终还是只能频繁写入数据库或者文件或者无视了(虚拟主机没有 redis 或者 memcached)……这时候我就会怀念一下 ASP 的 application 变量了(站点级别的变量,如果不删除掉,重启 IIS 之前一直会存在,任何访问该站点的请求都可以调用,真正的全局变量!)
xuhaoyangx
2016-01-22 22:09:53 +08:00
不要强迫症,其实我觉得 wp 卡和这些没多大关系
yeyeye
2016-01-22 22:27:51 +08:00
@xuhaoyangx 本身服务器也有关系,但是 wp 有些地方是需要我们自己去改善,比如说 404 页面,那些自动扫描后台的,扫描上传漏洞的,这些请求全是 index.php 在处理,然后整体运行起来后检查下模板里的 404 页面主题,而一般的 404 页面主题其实和普通页面没什么区别的(只是没有文章列表或者文章内容,页眉,侧栏还有页脚都是有的,也就是说这就是个普通页面,还是缓存插件不缓存的那种),暴力破解后台密码的,要是完全不防范,每天我的一个小站就有几万次的后台登陆,也是没办法缓存的,你想想如果我有几万的 PV ……那我可高兴死了,结果每天有几万的 PV 是属于被攻击的,想想都觉得 IDC 随时都可能因为心情不好把我的站给封了。。。

还有该死的 xmlrpc ,一个请求竟然可以尝试 500 次密码组合!!!

所以一方面是强迫症 一方面是真的很不爽。
keinx
2016-01-22 23:00:12 +08:00
那你可以试一下使用 360 的那个 网站安全防火墙功能,或者在.htaccess 里面加入 IP 规则。
xuhaoyangx
2016-01-22 23:31:44 +08:00
xmlrpc 的确是一个比较恶心的地方,我好像是把这东西关掉了?反正现在没这些痛点,我更多的是再防火墙层面,加了一些脚本和一些黑名单,现在访问也是不太好,但是基本确定是系统有问题导致 IO 延迟大,你可以尝试对 log 做些脚本动态加入防火墙进行防护
xuhaoyangx
2016-01-22 23:33:04 +08:00
@yeyeye 其实想了下-。-你用应用层层面拒绝访问,那还是有‘很大’的消耗额...
yangqi
2016-01-22 23:36:18 +08:00
都是机器人, fail2ban 装上, xmlrpc 禁用就能杜绝很大部分的机器人了
iyaozhen
2016-01-23 00:01:31 +08:00
楼主你这想多了吧。扫描就让它扫呗。一天几 w 而已,才多少呀。装个 super cache 插件,打开速度飞快。

而且你这标题和你需求对不上。
phperstar
2016-01-23 00:06:24 +08:00
感觉这个测试结果,可以作为参考: http://www.metsky.com/archives/313.html
phperstar
2016-01-23 00:09:54 +08:00
@yeyeye 为什么不给后台程序入口文件,加上可以访问 iP 限制。非你自己 ip 直接 exit,这样就打消了你的顾虑吧
yeyeye
2016-01-23 01:02:05 +08:00
@keinx 没备案啊,国内的物价太高了,云减速伤不起(哈哈,最近 v2 都说国内的免费 cdn 是云减速),以后备案了试试看


@xuhaoyangx 主要是一般人又不知道这些,我用 WP 都 7 年多了,因为 php 实在是太菜了不爱折腾,最近查东西才发现的(原谅我吧),没办法,一般的 php 空间除了 php 就是 mysql ,能不能访问日志文件夹还是个问题(回头试试看有没有权限)

应用层层面处理这个也是没办法 上面也说了,普通 php 空间啥都没,单纯我的脚本还是不消耗很多资源的, wp 首页 0.8 秒处理时间, wp 文章页面 0.4 秒处理时间,(取自不缓存的运行时间,文章总数不到 800 篇),这样的配置之下,我的防火墙脚本整体运行时间是 0.0002-0.0004 秒之间(这样的垃圾空间竟然防火墙脚本每秒可以处理 2000 个页面), wp-config 文件在 WP 是比较前面了,执行也是在最前面的,这时候数据库都没连接呢,非常适合拦截,所以还是非常快的,虽然不知道其他部分花费了多少内存 cpu 和时间,但是想必不多,我用 chrome 看了下,如果当前是第一次访问,拉黑掉,整个连接过程是 50ms , TTFB 是 24ms ,拉黑后访问整个请求从开始到结束是 29-35ms (服务器在香港,我在东莞),如果全天都是拉黑的 IP 访问我,仅仅从 php 方面可以顶住几百万个 PV , TTFB 是 24ms (简直吓人,),至于 http 服务器能顶住多少,因为网速慢影响多少,我就不知道了,这么说来其实是消耗很高的,如果直接从 http 服务器去拦截,效果完全不同了(我的拦截是直接改了 http 代码成 404 ,直接 exit ,所以其实还是走完了整个过程,但是没想到这么快……)。所以我直接考虑过把黑 IP 通过 http 登陆控制面板提交上去,但是看了下大部分坏人扫描几分钟或者十几分钟就不玩了,我这样说不定浪费更多资源,少的情况下,只请求 3-10 次,这样感觉有点得不偿失,而且控制面板不是每家都一样的,以后也不通用,我觉得太浪费时间处理和我写出来了(原谅我是个菜逼,之前要犹豫很久,想通了所有逻辑再拖一拖才开始写,修修改改好不容易逻辑写好了,自以为不会报错的,提交上去一看瞎了,一个个改错哈哈, php 还是写的太少了)

讲了这么多,目前就是在犹豫怎么处理频率这一块,实在没什么好办法就搁置算了,反正是个小站,也没人专门去攻击我的。能做到现在的地步我很满足啦~(之前每天都有人扫啊扫 暴力破啊暴力破,经过这个防火墙,暴力破解的一个都没了,后台有个插件专门负责抓坏人的,现在一个都抓不到了,以前每天都有几个,其中会有个把个会尝试几千次或者连续几天几夜的来)


@yangqi 恶意请求目前大部分被我的墙干掉了,所以这块不担心了,基于前面说的原因,如果不太好解决,就不解决了。 fail2ban 也是要服务器支持,专门脚本去检测,目前没办法做到,不管怎么说这也是个好东西,谢谢你,谢谢各位

@iyaozhen 我试过了, 404 页面和后台暴力破解的页面,都是要几百毫秒的 php 处理时间(其实我只测试了 404 页面,每次都会重新生成页面,不会被缓存插件缓存的,登陆页就更没可能缓存了),几万个几百毫秒的处理时间,我实在是觉得太浪费了,如果这个代价用在正常访客上,有这么大流量我真是会超级开心。

@phperstar 目前对登陆页面也有做特殊处理,所以扫描软件会认为它不存在(所以就不进行下一步操作进行破解了,正好 wp 升级不会升级 wp-config 文件,它又必须被包含,逻辑都写在这里了),因为是特殊处理,所以我自己使用方式是没有任何改变的……真不担心被扫出密码,毕竟它猜不到我的用户名(相关获取用户名的地方也干掉了)

你的测试我看了下,确实很不错,说明读写文件是非常快速的(其实写这个防火墙的时候,我也注意到读写小文件时间其实非常快,合理使用的话根本没理由会造成高负载啊,以前可能是受一些别人定的规则误导了,心理上没有自信)
yeyeye
2016-01-23 01:07:12 +08:00
@iyaozhen 重申一下,我就想把 IP 和每次请求的频率用数据库或者文件存起来,然后再用 php 去判断,这样每一个 PV 都会对文件 /数据库进行编辑,所以有所顾虑
yangqi
2016-01-23 01:08:13 +08:00
@yeyeye wordpress 有插件, fail2ban 规则都帮你写好了,直接复制过去就行了。
aivier
2016-01-23 01:10:15 +08:00
管它干嘛?设置个强密码,然后安心写博客就好了

主机商不开心的话他们自己屏蔽恶意 IP 就好了
yeyeye
2016-01-23 01:13:15 +08:00
@yangqi 我觉得它非常适合干这个 但是暂时是虚拟主机 没有这个东西可以用 所以想自己用 php 来弄

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/252676

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX