Масштабирование PHP-приложений

У меня есть существующий сайт PHP, который написан по-старому.

Каждая страница имеет одинаковый шаблон

<?php
require_once("config.php");
//Some code
require_once("header.php");
?>
Some HTML and PHP code mixture
<?php
require_once("footer.php");
?>

Где все соединения БД, данные сеанса, языковые файлы инициируются в файле "config.php". И каждый доступ к БД осуществляется с mysql_query вызов,

Никакого ООП, чего бы то ни было, чисто процедурного программирования.

Как бы вы оптимизировали эту структуру кода, чтобы повысить производительность и сделать этот веб-сайт достаточно надежным для обработки большого трафика?

2 ответа

Решение

Как бы вы оптимизировали эту структуру кода, чтобы повысить производительность и сделать этот веб-сайт достаточно надежным для обработки большого трафика?

Структура, которую вы нам показали, имеет очень мало возможностей для оптимизации. Делая его объектно-ориентированным, он будет медленнее, чем сейчас. Обратите внимание, что код во включенных файлах может значительно выиграть от различных изменений.

Здесь всего 3 строки кода. Так что не так много возможностей для тюнинга. Конструкции _once добавляют (крошечные) накладные расходы, как и использование require, а не include - но это очень небольшое количество по сравнению с тем, что может происходить в коде, который вы нам не показывали.

Где все соединения БД, данные сеанса, языковые файлы инициируются в файле "config.php"

Опять же, существует незначительная экономия за счет задержки доступа к внешним ресурсам до тех пор, пока они не потребуются (и немедленного отказа от доступа, когда они больше не требуются), но это не является процедурным вопросом в сравнении с OO.

Почему ОО будет медленнее?

Здесь маршрутизация запросов осуществляется через веб-сервер - веб-серверы действительно хороши в этом и обычно очень, очень эффективны. Альтернативный подход с использованием фронтом-контроллера дает некоторые возможности для применения шаблонов в более управляемом способе и для применения поздних заплаток содержания (хотя это спорно, если это хорошая идея). Но использование шаблона фронт-контроллера не является обязательным требованием для ОО.

Потенциально при написании в виде ОО-кода избыточные выделения памяти задерживаются дольше - следовательно, время выполнения имеет тенденцию иметь больший объем памяти.

Переопределение и декорирование добавляет дополнительные издержки абстракции и обработки к вызову преобразований данных.

каждый доступ к БД осуществляется с помощью вызова mysql_query

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

Похоже, вы убеждены, что с процедурным программированием что-то не так в отношении производительности и масштаба. Нет ничего более далекого от правды. G-Wan, Apache httpd, Varnish, ATS, ядро ​​Linux написаны на C, а не на C++.

Если вы хотите улучшить производительность и масштабируемость, то вы сейчас находитесь не в том месте. И единственный способ добиться значительных успехов на дорогах - это профилировать ваш код под соответствующие уровни нагрузки.

Если вы действительно не хотите менять свою структуру (ООП и mysql_*... и даже на самом деле), вы должны внедрить систему кеша, чтобы избежать генерации контента каждый раз. Если у вас есть данные, которые не часто меняются (например, запись в блоге, новости или профиль участника), вы можете создать кеш на 5 минут, чтобы облегчить использование SQL. Google может помочь вам в этом.

Существует также множество веб-методов для оптимизации загрузки страниц: используйте CDN для загрузки статических ресурсов, кэш Varnish...

С самим PHP, есть также несколько методов, но об этом есть много постов в блоге, просто посмотрите здесь, например:) Например:

  • Избегайте регулярных выражений, если это возможно
  • Если вам это нужно, инициализируйте переменную: в 10 раз медленнее увеличивать / уменьшать неинициализированную переменную (кстати, это ужасно)
  • Не вызывать функции в for объявление, вместо этого сделайте временную переменную
  • и т.п.

Не стесняйтесь тестировать, проведите несколько тестов с JMeter, чтобы смоделировать пул соединений и посмотреть, какая страница медленная, а какую следует оптимизировать в первую очередь.

Другие вопросы по тегам