PHP Best Practices 2012

в 6:45, , рубрики: best practices, php

Интересные советы по php собранные все в одном месте
Мало кода, много слов, заинтересованных прошу под кат

PHP Best Practices 2012

Зараннее извиняюсь за 12, 37 и 39 пункт, так как считаю что неправильно передал суть
(неправильно перевел)

1. Если метод может быть статическим, объявляйте его статическим.
Улучшение производительности в 4 раза
2. echo быстрее чем print
3. Используйте echo несколько раз, вместо конкатенации строк
4. Устанавливайте максимальное значение до вашего for цикла.
5. Уничтожайте свои переменные для освобождения памяти, особенно в крупных массивах.
6. Избегайте магических методов __get, __set, __autoload
7. Использование require_once() — накладно
8. Используйте полные пути при include и require, сократите время на решение проблем с различными операционными системами
9. Если вам нужно узнать время когда скрипт запустился, предпочитайте

$_SERVER[’REQUEST_TIME’]  // чем использование - time()

10. Если вы можете использовать strncasecmp, strpbrk и stripos взамен регулярным выражениям — это очень хорошо
11. str_replace быстрее чем preg_replace, но strtr быстрее чем str_replace ~ 4 раза
12. Если функция замены строк, может принимать в аргументах как массив, так и одиночные символы, и ваш список аргументов не слишком длинный, подумайте над тем, чтобы записать несколько одинаковых “replacement statements”, проходя один символ за раз, вместо одной строки кода, которая принимает массив как аргумент поиска и замены
13. Лучше использовать switch case, вместо множественного if, else if
14. Подавление ошибок с помощью @ — очень медленное
15. Включите в apache настройках mod_deflate. mod_deflate — это модуль и набор патчей для Apache, позволяющие сжимать ответ методами gzip или deflate.
16. Закрывайте соединение с базой данных, после работы
17. Использование $row[’id’] даёт 7ми кратное увеличение в скорости, перед $row[id]
18. Сообщения об ошибках дороги
19. Не используйте функции внутри циклов, такие как for ($x=0; $x < count($array); $x), count() функция вызывается каждый раз при проходе цикла
20. Увеличение локальной переменной в методе самый производительный способ. Почти так же, как вызов локальной переменной в функции.
21. Увеличение глобальной переменной занимает в 2 раза больше времени, чем локальной
22. Увеличение свойства объекта (наприм.$this->prop++) в 3 раза медленее чем увеличение локальной переменной
23. Увеличение необъявленной локальной переменной в 9-10 раз медленее, чем с пред — инициализацией
24. Объявление глобальной переменной без использования в функции также замедляет работу (примерно на столько же, сколько увеличением локальной переменной). Вероятно PHP проверяет её существование.
25. Магические методы не зависят от количества методов объявленных в классе, потому что при добавлении, например 10 методов в тестовый класс, производительность никак не изменяется.
26. Методы в производных классах работают быстрее, чем те, что определены в базовом классе.
27. Вызов функции с одним параметром и пустым телом функции занимает примерно такое же время, как 7-8 $localvar++ операций. Аналогичный вызов метода, конечно, около 15 $ localvar + + операции.
28. Обрамляйте ваши строки ‘ ‘ вместо “ “, это сделает обработку немного быстрее так как php ищет переменные в двойных кавычках. Конечно вы можете сделать это только если у вас нет переменных в строке.
29. При выводе строк через echo, отделение точкой немножко быстрее нежели запятой. Примечание — работает только с echo, echo является функцией которая может иметь несколько строковых аргументов
30. Сценарий PHP, обслуживаутся по крайней мере от 2 до 10 раз медленнее, чем статические HTML страницы. Попробуйте использовать более статичные HTML-страницы и меньше скриптов.
31. Ваш PHP скрипты пере-подгружаются каждый раз, если не закэшированы. Установите и используйте кэширование для повышения производительности.
32. Используйте кэширование (Memcached) настолько, насколько это возможно.
33. Когда вы работаете со строками, вам например нужно проверить её длину и вы используете strLen() функцию. Она довольно быстра, так как не выполняет никаких расчетов, а лишь возвращает уже известную длину строки. Однако strLen() является все же медленной, потому что вызов функции требуется несколько операций, таких как “lowercase” и “hashtable lookup”. В некоторых случаях, вы можете увеличить скорость вашего кода используя вместо

