我有一个庞大的链接数据库,它们都以特定的方式排序,并附加到其他信息上,这对某些人来说很有价值。
目前我的设置(似乎有效)只是调用一个像link.php?id = 123这样的php文件,它会将带有时间戳的请求记录到数据库中。在它吐出链接之前,它会检查在过去5分钟内从该IP发出的请求数。如果它大于x,则会将您重定向到验证码页面。
一切都运行得很好,花花公子,但该网站已经变得非常受欢迎(并且已经获得了大约6周的DDO),所以php已经被淘汰,所以我试图最小化我必须达到的时间php做点什么。我想以纯文本而不是通过link.php?id =显示链接,并且有一个onclick函数来简单地向视图计数添加1。我仍在点击php,但至少如果它滞后,它会在后台执行,用户可以立即看到他们请求的链接。
问题是,这使网站真的可以废弃。有什么我可以做的,以防止这种情况,但仍然不依靠PHP进行检查,然后吐出链接?
答案 0 :(得分:2)
似乎瓶颈在于数据库。每个请求执行一次插入(记录请求),然后执行select(确定最近5分钟内来自IP的请求数),然后执行应用程序核心功能所需的任何数据库操作。
考虑在服务器内存中维护请求限制数据(IP,请求时间),而不是增加数据库的负担。两个解决方案是memcache(http://www.php.net/manual/en/book.memcache.php)和memcached(http://php.net/manual/en/book.memcached.php)。
正如其他人所指出的那样,确保所查询的任何密钥都存在索引(字段,例如链接ID)。如果索引到位并且数据库仍然受到负载的影响,请尝试使用HTTP加速器,例如Varnish(http://varnish-cache.org/)。
答案 1 :(得分:1)
您可以在Web服务器级别进行ip限制。也许你的网络服务器存在一个模块,或者作为一个例子,使用apache你可以编写自己的重写地图并让它参考一个守护程序,这样你就可以做更复杂的事情。让守护程序查询内存数据库。它会很快。
答案 2 :(得分:0)
检查您的数据库。你正确索引一切吗?包含这么多条目的表格将变得非常快速且速度慢下来。您可能还希望运行一个夜间进程,删除超过1小时的条目等。
如果这些都不起作用,那么您正在考虑升级/负载平衡您的服务器。直接链接到页面只会在你必须升级之前花费很多时间。
答案 3 :(得分:0)
大多数抓取工具只是分析静态HTML,因此对链接进行编码,然后使用JavaScript在客户端的Web浏览器中动态解码它们。
确定的刮刀仍然可以解决这个问题,但如果数据足够有价值,他们可以绕过任何技术。
答案 4 :(得分:0)
您在客户端执行的所有操作都无法受到保护,为什么不使用AJAX?
有一个调用ajax函数的onClick事件,它只返回链接并将其填入页面的DIV中,因为请求的大小很小,它会快速地满足您的需要。只需确保在您调用的函数中检查时间戳,就可以很容易地创建一个多次调用该函数的脚本来链接。
你可以查看jQuery或其他AJAX库(我使用jQuery和sAjax)。而且我有很多页面可以非常快速地改变内容,客户甚至不知道是不是纯粹的JS。