Powinieneś unikać prób robienia tego z PHP. Zanim PHP się zaangażuje, jest już za późno - pamięć została już przydzielona.
Możesz zablokować adresy IP na dowolnej warstwie, ale najniższym poziomem, który zużywa najmniej zasobów, jest trasa, którą chcesz wybrać. Zazwyczaj jest to zapora ogniowa. Przynajmniej iptables (firewall linux) jest tym, czego chcesz użyć. Istnieją narzędzia, o których wspominali inni, takie jak Fail2Ban, które mogą zautomatyzować to za Ciebie. Zewnętrzna zapora sieciowa byłaby lepsza.
Oprócz próby zakazania obrażania adresów IP, powinieneś spróbować lepiej wykorzystać swoje zasoby. Jeśli żądanie zajmie mniej zasobów, atak będzie trwał dłużej.
Apache wykorzystuje również dużo pamięci. Jeśli używasz mod_php, jest nawet gorzej, ponieważ PHP jest ładowane w każdym procesie potomnym Apache. Oznacza to, że nawet żądania do treści statycznych (css / js / images) ładują PHP, nawet jeśli PHP nie jest używane. Możesz rozwiązać ten problem, używając zamiast tego FastCGI. mod_fcgid to dobra opcja.
Istnieją również inne serwery WWW, które są bardziej zasobooszczędne. Nginx jest moim ulubionym. Jest też Lighttpd. Wiele osób lubi Litespeed (spadek w zamian za Apache).
Jeśli chcesz pozostać przy Apache, zastanów się nad jego optymalizacją. Rozważ wyłączenie .htaccess. Oto dobre wyjaśnienie, dlaczego .