Статьи

Як поліпшити продуктивність PHP для веб-додатків

  1. Коротка історія PHP
  2. Що таке дійсно хороша продуктивність PHP?
  3. Коли слід починати оптимізувати PHP-код?
  4. Поради щодо оптимізації PHP -скріптов
  5. Вузькі місця продуктивності PHP
  6. Ще поради щодо поліпшення продуктивності PHP
  7. Необхідно вміти контролювати продуктивність PHP
  8. Перспективи покращення продуктивності PHP

Однак підтримання оптимальної продуктивності PHP - це не тільки швидке виконання коду. Кращий інструмент для поліпшення продуктивності PHP не знайти серед готових програм. Необхідно знати, на які саме проблеми продуктивності звернути увагу і як їх вирішувати. У цій статті ми постаралися зібрати все, що потрібно для успішної роботи з PHP-додатками.

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

Коротка історія PHP

PHP - це мова сценаріїв, винайдений Расмусом Лердорфом (Rasmus Lerdorf) в 1995 році. Спочатку ця мова розробники написали для себе. Тому мова отримала відповідну назву PHP як абревіатуру від "Personal Home Page" - «Особиста Домашня Сторінка».

В ході подальшої роботи над мовою Лердорф істотно розширив функціональність PHP, тому вважається, що PHP тепер є рекурсивної абревіатурою від "PHP: Hypertext Preprocessor" - «PHP: Гіпертекстову Препроцесор».

За останні два десятиліття група розробників PHP поліпшила продуктивність PHP в наступних напрямках:

1. Перш за все, в 1999 році з'явився новий PHP-движок Zend Engine;

2. У 2000 році вийшов PHP 4, який включав компілятор в пам'яті і модель виконавця, що дозволило використовувати PHP для створення динамічних веб-додатків;

3. У 2004 році був випущений PHP 5. Крім іншого - оновилося ядро ​​Zend (Zend Engine 2), що істотно збільшило ефективність цього інтерпретатора;

4. У 2015 році з'явився оновлений PHP 7.0 з поліпшеним движком Zend Engine і зменшеним споживання пам'яті;

5. У момент написання статті доступна нова версія PHP 7.1 від грудня 2016 року. Веб-сайт класів PHP містить докладний опис усіх змін, внесених між PHP 5 і PHP 7.1 ( також у Вікіпедії ).

Що таке дійсно хороша продуктивність PHP?

Слід мати на увазі, що продуктивність і швидкість - не є синонімами. Оптимальна продуктивність балансує між швидкістю, безпомилково і масштабованість. Наприклад, при написанні веб-додатки доведеться вибирати між двома пріоритетами:

1) пріоритетом швидкості, написавши скрипт, який заздалегідь завантажує все в пам'ять;

2) пріоритетом масштабованості зі скриптом, який завантажує дані блоками.

Наступний малюнок 1 взятий з англійської статті на сайті . На ньому зображений теоретичний компроміс між швидкістю і масштабністю.

Червона лінія являє сценарій, оптимізований для швидкості, а синя лінія - для масштабованості. На горизонтальній осі відкладена швидкість виконання скриптів), на вертикальній - кількість одночасних викликів сайту).

Мал Мал. 1. Теоретичний компроміс між швидкістю і масштабністю

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

Отримуємо, що коли трафік перевищує певний поріг, сценарій для швидкості стає повільніше сценарію для масштабованості. Цей поріг добре видно на малюнку як перетин червоною і синьою ліній.

Тут можна провести аналогію з бігунами на різні дистанції: зі спринтером (бігуном на короткі дистанції) і стаєр (бігуном на довгі дистанції). Спринтери набагато швидше біжать на короткі дистанції, але на більш довгих вони втомлюються. Стаєр тримають повільніший, але більш стабільний темп, який дозволяє їм зберігати енергію на великих відстанях. Аналогічно, різні скрипти працюють краще в різних ситуаціях. Правильний вибір скрипта для конкретного додатка вимагає спостереження за активністю користувачів на сайті. При зростанні трафіку доведеться переходити з одного скрипта на інший.

Коли слід починати оптимізувати PHP-код?

Досвідчені програмісти час від часу зберігають протестований код, закінчуючи тим самим цикл проекту. Але це розумно робити тільки при гарній продуктивності PHP-програми!

Як домогтися гарної продуктивності PHP-додатки? Необхідно проводити тести під час процесу розробки. Інакше доведеться переписувати великі блоки коду, щоб змусити додаток нормально функціонувати.