if (strlen($foo) < 5) { echo "Foo is too short"; }

такой код

if (!isset($foo{5})) { echo "Foo is too short"; }

Вызов isset() оказывается быстрее, чем strLen(), поскольку isset() является языковой конструкцией, а не функцией, это означает, что ее выполнение не требует какого либо вызова иных функций.
34. При инкрементировании или декрементировании значения переменной $i++ оказывается чуть медленнее, чем ++$i. Это некая специфика PHP которая не распространяется на других языках, так что не изменяйте C или Java-код думая, что это он неожиданно станет быстрее, этого не будет. ++$i оказывается быстрее в PHP потому что вместо 4-х опкодов для $i++ вам нужно всего лишь 3. Пост-инкрементация фактически приводит к созданию временной переменной, которая затем увеличивается. Хотя пред-инкрементация увеличивает значение напрямую. Это одна из оптимизаций, в которой опкод оптимизирован как в PHP Zend.Также следует иметь в виду, что не все оптимизаторы работают так же.
35. Не все должно быть на ООП, часто это слишком большие накладные расходы, каждый метод и объект вызова потребляет много оперативной памяти.
36. Не делайте каждую структуру данных классом, массивы так же полезны
37.Не слишком разбивайте методы. Думайте, что вы действительно будете повторно использовать.
Don’t split methods too much, think, which code you will really re-use
38. Вы всегда можете разбить код на методы позже, по необходимости.
39. Используйте бесчисленное количество предопределённых функций “the countless predefined f.”
40. Если в вашем коде есть функции, выполняющиеся очень долго, обдумайте их написание на C в виде расширения
41. Профилируйте свой код. Профайлер покажет вам, какая часть вашего кода потребляет больше всего времени, а так же другие узкие места. Xdebug — выбор № 1.
42. mod_gzip, который доступен как модуль Apache сжимает данные на лету и может уменьшить передачу данных, до 80%
43. Отличная статья об оптимизации PHP, написана John Lim
44. Не забывайте о профилированиии своего кода :)
45. Всегда обновляйте версию php интерпретатора, при новых релизах
46. Избегайте написания простых сетеров и гетеров: При написании классов PHP, вы можете сэкономить время и ускорить работу скриптов при работе с объектом свойства напрямую, а не писать простые методы установки и получения. В следующем примере, класс dog использует setName() и getName() для доступа к имени свойства.

class dog {
  public $name = '';
 
  public function setName($name) {
    $this->name = $name;
  }
 
  public function getName() {
    return $this->name;
  }
}

Обратите внимание, что setName() и getName() ничего не делать больше, чем хранение и возврат имени свойства, соответственно.

$rover = new dog();
$rover->setName('rover');
echo $rover->getName();

Установка и вызов имени свойства непосредственно может работать до 100% быстрее, а также это сокращает время разработки.

$rover = new dog();
$rover->name = 'rover';
echo $rover->name;

47. Не копируйте переменные без причины: иногда PHP новички пытаются сделать свой ​​код «чище», копируя предопределенные переменные в переменные с более короткими именами, прежде чем работать с ними. Это на самом деле приводит к двойному потреблению памяти (при изменении переменной), и, следовательно, к медленным скриптам. В следующем примере, пользователь выставил 512 КБ символов в поле текстового поля. Эта реализация может привести к использованию почти 1 Мб оперативной памяти.

$description = strip_tags($_POST['description']);
echo $description;

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

echo strip_tags($_POST['description']);

48. Избегайте SQL запросов в цикле: Распространенной ошибкой является размещение SQL запросов внутри цикла. В результате несколько обращений к базе данных, и значительное замедленнее сценария. В примере, приведенном ниже, вы можете изменить цикл, построить один запрос SQL и вставить всех пользователей сразу.
Best practise: Mysql Insert Syntax

Автор: TBIKC

* - обязательные к заполнению поля