Implementé un mecanismo de estrangulamiento del pobre en phunction usando APC solo, así es como lo uso:
// allow 60 requests every 30 seconds
// each request counts as 1 (expensive operations can use higher values)
// keep track of IPs by REMOTE_ADDR (ignore others)
$throttle = ph()->Throttle($ttl = 30, $exit = 60, $count = 1, $proxy = false);
if ($throttle === true)
{
// IP exceded 30 requests in the last 60 seconds, die() here
}
else
{
// $throttle is a float
// number of requests in the last 30 seconds / 30 seconds
/*
1 req / 30 = 0,033 sec
5 req / 30 = 0,166 sec
10 req / 30 = 0,333 sec
15 req / 30 = 0,5 sec
20 req / 30 = 0,666 sec
25 req / 30 = 0,833 sec
30 req / 30 = 1 sec
*/
usleep(intval(floatval($throttle) * 1000000));
}
Uso esto en mi controlador frontal y paso el valor a mi método de enrutamiento, pero esa es otra historia.
La conclusión es que si usa APC, puede mantener las cosas muy rápido en la memoria y con poco consumo de memoria porque APC sigue una metodología FILO. Sin embargo, si necesita tiempos de espera mucho más altos, puede considerar usar algo que no esté basado en la memoria.
Por cierto:MySQL admite tablas con el motor MEMORY.
El problema con sleep()
:
Un servidor web Apache típico con PHP instalado como módulo consumirá alrededor de 10 MB de RAM por instancia, para evitar exceder su RAM disponible, hay algunas configuraciones de Apache que puede configurar para limitar la cantidad máxima de instancias que Apache puede iniciar.
El problema es cuando sleep()
, esa instancia todavía está activa y con suficientes solicitudes podría terminar consumiendo todos los espacios disponibles para iniciar nuevos servidores, lo que haría que su sitio web fuera inaccesible hasta que se completen algunas solicitudes pendientes.
No hay forma de superar esto desde PHP AFAIK, así que al final depende de ti.
El principio es el mismo para la regulación de todo el sistema:
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;
}