Оптимізувати PHP-код слід починати перед створенням PHP-програми! Необхідно відразу оцінити стан вашого заліза і програмного забезпечення, щоб визначити параметри їх продуктивності. Ця інформація при кодуванні додатки дозволить оцінити ризики і виграш конкретних компромісів. Причому необхідно використовувати адекватні тестові дані, інакше код додатка виявиться безперспективним.

Поради щодо оптимізації PHP -скріптов

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

1. Використання попередніх функції PHP

Скрізь, де це можливо, використовуйте готові функції PHP. Уникайте написання ваших власних функцій. Для цього витратьте трохи часу на вивчення функцій PHP. Тоді код додатка вийде більш швидким і ефективним.

2. Використовуйте JSON замість XML

Функції PHP json_encode () і json_decode () просто неймовірно швидкі. Тому використання JSON краще використання XML.

Якщо вам все-таки доводиться розбиратися з XML, краще використовувати шаблонні регулярні вирази, ніж маніпуляції з DOM.

3. Використовуйте методи кешування

Кеш-пам'ять особливо корисна для скорочення обсяг даних при завантаженні.

Кешування байт-коду за допомогою APC або OPcache сильно економить час виконання скомпільованого сценарію.

4. Приберіть зайві обчислення

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

5. Використовуйте isset ()

Проводьте порівняння за допомогою пар count (), strlen () і sizeof (), isset (). Це швидкий і простий спосіб пошуку значень, більше нуля.

6. Вимкніть непотрібні класи

Якщо не планується використовувати класи або методи багаторазово, то вони взагалі не потрібні. Якщо необхідно все ж використовувати класи, краще використовувати методи похідного класу, оскільки вони швидше методів базових класів.

7. Вимкніть налагоджувальні повідомлення

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

8. Закривайте з'єднання з базою даних

Скидання змінних і закриття з'єднань з базою даних заощадить дорогоцінну пам'ять.

9. Обмежте звернення до бази даних

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

10. Використовуйте рядкові функції Str

str_replace швидше, ніж preg_replace, а strtr в чотири рази швидше, ніж str_replace.

11. Використовуйте одинарні лапки

Коли тільки можливо, використовуйте одинарні лапки, а не подвійні. Подвійні лапки перевіряються компілятором на змінні, що знижує продуктивність.

12. Використовуйте три знака рівності

Оскільки «= = =» перевіряє величини тільки одного типу, це робить оператор порівняння «= = =» більш швидким, ніж оператор «= =».

Вузькі місця продуктивності PHP

Буває, звичайно, що переробка сценаріїв вигідна. Однак є проблеми, які знижують продуктивність PHP, не пов'язані з кодом програми. Тому розробникам потрібно розбиратися в підсистемах їх сервера, щоб визначити і усунути вузькі місця. Нижче перераховані області, які потрібно перевіряти при появі проблем з продуктивністю.

1. Мережа

Один з очевидних джерел вузьких місць - це мережі. Може просто не вистачити ресурсів мережі для обробки переданого обсягу даних.

2. Центральний процесор

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

3. Спільна пам'ять

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

4. Файлова система

Файлова система з часом стає фрагментованою. Тому використовуйте файловий кеш RAM, який прискорить доступ до диска, якщо цей кеш достатнього розміру.

5. Управління процесами

Переконайтеся, що сервер не перевантажений непотрібними процесами. Видаліть будь-які невикористані мережеві протоколи, антивірусні сканери, поштові сервери та драйвери устаткування.

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

6. Інші сервери

Якщо додаток залежить від зовнішніх серверів, їх вузькі місця будуть знижувати продуктивність. У такій ситуації, на жаль, мало що можна змінити. Тим не менш, завжди можна придумати якісь зміни на своєму боці, щоб пом'якшити таке падіння продуктивності.

Ще поради щодо поліпшення продуктивності PHP

1. Використовуйте розширення ядра Zend OPCache

Так як PHP інтерпретується в виконуваний код, програмісту доводиться повторно компілювати код навіть при невеликому його зміні на працюючому сайті. На жаль, така повторна компіляція практично однакового коду знижує продуктивність. Звідси зрозуміло, чому кешування проміжного коду - OPCache - дуже корисно.

Zend OPCache - це розширення, яке зберігає скомпільований код в пам'яті. Це дозволяє PHP в наступний раз при виконанні коду перевіряти розмітки часу і розміри файлу, щоб визначити, чи були частини вихідного файлу змінені. Якщо таких змін не було, то буде запущений збережений код.

