Достаточно часто сталкиваюсь с однотипной ошибкой на пользовательских сайтах — в какой-то момент нагрузка (и количество запросов к серверу) возрастает настолько, что сайт становится недоступен или хостер (если сайт на обычном шаред-хостинге) просто отключает его по той же причине. 

Анализ логов при этом показывает что основная часть проблемных запросов идёт… с самого же сайта! Получается парадоксальная ситуация — сайт падает как от ДДОСа, который сам же и создаёт. Ещё бывает что сайт начинает внезапно»тормозить» по той же причине.

Причем в логах, как правило,  обращения к одном и тому же файлу (или к файлам одного типа. К примеру — картинкам). Пример лога (xxx.yyy.zzz.aaa — IP-адрес сервера где размещается сайт): 

xx.xx 10:17:31 xxx.yyy.zzz.aaa GET /file.php HTTP/1.0" 200 452 "-" "PHP (www.sitename.com), hosted by www.ukraine.com.ua
xx.xx 10:08:53 xxx.yyy.zzz.aaa GET /file.php HTTP/1.0" 200 452 "-" "PHP (www.sitename.com), hosted by www.ukraine.com.ua
xx.xx 10:08:53 xxx.yyy.zzz.aaa GET /file.php HTTP/1.0" 200 452 "-" "PHP (www.sitename.com), hosted by www.ukraine.com.ua
xx.xx 10:08:53 xxx.yyy.zzz.aaa GET /file.php HTTP/1.0" 200 452 "-" "PHP (www.sitename.com), hosted by www.ukraine.com.ua

 

Причина ошибки:

Грубо говоря — есть некий скрипт (для примера — index.php) в нём есть вызов другого скрипта (file.php) через, к примеру, функцию

require_once 'file.php';

В этом случае при отработке index.php интерпретатор «подтянет» скрипт file.php и выполнит его тоже в нужный момент.

Но если он вызывается вот так

require_once 'http://www.site.com/file.php';

это и создаст имеющуюся у нас проблему.

Так как при каждом запуске скрипт будет:

  1. Обращаться к DNS-серверу для определения IP-адреса сайта site.com (даже если это он сам)
  2. отправлять запрос к http://www.site.com/file.php
  3. Ожидать пока веб-сервер запустит скрипт (или откроет файл) и  отдаст его «посетителю»(нашему скрипту)
  4. Получать данные от своего же сервера через http
  5. Обрабатывать их
  6. И только потом использовать в своей работе.

Шесть бесполезных и ОЧЕНЬ ресурсоёмких действий вместо одного. Чувствуете разницу? 🙂 

Во время всех этих действий, само собой, скрипт index.php будет висеть в памяти, создавать очередь и совершенно бесполезно нагружать процессор. Ну и плюс к этому — скорость отдачи посетителю страницы упадет катастрофически. 

Устранение ошибки: 

Как правило ни в одной «чистой» (без посторонних тем оформления или плагинов) CMS таких глупых ошибок нет. Поэтому самый удобный способ поиска — посмотреть к каким файлам присходят обращения, проанализировать, какой модуль или тема их использует и отключить их. Самый простой — отключить вообще все плагины, и установить тему оформления по-умолчанию, после чего просто поочерёдно включать их, контролируя логи сервера.