PHP China | 中国开源之路 's Archiver

zzzbbs 发表于 2006-12-28 23:42

PHP自制会员系统,如何限制一个IP一天的留言数?

有没有什么即能限制IP日留言数,又比较节省系统资源的办法?

zzzbbs 发表于 2006-12-28 23:42

小弟想了很久,只想出了用MYSQL建立IP数据库,一一记录每个IP当天的留言数的办法。但不知用这种方法碰到访问高峰期,会不会很耗系统资源,系统会不会挂。高手们处理这种问题时都是怎么做的?望不吝赐教!

zzzbbs 发表于 2006-12-28 23:43

这样的问题,一般是由脚本语言来解决,还是由WEB服务器来解决?

lmhllr 发表于 2006-12-29 09:41

似乎没什么用,只要重新拨号就换IP了

甚至用代理可以做到自动更换IP

既然你已经有注册会员了,直接限制各种级别的会员一天能最多发多少不就可以了

zzzbbs 发表于 2006-12-29 13:13

限制IP和限制会员不是这个问题的关键,最终都要回到一个问题上:是用数据库来记录IP(或会员)的日留言数的方法好,还是用其他什么方法更好.

lam 发表于 2006-12-31 03:43

直接限制各种级别的会员一天能最多发多少,这个方法好,限制IP有难度,再一不科学!

晕瓜 发表于 2006-12-31 16:00

依访问人数定吧,如果IP量较少,存取数据库的操作多些没什么关系。如果IP量较多,那频繁的存取数据库、不太理想~但是除了这样,应该没什么方法限制了!毕竟、要存放IP。

yuking 发表于 2007-1-11 09:29

看 discuz 的注册脚本 register.php 他使通过向数据库写入ip地址进行记录的,获取ip的函数可以判断是否用代理访问的

sorrowboy 发表于 2007-12-3 14:20

如果数据不做经常性统计,一般有效期只有一天的话

建议选择文件操作

文件的文件夹加上当日日期

对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]]

sorrowboy 发表于 2007-12-3 14:52

现在开始测试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]]

sorrowboy 发表于 2007-12-3 14:55

接着跑
[php]
$i=60000;
//mkdir("testx",0777);
while($i){
    filesize('testx/'.md5($i));
    $i--;
}
[/php]

花了2.015593秒

sorrowboy 发表于 2007-12-3 14:58

再次跑[php]

$i=60000;
while($i){
    $cnt = mysql_connect('localhost', 'root' );
    mysql_close($cnt);
    $i--;
}
[/php]
总共花了21.248210秒

sorrowboy 发表于 2007-12-3 15:04

看起来的话,到达60000数量时,应该还是mysql比文件操作要慢
光打开关闭mysql就花了21秒多时间了,还不算它查询的时间。。。

相比文件操作平均10秒的成绩(一般的话肯定低于这个值,计算应为
(18.98076+2.015593x)/(1+x),当x>=1时,文件操作<10.5)来说,
我觉得我之前的那个想法还是有一定的可行性的。:loveliness:

googhu 发表于 2008-6-16 18:33

其实还有一个选择,就是sqlite,基于文件的轻量级数据库,这个速度比mysql快多了,而且不需要那么多文件了

co63 发表于 2008-6-18 12:05

一直不知道sqlite有什么出众的地方,原来是这个原因啊
用sqlite就比较麻烦了吧,一方面要学习新的知识,另一方面系统代码也要修改

我觉得可以用memcache做会很方便

webcgo1 发表于 2008-6-20 06:47

*** 作者被禁止或删除 内容自动屏蔽 ***

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.