Більш детальну інформацію можна отримати в статті на Хабрахабр «PHP Performance Series: Caching Techniques»

На малюнку 2 показано відмінність в часі виконання і використанні пам'яті між PHP-додатком, виконуваних: 1) без кешу; 2) з OPcache; 3) з eAccelerator (інший інструмент PHP-кешування).

Правий графік показує час виконання в мілісекундах (Execution Time (ms)), лівий - використання пам'яті в мегабайтах (Memory usage (mb)). Стовпчики синього кольору відповідають відсутності кешування, червоного - кешуванню OPcache, зеленого - кешуванню eAccelerator.

З малюнка 2 випливає, що кешування OPcache знижує як час виконання, так і використання пам'яті приблизно в два рази в порівнянні з відсутністю кешування. Кешування eAccelerator трохи поступається кешуванню OPcache.

Мал Мал. 2. Стовпчикові діаграми відмінності в часі виконання і використанні пам'яті між PHP-додатком, виконуваних без кешування, з OPcache і з eAccelerator

2. Виявити затримки бази даних

Як уже сказано вище, проблеми продуктивності не завжди пов'язані з кодом. Більшість вузьких місць виникає при зверненні додатки до ресурсів. Обслуговування доступу до даних PHP-додатки може становити до 90 відсотків часу виконання. Тому в першу чергу необхідно проаналізувати всі випадки доступу до бази даних.

Переконайтеся, що лог повільних запитів SQL включений, щоб мати можливість виявити їх. Потім вивчите ці повільні запити, щоб оцінити їх ефективність. Якщо виявиться, що виконується занадто багато запитів або одні й ті ж запити необґрунтовано повторюються, внесіть відповідні зміни. Такі зміни повинні підвищити продуктивність програми, скорочуючи час доступу до бази даних.

Як дізнатися, які з запитів виконуються найдовше? Більш детально див. Статтю на Хабрахабр «Як виявити повільні SQL запити?», URL: https://habrahabr.ru/post/31072/

3. Очистіть файлову систему

Проаналізуйте файлову систему на неефективність, тобто упевніться, що файлова система не використовується для зберігання сесій. Найголовніше - уважно стежте за функціями статистики файлів: file_exists (), filesize () і filetime (). Попадання цих функцій всередину циклу призводить до проблем з продуктивністю.

4. Ретельно контролюйте показ API

Більшість веб-додатків, які залежать від зовнішніх ресурсів, використовують віддалений API. Хоча віддалений API знаходиться поза вашим контролем, однак можна пом'якшити проблеми API-продуктивності. Наприклад, можна кешувати API-висновок або робити фонові виклики API. Встановіть розумні інтервали для API-запитів і, якщо це можливо, показуйте на дисплеї API-висновок без відповіді API.

5. профілюючих PHP

Використання OPcache і управління зовнішніми ресурсами досить, щоб більшість додатків виконувалися благополучно. Але якщо ваші потреби ростуть, пора профілювати PHP. Звичайно, повне профілювання PHP-коду забирає багато часу, але воно дає всебічну інформацію про продуктивність PHP-додатки. Є загальнодоступні програми для профілювання PHP-коду, такі, як Xdebug.

Xdebug розглядається в статті на Хабрахабр «Introducing xdebug»

Необхідно вміти контролювати продуктивність PHP

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

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

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

Перспективи покращення продуктивності PHP

Еволюція PHP триває. Новітнє зміна в розробці PHP 8 - це додавання компіляції «на льоту», або JIT-компіляції, яка дозволить створювати ще більш швидкі веб-додатки. Так як темп технологічного прогресу зростає, зростають очікування користувачів. Тому розробники повинні завжди уважно стежити за останніми змінами.

Технологія JIT-компіляції описана у Вікіпедії.

Будуючи веб-додатки, пам'ятайте, що сьогоднішні додатки можуть не працювати наступного року. Ймовірно, доведеться вносити зміни, щоб забезпечити стабільну продуктивність PHP. Подання повної картини процесу розвитку - найкраща стратегія масового будівництва PHP-додатків і веб-сайтів.

Коли слід починати оптимізувати PHP-код?
Що таке дійсно хороша продуктивність PHP?
Коли слід починати оптимізувати PHP-код?
Як домогтися гарної продуктивності PHP-додатки?
Як дізнатися, які з запитів виконуються найдовше?
Статтю на Хабрахабр «Як виявити повільні SQL запити?

Новости