我在phunction中使用APC实现了简易限流机制,以下是我的使用方法:
$throttle = ph()->Throttle($ttl = 30, $exit = 60, $count = 1, $proxy = false);
if ($throttle === true)
{
}
else
{
usleep(intval(floatval($throttle) * 1000000));
}
我在我的前端控制器上使用这个,并将值传递给我的路由方法,但那是另一回事。
总之,如果您使用APC,您可以将东西保持在内存中并且具有很小的内存消耗,因为APC遵循FILO方法。 如果您需要更高的超时时间,您可以考虑使用不基于内存的东西。
顺便说一下:MySQL支持使用MEMORY引擎的表。
sleep()
存在的问题:
一个安装了PHP模块的典型Apache Web服务器每个实例会消耗约10MB的RAM,为避免超过可用RAM,您可以配置一些Apache设置来限制Apache能够启动的最大实例数。
问题在于当您使用sleep()
函数时,该实例仍然处于活动状态,如果有足够多的请求,可能会导致占用所有可用的插槽以启动新的服务器,从而使您的网站不可访问,直到某些挂起的请求完成为止。
据我所知,没有办法从PHP中解决这个问题,因此最终取决于您。
原则上,系统级限流的原理是相同的:
function systemWide($ttl = 86400, $exit = 360)
{
if (extension_loaded('apc') === true)
{
$key = array(__FUNCTION__);
if (apc_exists(__FUNCTION__) !== true)
{
apc_store(__FUNCTION__, 0, $ttl);
}
$result = apc_inc(__FUNCTION__, 1);
if ($result < $exit)
{
return ($result / $ttl);
}
return true;
}
return false;
}
sleep()
。 - Alix Axelapc_inc()
递增单个键就可以为整个系统完成工作。 - Alix Axel