PHP自制会员系统,如何限制一个IP一天的留言数?
有没有什么即能限制IP日留言数,又比较节省系统资源的办法? 小弟想了很久,只想出了用MYSQL建立IP数据库,一一记录每个IP当天的留言数的办法。但不知用这种方法碰到访问高峰期,会不会很耗系统资源,系统会不会挂。高手们处理这种问题时都是怎么做的?望不吝赐教! 这样的问题,一般是由脚本语言来解决,还是由WEB服务器来解决?似乎没什么用,只要重新拨号就换IP了
甚至用代理可以做到自动更换IP既然你已经有注册会员了,直接限制各种级别的会员一天能最多发多少不就可以了 限制IP和限制会员不是这个问题的关键,最终都要回到一个问题上:是用数据库来记录IP(或会员)的日留言数的方法好,还是用其他什么方法更好. 直接限制各种级别的会员一天能最多发多少,这个方法好,限制IP有难度,再一不科学! 依访问人数定吧,如果IP量较少,存取数据库的操作多些没什么关系。如果IP量较多,那频繁的存取数据库、不太理想~但是除了这样,应该没什么方法限制了!毕竟、要存放IP。 看 discuz 的注册脚本 register.php 他使通过向数据库写入ip地址进行记录的,获取ip的函数可以判断是否用代理访问的 如果数据不做经常性统计,一般有效期只有一天的话
建议选择文件操作
文件的文件夹加上当日日期
对IP进行MD5操作,然后作为文件名,每留言一次写入一个固定长度的值。【md5操作只是为了获取hash值,你也可以用其他快速的方法,以效率优先】
用filesize来读取文件大小,当 值×条数 到达限制大小后,则限制该ip的留言
================================
.....但是,这样做有个缺点,就是linux对文件数量超过1000后的访问速度变慢问题。。。~!@#$%^
刚才没考虑到说。。。:sweat:
不过这个也是有方法解决的,比如在ip文件与日期文件夹之间加入1~2层的起分类作用的文件夹等。【例如以IP其中2位为分类文件名?】
当时。。。这样做起来好像就麻烦了一点了,没有mysql操作来得直接。
不过效率上应该要比mysql操作要快点吧?:shy:
+++++++++++++++++++++++++++++
以上只是个人突然的想法,未经实践检验
[[i] 本帖最后由 sorrowboy 于 2007-12-3 14:32 编辑 [/i]] 现在开始测试io性能,
ibm x32 768M内存,40G5400硬盘,Inter M 1.7G
fedora8
跑[php]
$i=60000;
mkdir("testx",0777);
while($i){
$fp = fopen( ‘testx/’.md5($i), 'wb');
fwrite($fp, '1');
fclose($fp);
$i--;
}
[/php]
花了18.98076秒
[[i] 本帖最后由 sorrowboy 于 2007-12-3 14:55 编辑 [/i]] 接着跑
[php]
$i=60000;
//mkdir("testx",0777);
while($i){
filesize('testx/'.md5($i));
$i--;
}
[/php]
花了2.015593秒 再次跑[php]
$i=60000;
while($i){
$cnt = mysql_connect('localhost', 'root' );
mysql_close($cnt);
$i--;
}
[/php]
总共花了21.248210秒 看起来的话,到达60000数量时,应该还是mysql比文件操作要慢
光打开关闭mysql就花了21秒多时间了,还不算它查询的时间。。。
相比文件操作平均10秒的成绩(一般的话肯定低于这个值,计算应为
(18.98076+2.015593x)/(1+x),当x>=1时,文件操作<10.5)来说,
我觉得我之前的那个想法还是有一定的可行性的。:loveliness: 其实还有一个选择,就是sqlite,基于文件的轻量级数据库,这个速度比mysql快多了,而且不需要那么多文件了 一直不知道sqlite有什么出众的地方,原来是这个原因啊
用sqlite就比较麻烦了吧,一方面要学习新的知识,另一方面系统代码也要修改
我觉得可以用memcache做会很方便 *** 作者被禁止或删除 内容自动屏蔽 ***
页:
[1]
