Повышаем производительность PHP: 12 простых советов -6




Производительность важна для каждого веб-приложения на PHP. Пользователи всегда жалуются на медленную загрузку страниц, их недоступность, не отвечающие ссылки и многие другие факторы, которые в итоге приводят к потере этих самых пользователей как клиентов. Чтобы удовлетворять потребности ваших пользователей, необходимо постоянно следить за производительностью. Каждое программное приложение нуждается в инструментах для мониторинга и измерения производительности системы. Итак, представляю вашему вниманию — 12 простых советов по повышению производительности PHP.

Советы по повышению производительности PHP

Узкие места

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

Prefix, например, используется для выявления медленных запросов, что в свою очередь помогает понять, как ведет себя код и многое другое. В целом, несложно определить, какой из инструментов оптимизации лучше всего подойдет измерения производительности вашего приложения. Также не помешает создать список потребностей вашего приложения и упорядочить его по приоритетности от наивысшего к низшему. Это даст вам понимание того, что по некоторым пунктам не стоит сильно беспокоиться.

Профилирование

Один из важнейших советов по повышению производительности PHP — это профилирование. Существует много инструментов для профилирования, и вам самим нужно определить, какой из них будет лучше соответствовать вашим потребностям. Каждый профилировщик PHP имеет свои особенности и преимущества. В результате своих поисков хорошего профилировщика для PHP в интернете, я обнаружил, что в использовании у каждого есть свои преимущества и недостатки. У Stackify есть Prefix, который используется в качестве инструмента для профилирования. Он обладает уникальными характеристиками, которые позволяют получать непрерывную обратную связь о производительности вашего серверного кода, SQL и других методов, задействованных в вашей системе. Лучшая и самая впечатляющая фича Prefix — это то, что он визуализирует весь конвейер запросов при разработке веб-приложений.

После загрузки и установки Prefix, вы сможете напрямую увидеть информацию об:

  • общем времени, затраченном на обслуживание страницы

  • перехваченном исключении (если оно имело место быть)

  • был ли возвращен код состояния 200,

а также другие важные подробности о своем приложении, которые вам необходимо мониторить и знать.

Оптимизация кода

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

Большинство приложений обычно используют сразу несколько зависимостей, например, таких как PaaS сервисы, ElasticSearch, Redis, queueing, SQL и NoSQL базы данных, MongoDB и многие другие. Prefix помогает разработчикам понять, правильно ли их код использует свои зависимости. Он также позволяет разработчику узнать, каким образом зависимости влияют на производительность их приложения.

Оптимизация конфигурации

При работе с любым PHP-приложением первое, с чего вы начинаете, — это настройка конфигурации и других параметров среды выполнения, необходимых вашему приложению. Да, вы можете значительно увеличить производительность вашего приложения оптимизируя код и добавляя предназначенные для этого фичи, но правильность конфигурации среды выполнения PHP также играет очень важную роль. Оптимизация конфигурации позволяет вам повысить производительность вашего приложения, а также обеспечить надежность и экономическую эффективность системного хранилища ваших приложений. Будьте внимательны — изменение любых настроек вашего приложения может привести к прекращению работы некоторых PHP-приложений. Необходимо четко понимать цель изменения определенных параметров, и помнить, что при отключении какой-либо из настроек, вам нужно обязательно проверить функциональность вашего приложения с учетом внесенных изменений с помощью запуска приложения в тестовой среде.

Распределенные вычисления

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

Стратегия кэширования

Хорошая стратегия кэширования может сократить количество операций с базами данных и компилирования кода. Зачастую разумным решением будет использовать Memcache для снижения нагрузки на базу данных, и Alternative PHP Cache(APC) для кэширования опкода и оптимизации кода. Для кэширования опкода PHP существует множество вариантов. К ним относятся APC (бесплатный!), EAccelerator (бесплатный), XCache (бесплатный) и Zend Platform. Сначала Stackify использовали Windows Azure Managed Cache, но на него поступали жалобы. Поэтому Stackify решили попробовать Redis, который теперь поддерживается Azure. Redis получил гораздо больше одобрения, чем Windows Azure Managed Cache. Мой совет вам — четко оценивайте каждую стратегию кэширования, чтобы увидеть, какая из них лучше всего отвечает вашим потребностям и дает наилучшие результаты.

Балансировка нагрузки

