Максимізація додатку — PHP

pic

Коли ми програмуємо, незалежно від мови, існують концепції та техніки, які ми можемо використовувати, щоб покращити як читабельність і зрозумілість коду, так і продуктивність додатку.

Головний висновок тут: не намагайтеся винайти колесо заново. Як я завжди кажу: вивчайте та досліджуйте. Дуже ймовірно, що хтось вже зіткнувся з тією ж проблемою, що і ви, і знайшов ефективне рішення. Використання накопиченого знання спільноти не лише економить час, але й допомагає уникнути пасток та поширених помилок.

Запити та бази даних

Щодо цієї важливої теми для додатків, я вже писав дещо, варто ознайомитися.

Оптимізація зберігання та читання даних у MySQL та додатку

Техніки оптимізації продуктивності

Окрім запитів та баз даних, є й інші важливі сфери для оптимізації додатків. Виділимо деякі з них:

Кеш

Використання кешу є необхідним для зменшення навантаження на базу даних, тимчасово зберігаючи дані, до яких часто звертаються. Спільнота широко використовує Redis для цієї мети.

Redis — це високопродуктивна база даних NoSQL в пам'яті, але вона є волатильною, оскільки пам'ять не є постійною. Вона ідеально підходить для таких випадків:

  • Дані для реального часу
  • Сесії користувачів
  • Кошики покупок

pic

Laravel чудово абстрагує використання Redis, як для кешування, так і для інших цілей. Однак використовуйте його обережно! Зробіть багато тестів і дізнайтеся про техніки відмовостійкості (failover), щоб справлятися з можливими відключеннями. Наприклад, якщо ваша панель моніторингу в реальному часі залежить від Redis, що ви зробите, якщо він стане недоступним? Планування альтернатив є критично важливим.

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

Ось кілька важливих моментів, коли йдеться про оптимізацію написання коду:

  • Цикли: Не завжди заміна for на foreach покращить продуктивність. Хоча код може стати більш читабельним, важливо протестувати за допомогою інструментів, таких як Xdebug або простих функцій, як microtime(), щоб перевірити реальний вплив. Зверніть увагу на обробку даних у циклі та уникайте витрат пам'яті.
  • Вбудовані операції: Використання вбудованих функцій PHP, таких як array_map, зазвичай є більш безпечним і ефективним, ніж створення власних рішень. Пам'ятайте: "Не треба винаходити колесо".
  • Мінімізуйте операції в циклі: Уникайте створення циклів усередині циклів без необхідності. Вкладений foreach може бути таким самим шкідливим, як і SELECT *. Натомість розгляньте альтернативні рішення, наприклад, переписати логіку або використовувати більш ефективні запити, щоб зменшити складність.
  • PSR (PHP Standards Recommendations): Дотримання практик PSR покращує читабельність і підтримуваність коду. Сьогодні IDE пропонують розширення, які автоматизують застосування цих стандартів при збереженні змін. Це не лише допомагає покращити якість коду, а й спрощує життя тим, хто буде його підтримувати в майбутньому.
  • Черги: Використання черг (queues) стає все більш популярним. Ідея проста: якщо обробка задачі може бути зроблена пізніше, зніміть її з виконання в методі.
    Приклад:
    Коли користувач здійснює покупку в інтернет-магазині, чи потрібно негайно відправляти електронний лист з підтвердженням? Часто ні. У такому випадку ви можете надіслати лист у чергу, яка буде оброблена партіями, заощаджуючи ресурси та забезпечуючи масштабованість.
  • Підпроцеси: Це не срібна куля, але в залежності від ситуації, її можна застосувати, і це буде корисно.
    Приклад:
    Уявіть собі додаток, який відповідає за обробку сотень рахунків-фактур одночасно, розраховуючи податки для кожної з них.
    Якщо всі ці операції виконуються послідовно, ви можете зіткнутися з попередженнями про повільну роботу, навіть якщо ресурси комп'ютера не обмежені (ЦП і оперативна пам'ять).
    У такому випадку підпроцеси можуть стати вирішенням. Розділіть обробку на невеликі частини та виконуйте їх паралельно. Наприклад, кожен підпроцес може бути відповідальним за обчислення податків для групи рахунків-фактур. Це дозволяє вашому додатку ефективніше використовувати доступні ресурси, прискорити обробку та уникнути вузьких місць.
  • Requires і includes: Віддавайте перевагу використанню autoload для керування завантаженням класів та файлів. Це не тільки покращує продуктивність, а й допомагає уникнути проблем з великими та непотрібними класами (так званими "мегазордами"). Наприклад, завантажувати клас з 7 000 рядків лише для того, щоб використовувати метод, який робить SELECT, є надзвичайно неефективно. В таких ситуаціях важливо розглянути рефакторинг.

