Debe evitar intentar hacer esto con PHP. Para cuando PHP se involucra, ya es demasiado tarde: la memoria ya ha sido asignada.
Puede prohibir las direcciones IP en cualquier capa, pero el nivel más bajo que utiliza la menor cantidad de recursos es la ruta que desea tomar. Este suele ser el firewall. Como mínimo, iptables (firewall de Linux) es lo que desea usar. Hay herramientas que otros han mencionado, como Fail2Ban, que pueden automatizar esto por usted. El firewall externo sería mejor.
Además de tratar de prohibir las direcciones IP ofensivas, debe intentar hacer un mejor uso de sus recursos. Si una solicitud requiere menos recursos, un ataque tardará más en ser efectivo.
Apache también usa mucha memoria. Si está utilizando mod_php, es aún peor porque PHP se carga dentro de cada proceso secundario de Apache. Esto significa que incluso las solicitudes de contenido estático (css / js / images) están cargando PHP incluso cuando PHP no se está utilizando. Puede resolver este problema utilizando FastCGI en su lugar. mod_fcgid es una buena opción.
También hay otros servidores web que son más eficientes en cuanto a recursos. Nginx es mi favorito. También hay Lighttpd. A mucha gente le gusta Litespeed (reemplazo de Apache).
Si quieres seguir con Apache, considera ajustarlo lo mejor que puedas. Considere deshabilitar .htaccess. Aquí hay una buena explicación de por qué .