В веб-приложении балансировка нагрузки в основном затрагивает не само приложение, а влияет на хостинг и инфраструктуру. В PHP балансировка нагрузки конфигурируется в плагинах с помощью различных методов, таких как random, round-robin, и user’s filter. Когда дело доходит до назначения сервера, у вас есть возможность установить приоритеты (возможность приоритезации может быть очень полезна в разнородных средах). Единственное, что вы всегда должны помнить — следует избегать объектов сессий, поскольку они хранятся в памяти вашего локального компьютера. Таким образом, синхронизация ваших данных  во время резервного копирования или во время фактической обработки данных может быть неправильной.

Помимо необходимости избегать использования объектов сессий, вам также не следует хранить на сервере такие файлы, как изображения. Лучше всего размещать их в облаке. Наконец, если у вас есть серверы с одинаковой конфигурацией, всегда помните, что некоторые серверы лучше других в конфигурации железа.

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

Избегайте клиентского кода

Большое количество перенаправлений может значительно снизить скорость загрузки страницы каждого веб-приложения. Рекомендуется постоянно проверять и удалять или уменьшать количество перенаправлений на ваших страницах. С другой стороны, перенаправление пользователей на SSL-версию вашей страницы не сработает вообще.

Безопасность (HTTP/2 через SSL)

Протокол передачи гипертекста (HTTP) - это протокол прикладного уровня TCP/IP. HTTP отвечает за установление соединения между сервером и клиентом. Он также отвечает за обработку запросов пользователей на веб-странице или в браузере. С другой стороны, Secure Socket Layer (SSL) — это защищенная версия HTTP. Большая часть обмена данными между сервером и клиентом шифруется с помощью SSL.

На сегодняшний день большая часть браузеров поддерживает HTTP/2. Хотя браузеры и поддерживают HTTP/2, на самом деле он имеет некоторые ограничения со стороны сервера.

SQL

База данных — одна из фундаментальных составляющих веб-приложения. С базой данных SQL вы всегда должны понимать, как правильно должны функционировать базовые ресурсы. SQL Server имеет встроенные в него собственные динамические административные представления (dynamic management view — DMV). Большинство DVM предоставляют данные о статистике запросов, планах выполнения и многом другом. Преимущество DVM в том, что он всегда готов предоставить основную сводную статистику, но он не может визуализировать запросы, которые вызываются с течением времени.

Инструменты управления производительностью приложений (application performance management — APM) могут отслеживать SQL-запросы. Retrace предоставляет отслеживание SQL-запросов для нескольких поставщиков баз данных, включая SQL Server. Retrace также сообщает вам, сколько раз был выполнен запрос и какие транзакции его вызывали. Наиболее важным преимуществом использования Retrace является то, что он предоставляет подробные отчеты по всем приложениям и для каждого отдельного приложения и запроса. Он может подробно отображать транзакции, показывая то, как запросы используются в вашем приложении. Это самая важная информация, когда речь идет о повышении производительности PHP с SQL.

Сеть доставки контента (CDN)

Сеть доставки контента (Content delivery network — CDN) — один из самых эффективных и действенных способов ускорить загрузку веб-сайтов с высоким трафиком и/или глобальным охватом. Многие компании уже используют CDN при работе с крупными веб-сайтами для увеличения географического охвата. Этот метод может сократить время отклика, снизить расход трафика, обеспечить безопасность приложения, а также блокировать спамеров и другие средства скрапинга данных, которые могут атаковать вашу систему.

Обработка ошибок

Обработка ошибок — одна из важнейших частей разработки любого приложения. PHP предлагает различные методы и стратегии для обработки ошибок. Они позволяют вам устанавливать свои собственные правила обработки ошибок и изменять способ их регистрации. Это дает вам хорошую возможность улучшить и разработать отчеты об ошибках таким образом, чтобы они отвечали вашим потребностям.

Поиск и устранение ошибок — это головная боль во время и после разработки, и Stackify разработал решение этой проблемы. Самая мощная функция Retrace — это профилирование кода, которое может отслеживать ошибки, даже если вы не регистрируете их. Он находит скрытые ошибки в вашем коде и быстро уведомляет вас по электронной почте и SMS, прежде чем они затронут всех ваших клиентов. Мониторинг ошибок в Retrace не ограничен только разработкой, он доступен и в вашей производственной среде и будет автоматически обновлять информацию об ошибках и логи.

Заключение

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

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

Дополнительная информация

Эти статьи содержат дополнительную информацию о повышении производительности PHP, которая может быть вам полезна.


Материал подготовлен в рамках курса «PHP Developer. Professional».




Комментарии (2):