Вы должны избегать попыток сделать это с помощью PHP. К тому времени, когда PHP включается, уже слишком поздно - память уже распределена.
Вы можете запретить IP-адреса на любом уровне, но самый низкий уровень, который использует наименьшее количество ресурсов, - это маршрут, который вы хотите выбрать. Обычно это брандмауэр. По крайней мере, iptables (linux firewall) - это то, что вы хотите использовать. Есть инструменты, которые упоминали другие, такие как Fail2Ban, которые могут автоматизировать это для вас. Внешний брандмауэр был бы лучше.
Помимо попыток запретить несанкционированные IP-адреса, вы должны попытаться более эффективно использовать свои ресурсы. Если запрос занимает меньше ресурсов, атака будет эффективнее.
Apache также использует много памяти. Если вы используете mod_php, это еще хуже, потому что PHP загружается внутри каждого дочернего процесса Apache. Это означает, что даже запросы к статическому контенту (css / js / images) загружают PHP, даже если PHP не используется. Вы можете решить эту проблему, используя вместо этого FastCGI. mod_fcgid - хороший вариант.
Есть и другие веб-серверы, которые более эффективны с точки зрения ресурсов. Nginx мой любимый. Там также Lighttpd. Многим нравится Litespeed (замена на Apache).
Если вы хотите придерживаться Apache, подумайте над тем, чтобы настроить его как можно лучше. Рассмотрите возможность отключения .htaccess. Вот хорошее объяснение, почему .