Щодо мегазорда, варто поговорити про Рефакторинг.

Оптимізації серверу

pic

Перше, що потрібно знати — PHP є дуже легким мовою програмування. За звичайних умов температури і тиску, з відповідною машиною для кількості запитів і необхідними оптимізаціями коду, все зазвичай працює добре.

"Але Матей, що таке машина, відповідна кількості запитів?"
Я вже впроваджував та оптимізував складні додатки, які отримували понад 6 мільйонів запитів на день, використовуючи в середньому дві машини з 2 vCPU та 2 ГБ оперативної пам'яті кожна.

Тепер про основні інструменти:

  • PHP-FPM
    Це менеджер процесів FastCGI для PHP, альтернатива модулю PHP для Apache. PHP-FPM є швидшим, гнучким і широко використовуваним у продакшн-середовищах.
  • OpCache
    Система кешування для PHP скриптів. Вона зберігає попередньо скомпільований PHP код в пам'яті, що дозволяє PHP виконувати код швидше, знижуючи час виконання і споживання ресурсів.
  • Оновлення версій
    Важливо підтримувати пакети, інструменти, фреймворки та саму мову PHP в актуальному стані. Я розумію, що часто перехід від старішої версії, такої як PHP 7.4, до нової, як PHP 8.x, може здатися важким. Однак переваги в плані продуктивності, безпеки та підтримки виправдовують зусилля.

Важливі зауваження:
Особливу увагу слід приділити налаштуванню потоків і дочірніх процесів. Встановлення дуже високих значень для цих налаштувань або дозвіл на використання великих файлів може призвести до перевантаження машини, що спричинить збої та недоступність. Завжди налаштовуйте ці параметри відповідно до можливостей машини та реальних вимог додатку.

Моніторинг

Один із найбільш важливих моментів, коли йдеться про оптимізацію, — це розуміння того, що потребує оптимізації. Для цього хороша інструмент моніторингу на рівні APM (Application Performance Monitoring) може надати цінну інформацію та дозволити вжити превентивних заходів до того, як проблеми стануть критичними.

Існують різні підходи до моніторингу, від ручного перегляду логів PHP до автоматизованих рішень. Серед автоматизованих інструментів виділяються:

  • New Relic
  • DataDog

Ці інструменти відомі як “plug and play”: достатньо встановити агент, перезапустити службу та налаштувати панелі для створення метрик та сповіщень.

З іншого боку, є більш ручні варіанти, які хоча й потребують більше зусиль і знань команди, але можуть бути корисними залежно від контексту:

  • Prometheus + Grafana
  • Elastic Stack
  • NetData

Використання цих ручних інструментів має свої труднощі через складність, яку вони додають, особливо в великих додатках, де немає спеціалізованої команди для підтримки. Ці рішення вимагають багато налаштувань, ретельних тестів і уваги, щоб уникнути негативного впливу агентів на продуктивність.
Крім того, вони потребують шарів і шарів failover — лише одна машина резервування часто не є достатньою.

Незважаючи на це, впровадження та тестування цих інструментів може стати чудовим викликом на вихідні!

У більшості випадків інструменти, як New Relic, пропонують відмінну відправну точку, надаючи великі можливості для запобігання катастрофам. Однак важливо звертати увагу на вартість, яка може стати значною залежно від використання.

Перекладено з: Maximizando a aplicação — PHP

Leave a Reply

Your email address will not be published. Required fields are marked *