
Для некоторых читателей это может быть новая тема, а другие уже могут быть знакомы с ней, поэтому начнем с небольшого введения, чтобы все могли понять суть.
У многих сайтов может быть высокое количество посетителей, но это не обязательно означает, что на сайт создается высокая нагрузка.
Если клиенты не посещают сайт одновременно, а сайт обслуживает 10 000 пользователей ежедневно, то в сутках 24 часа, а это 1440 минут. Если средний пользователь проводит на сайте около минуты, на сайте в среднем будет менее 10 пользователей в минуту, что не является высокой нагрузкой, и многие сайты могут справляться с таким количеством пользователей при помощи стандартного хостинга.
Однако иногда вы проводите рекламные акции или привлекаете много новых клиентов с помощью рекламной кампании, и новые группы пользователей могут приходить с разной частотой — от 10 пользователей в минуту до 1000 в минуту и больше. К такому лучше быть готовым, иначе они увидят неработающий сайт, и ваши маркетинговые усилия и затраты будут потрачены впустую.
Также, если вы активно ведете блог, ваши статьи могут занять высокие позиции в результатах поиска и неожиданно привести к большому количеству посетителей за короткий промежуток времени, но в отличие от рекламной кампании вы не будете знать когда это произойдет.
Кроме того, важно отметить, что каждый пользователь будет отправлять несколько запросов на ваш сервер — посещение страниц, загрузка постраничной навигации и отправка форм — каждое из этих действий является отдельным запросом, как и все сопутствующие ресурсы — картинки, стили и скрипты.
Учитывая это, высокая нагрузка обычно измеряется количеством запросов, а не количеством посетителей.
Теперь после введения давайте посмотрим, как можно справиться большим количеством запросов, и при этом иметь высокую скорость сайта.
Первая линия защиты на пути к тому, чтобы сайт мог обрабатывать множество запросов, заключается в оптимизации кода и применении лучших практик по доставке контента и ресурсов.
Как? Применяя в своем проекте две простые идеи:
preg_match() может значительно замедлить генерацию страниц. Существует ряд медленных встроенных методов в языке PHP, но в вашем проекте также могут присутствовать и пользовательские методы, которые неэффективно используют системные ресурсы. Инструменты для профилирования, такие как расширение XDebug для PHP, могут показать что именно выполняется медленно Для этой цели я включил установку XDebug в PHP-контейнер, используемый WP BOX.Посмотрите на скриншот ниже: это SQL-запрос для контента главной страницы https://wp-box.org. В первом столбце вы можете увидеть точный SQL-запрос, а в последнем столбце — время его обработки.

С другой стороны, некоторые запросы могут быть медленные и по своей природе . Вам следует избегать их использования и искать альтернативные решения. Однако требования бизнес-логики иногда не оставляют выбора, и вам приходится использовать медленные запросы.
Для таких случаев не существует универсальных советов. Лучше всего выявить конкретные узкие места и разработать или найти готовое индивидуальное решение, если по какой-то причине вы не можете избежать использования этой логики.
Кроме того, стоит рассмотреть возможность кэширования и ленивой загрузки некоторых запросов — например, нет необходимости выполнять поисковый запрос при загрузке страницы, можно сначала получить ввод из поисковой формы, показать красивый индикатор загрузки и затем спокойно загрузить результаты. Однако это последнее замечание не относится к техникам оптимизации под высокую нагрузку, а скорее к рекомендациям по UX и скорости загрузки страницы.
Это очень важная оптимизация для снижения нагрузки на ваш сервер, которая решает проблему для большинства вебсайтов. Однако следует учитывать, что она применяется только к GET запросам — загрузкам страниц, шаблонов, результатов постраничной навигации и другого контента, где не обрабатываются пользовательские данные и не отображается контент, зависящий от пользователя.
Лучшей практикой будет возвращать контент как можно раньше, не передавая запрос на следующий элемент системы.
А элементы системы могут быть следующие:
wp_is_mobile(), устанавливаете куки или выполняете любые обновления базы данных во время загрузки страницы, вы также не можете кэшировать страницу. Разработайте другое решение.Репликация баз данных — это более продвинутая техника, которая может не понадобиться большинству проектов, однако она становится полезной в трех ситуациях:
Первый случай более известен в приложениях, таких как видеоигры, где каждая миллисекунда имеет значение. Если у вас сервер в США, а запрос поступает от пользователя из Азии, каждый запрос будет иметь задержку из-за расстояния, даже на хорошо оптимизированном сайте. CDN частично решает вопрос для GET запросов, которые могут быть закэшированы. Но если если вы хотите, чтобы ваши некэшируемые запросы также обрабатывались действительно быстро, вам потребуется чтобы и сервера производящие вычисления и запросы к БД были близки к местоположению пользователя. Это также важно и для сайтов электронной коммерции и финтеха проектов.
По аналогии такое решение потребуется и для второго случая, не ради скорости загрузки, а для того, чтобы справится с разным количеством траффика в разных регионах.
Все эти ситуации могут быть реализованы с балансировкой нагрузки и без неё.
Автор этого проекта сталкивался с проблемами, о которых шла речь в этой статьи и разрабатывает WP BOX с учетом потенциальной высокой нагрузки.
WP BOX может не быть самым эффективным решением на рынке, потому что я пытаюсь поддерживать баланс между эффективностью и удобством использования при разумных затратах на поддержку, но он спроектирован как универсальное решение. Код, написанный для проекта, оптимизирован для разумной эффективности, не жертвуя комфортом работы с сайтом на ежедневной основе.
Этот веб-сайт развернут на Google Compute Engine и использует CDN Cloudflare, но он будет работать аналогично на любом другом VPS или вашем локальном компьютере.