Тема: 40 порад по оптимізації вашого PHP коду
Оригінал статті (авторство): reinholdweber.com
Стаття на російській: http://habrahabr.ru/post/22799/
Переклад на українську: я
1.Якщо метод може бути статичним, оголошуйте його статичним.
2.echo швидше, ніж print.
3.Передавайте в echo декілька параметрів, замість того, щоб використовувати конкатенацію рядків.
4.Встановлюйте максимальну кількість проходів ваших циклів for до циклу, а не під час його виконання.
5.Видаляйте свої змінні для звільнення пам'яті, тим більше, якщо це великі масиви.
6.Остерігайтеся магічних методів, таких як __set(), __get(), __autoload().
7.require_once дорого обходиться.
8.Вказуйте повні шляхи в конструкціях include / require, менше часу буде витрачається на пошук файлу.
9.Якщо вам необхідно визначити час, коли скрипт був запущений, використовуйте $_SERVER['REQUEST_TIME'] замість time().
10.Намагайтеся використовувати strncasecmp(), strpbrk() і stripos() замість регулярних виразів.
11.str_replace() швидше, ніж preg_replace(), але strtr() швидше, ніж str_replace().
12.Якщо функція, як і функції заміни рядків, може приймати в аргументи як масиви, так і одиночні символи, і якщо ваш список аргументів не дуже довгий, подумайте над тим, щоб записати кілька однакових виразів заміни, проходячи один символ за раз, замість одного рядка коду, яка приймає масив як аргумент пошуку і заміни.
13.Краще вибирати затвердження за допомогою конструкції else if, ніж використовувати кілька конструкцій if.
14.Придушення помилок при використанні @ працює дуже повільно.
15.Використовуйте модуль Apache mod_deflate.
16.Закривайте свої з'єднання з БД, коли закінчите працювати з ними.
17.$row['id'] в сім разів швидше, ніж $row[id].
18.Повідомлення про помилки дорого коштують.
19.Не використовуйте функції всередині умови циклу for, наприклад як тут: for($x = 0; $x < count($array); $x). В даному випадку функція count() буде викликатися з кожним проходом циклу.
20.Інкремент локальної змінної в методі - найшвидший. Майже так само працює інкремент локальної змінної у функції.
21.Інкремент глобальної змінної в два рази повільніше, ніж локальної.
22.Інкремент властивості об'єкта (тобто $this->prop++) в три рази повільніше, ніж локальної змінної.
23.Інкремент невизначеної змінної в 9-10 разів повільніше, ніж заздалегідь ініціалізованої.
24.Оголошення глобальної змінної, без використання її у функції, також уповільнює роботу (приблизно на ту ж величину, що і інкремент локальної змінної). Ймовірно, PHP здійснює перевірку на існування змінної.
25.Швидкість виклик методу, судячи з усього, не залежить від кількості методів, визначених в класі. Я додав 10 методів в тестовий клас (до і після тестового методу), без зміни продуктивності.
26.Методи в похідних класах працюють швидше, ніж вони ж, певні в базовому класі.
27.Виклик функції з одним параметром і порожнім тілом функції в середньому дорівнює 7-8 Інкрементам локальної змінної ($localvar++). Виклик схожого методу, зрозуміло, близько 15 інкрементів.
28.Ваші рядки, певні за допомогою ', а не ", будуть інтерпретуватися трохи швидше, т.к. PHP шукає змінні усередині" .. ", але не' ... '. Звичайно, ви можете використовувати це тільки тоді, коли у вашому рядку немає змінних.
29.Рядки, розділені комами, виводяться швидше, ніж рядки, розділені крапкою. Примітка: це працює тільки з функцією echo, яка може приймати кілька рядків в якості аргументів.
30.PHP-скрипти оброблятимуться, як мінімум, в 2-10 разів повільніше, ніж статичні HTML-сторінки. Спробуйте використовувати більше статичних HTML-сторінок і менше скриптів.
31.Ваші PHP-скрипти перекомпілюються кожного разу, якщо скрипти НЕ кешуються. Кешування скриптів зазвичай збільшує продуктивність на 25-100% за рахунок видалення часу на компіляцію.
32.Кешуйте, наскільки це можливо. Використовуйте memcached - це високопродуктивна система кешування об'єктів в пам'яті, яка підвищує швидкість динамічних веб-додатків за рахунок полегшення завантаження БД. Кешированний мікрокод корисний тим, що дозволяє вашому скрипту НЕ компілюватися знову для кожного запиту.
33.При роботі з рядками, коли вам знадобиться переконатися в тому, що рядок певної довжини, ви, зрозуміло, захочете використовувати функцію strlen(). Ця функція працює дуже швидко, адже вона не виконує будь-яких обчислень, а лише повертає вже відому довжину рядка, доступну в zval-структурі (внутрішня структура C, використовувана при роботі із змінними в PHP). Однак тому, що strlen() - функція, вона працюватиме повільно за рахунок виклику деяких операцій, таких як приведення рядка в нижній регістр і пошуку в хеш-таблиці, тільки після яких будуть виконані основні дії функції. У деяких випадках ви зможете прискорити свій код за рахунок використання хитрості з isset().
Було: if(strlen($foo) < 5) { echo 'Foo is too short'; }
Стало: if (!isset($foo{5})) {echo 'Foo is too short'; }
Виклик isset() швидше, ніж strlen() тому, що, на відміну від strlen(), isset() - не функція, а мовна конструкція. За рахунок цього isset() не має практично ніяких накладних витрат на визначення довжини рядка.
34.Інкремент або декремент змінної при допомозі $i++ відбувається трохи повільніше, ніж ++$i. Це особлива специфіка PHP, і не потрібно таким чином модифікувати свій C і Java-код думаючи, що він буде працювати швидше, цього не станеться. ++$i буде швидше в PHP тому, що замість чотирьох команд, як у випадку з $i++, вам знадобиться тільки три. Пост-інкремент зазвичай використовується при створенні тимчасових змінних, які потім збільшуються. У той час, як пре-інкремент збільшує значення оригінальної змінної. Це один із способів оптимізації PHP-коду в байт-код утилітою Zend Optimizer. Тим не менш, це гарна ідея, оскільки не всі байткод-оптимізатори оптимізують це, також залишається чимало скриптів, що працюють без оптимізації в байткод.
35.Не все повинно бути ООП, часто це зайве, оскільки кожен метод і об'єкт займає багато пам'яті.
36.Не визначайте кожну структуру даних як клас, масиви бувають дуже корисні.
37.Не надто розбивайте методи. Думайте, що ви дійсно будете повторно використовувати.
38.Ви завжди можете розбити код на методи пізніше, по необхідності.
39.Використовуйте незліченну кількість наперед визначених функцій.
40.Якщо у вашому коді є функції, які виконуються дуже довго, обдумайте їх написання на C у вигляді розширення.
41.Профіліруйте свій код. Профілізація покаже вам, як багато часу виконуються частини вашого коду.
42.mod_gzip - модуль Apache, який дозволяє стискати ваші дані на льоту і може зменшити обсяг переданих даних до 80%.