我有一个使用Symfony2框架的php 5.5 web应用程序,并希望将服务器负载保持在最低限度。我网站上的几个页面允许用户从数据库中检索对象列表,一组有几十万行,很快就会超过一百万。未注册的用户可以使用此页面。
我想阻止用户在一分钟或类似的时间内多次执行查询,并且已经在其他网站上看到了这种情况,包括用于评论或投票的stackoverflow。
这是如何实施的?我是否需要创建cookie并检查每个页面加载的会话,以查看是否已使用我要限制的特定操作并阻止表单提交?有没有一种标准的方法来处理这个在PHP,或专门为Symfony2?我搜索过这个并发现了一些类似的问题,但没有具体的答案。这是直接在我的网站上的用户,而不是使用api。
How to throttle API requests using PHP
How do I throttle my site's API users?
我知道cookie不是正确的方法,并会尝试使用缓存实现机制。我使用的是PHP 5.5并且读到APC有一些5.5的错误,因此Zend OpCache实际上是优选的APCu。任何人都可以展示使用Zend OpCache / APCu记录和跟踪用户请求的示例吗?
答案 0 :(得分:1)
Cookie不是安全的方式。当我做了类似的事情时,我使用APC或MongoDB来存储计数器,并使用以下密钥制作:
因此,例如,您可以存储一个名为的IPC密钥:ip2long($ ip),crc32($ browser),time() - time()%3600,并保存您的命中值。
我提供了一个代码示例,该代码仅在1小时的范围内使用了IP。
// Time
$now = time();
$time = $now - $now%3600;
// IP
if(array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$key = sprintf('%d-%u', $time, ip2long($ip));
if (apc_inc($key)) {
echo "we have ". apc_fetch($key). " views in this hour";
}