Привет, Хабр! Представляю вашему вниманию перевод статьи "PHP Performance Optimization"
автора Mohamed Aladdin.
Оптимизация производительности PHP
Производительность приложения – проблема не только техническая. Хорошая производительность может привести бизнес к успеху, в то время как плохая – просто его похоронить. Поэтому, если вы думаете, что несколько миллисекунд ничего не значат, подумайте еще раз.
Почему производительность имеет значение?
Существует три причины, почему производительность – это важно. Первая – это пользовательский опыт: если ваше приложение слишком долго загружается, тогда вы рискуете, что ваши пользователи переключатся на конкурентов или оставят плохие отзывы, что негативно скажется на бизнесе. Вторая причина – это конверсия. Конверсия – это количество пользователей, которые реально приобретут ваш продукт или скачают вашу электронную книгу, это в конечном итоге то количество пользователей, которые заплатят деньги за ваши услуги. Более быстрый веб-сайт обеспечивает лучшую конверсию и больший доход. Третья причина – масштабируемость. Чем больше запросов ваше приложение может обработать за секунду, тем с большим траффиком оно сможет справиться. К примеру, если ваше приложение может обработать один запрос за 100 мс, значит, за секунду это будет 10 запросов. Поэтому, если вы уменьшите время обработки одного запроса наполовину, количество запросов, которые ваше приложение сможет обработать, удвоится.
Примеры изучения кейсов производительности:
Firefox: когда страница для скачивания стала отрабатывать на 2.2 с быстрее, получилось увеличить количество скачиваний на 10 млн.
Shopzilla: когда их сайт стал на 5 с быстрее, конверсия выросла на 7-12%.
Bing: когда поисковый движок от Microsoft стал на 1с медленнее, он потерял 2.8 % своего дохода.
Yahoo!: схожая ситуация с Bing, уменьшение отклика на 0.4 с повлекло за собой потерю 5-9% траффика.
Таким образом, независимо от сферы, в которой работает ваш бизнес, более быстрое приложение означает больший доход.
Оптимизация производительности PHP:
- выберите правильную версию
Этот пункт один из очевидных после появления PHP7, который несомненно более производителен по сравнению со старыми версиями.
- PHP микро-оптимизация
Микро-оптимизация – это небольшие изменения в вашем коде, которые улучшают производительность вашего приложения. К примеру, если вы используете цикл for, всегда лучше посчитать длину массива заранее. На следующем рисунке изображен результат работы цикла for с массивом с 1000 ключей, значения массива имеют длину в 1 байт. Вы можете заметить улучшение производительности по времени выполнения цикла
- профилирование PHP кода с использованием XHProf:
После того, как мы рассмотрели ограниченное влияние микро-оптимизации PHP, пришло время точно определить, какая из частей нашего кода работает медленно, используя инструмент под названием XHProf. После его установки и настройки на вашем сервере XHProf добавит хедер и футер во все ваши скрипты PHP и сгенерирует отчет, в котором вы найдете исполняемые функции, время выполнения, количество вызовов каждой функции.
На следующем рисунке представлены результаты профилирования продуктовой страницы, созданной на Laravel. Видно, что getProductData() вызывалась 40 раз с общим временем выполнения в 5 с.
На первый взгляд, вы можете ожидать появления “N + 1” проблемы. Это означает, что если вы ее исправите, ваша продуктовая страница будет на 5с быстрее.
“N + 1” проблема возникает, когда вы делаете запрос в реляционную БД на получение данных из двух разных таблиц. Например, вы запрашиваете все продукты, чтобы получить их Names и Ids. А затем для каждого продукта вы запрашиваете еще одну таблицу для получения таких деталей, как доступные цвета или наличие на складе. Как правило, такая ситуация может быть разрешена переписыванием запроса для получения всех данных в один или два запроса максимум. Это мы обсудим позже в статье об оптимизации запросов к БД.
- Кэширование
Реализация слоя кэширования должна снимать нагрузку с вашей БД и в то же время уменьшать время на получение часто запрашиваемых данных. И Memcache, и Redis часто используются для кэширования; однако Redis имеет несколько конкурентных преимуществ, таких как синхронизация данных с диском (при перезагрузке сервера данные не будут утеряны), а также его встроенная возможность master/slave репликации, так что вы легко можете масштабировать Redis кластер по мере роста вашего приложения.
ссылка на оригинал статьи https://habr.com/ru/post/458980/
Добавить комментарий