PHPБолее 50 собранных подсказок по оптимизации PHP или ускоряем PHP скрипты #2

Перевод статьи «50+ PHP optimisation tips revisited»


Автор статьи собирает воедино все найденные им трюки и рекомендации.
Первые 10 опущены, т.к. содержатся в этом топике.

внимание! много буковок и нецензурных картинок!

1) «Начиная с PHP5, время начала работы скрипта может быть найдено здесь:
$_SERVER[’REQUEST_TIME’]
пользуйтесь вместо time() или microtime()» [Цитата]
(комментарии)
2) «Регулярные выражения PCRE быстрее, чем EREG, но всегда проверяйте, можете ли вы пользоваться такими языковыми функциями, как strncasecmp, strpbrk и stripos взамен регулярных выражений.» [Цитата]
3) «Когда обрабатываете XML, используйте xml2array, который позволяет работать с XML PHP-функциями (конвертирует в массив с XML структурой — прим. переводчика), для HTML вы можете использовать PHP DOM документы или DOM XML в PHP4.» [Цитата]
4) «str_replace быстрее, чем preg_replace, str_replace лучше во всем, однако strtr иногда быстрее работает с длинными строками. Использование array() внутри str_replace обычно быстрее множественных str_replace.» [Цитата]
5) «else — if блок быстрее, чем switch-case» [Цитата]
6) «Подавление ошибки (suppression errors) с @ медлительно» [Цитата]
7) «Чтобы уменьшить трафик, включите mod_deflate в Apache v2» [Цитата] «или mod_gzip в Apache v1» [Цитата]
8) «Закрывайте соединения с БД, когда работа с ними окончена» [Цитата]
9) "$row['id'] в 7 раз быстрее, чем $row[id], т.к. если не использовать ковычки, то начинается гадание, какой индекс вы имеете в виду, преполагая то, что вы не подразумевали константу" [Цитата]
10) «Используйте <?php… ?> теги когда программируете на php, т.к. все другие стили будут упразднены, включая короткие теги» [Цитата]
11) «Пишите однозначно, избегайте подавления ошибок (suppression errors)» [Цитата]
12) «PHP скрипты будут обрабатываться Apache'ем в 2-10 раза медленнее статических страниц. Старайтесь ипользовать статические страницы вместо скриптов, который выполняются сервером» [Цитата]
13) «PHP скрипты (за исключением кэшированных) пкомпилируются на лету при каждом вызове Установите программу кэширующую их (например, memcached, eAccelerator или Turck MMCache), чтобы просто увеличить производительность на 25-100% исключая время компиляции. Вы даже можете установить eAccelerator на cPanel, используя EasyApache3» [Цитата]
14) «Альтернативной кэширующей техникой, когда у вас есть страницы, которые не меняются слишком часто, является кэширование выходных HTML-данных с ваших PHP страниц. Попробуйте Smarty или Cache Lite» [Цитата]
15) «Используйте isset вместо strlen везде, где это возможно.
if (strlen($foo) < 5) { echo “Foo is too short”; }
против
if (!isset($foo{5})) { echo “Foo is too short”; }» [Цитата]
16) "++$i быстрее, чем $i++, так что по возможности пользуйтесь префиксным инкрементом." [Цитата]
17) «Используйте бесчисленное множество стандартных функций PHP, не пытайтесь создавать свои такие же, т.к. встроенные будут намного быстрее; если у вас есть время и силы, касательно функций, расмотрите возможность написания их на C и вынесения в отдельное расширение или модуль.» [Цитата]
18) «Проверяйте производительность своего кода. Специальные инструменты покажут вам какие части скрипта занимают больше времени. Отладочная программа Xdebug уже содержит тестировщик производительности. Тестирование наглядно покажет вам узкие места в коде.» [Цитата]
19) «Документируйте свой код» [Цитата]
20) «Осознайте разницу между хорошим и плохим кодом» [Цитата]
21) «Придерживайтесь стандартов программирования, это облегчит ваше понимание чужого кода и понимание вашего кода другими. » [Цитата]
22) «Разделяйте код, содержимое и оформление: храните ваш PHP код отдельно от HTML.» [Цитата]
23) «Не злоупотребляйте использованием громоздких шаблонных систем вроде Smarty, используйте одну из уже встроенных в PHP, посмотрите в сторону ob_get_contents и extract, и упростите представление данных, которые получаете из БД.» [Цитата]
24) «Никогда не доверяйте переменных полученных от пользователя (это относится и к $_POST), используйте mysql_real_escape_string при использовании mysql и htmlspecialchars, когда выводите HTML.» [Цитата]
25) «Из соображений безопасности, никогда не выдавайте информацию о местонахождении скриптов, расширениях и конфигурации, подобно display_errors или phpinfo().» [Цитата]
26) «Выключите register_globals (выключено по умолчанию как раз по этой причине!). Ни в каких рабочих скриптах не нужно использовать преимущества включения этой опции — это риск для безопасности. Исправьте все скрипты, которые ее используют, и все, которые требуют её отключения функцией unregister_globals(). Сделайте это сейчас, т.к. все это будет исключено из PHP6.» [Цитата]
27) «Избегайте использование открытого текста при хранении и работые с паролями, чтобы улучшить безопасность, вместо этого используйте хэши, такие как md5.» [Цитата]
28) «Используйте ip2long() и long2ip() для хранения IP адресов числами вместо строк» [Цитата]
29) «Вы можете избежать очередного изобретения колеса, используя PEAR проект, предоставляющий готовый код высокого качества.» [Цитата]
30) «При использовании header(’Location: ‘.$url); не забывайте следить за этим с помощью die(); чтобы скрипт продолжил работать даже при смене местоположения или избегайте, по возможности, использования всего этого.» [Цитата]
31) «В ООП, если метод может быть статическим, сделайте его статическим. Скорость улучшается раза в 4.» [Цитата]
32) «Увеличение локальной переменной в методе ООП быстрее. Практически так же как, вызов локальной переменной в функции и увеличение глобальной переменной в 2 раза медленнее, чем локальной.» [Цитата]
33) «Увеличение свойства объекта (т.е. $this->prop++) в 3 раза медленнее, чем локальной переменной.» [Цитата]
34) «Увеличение неопределенной локальной переменной в 9-10 раз медленнее, чем определенной до этого.» [Цитата]
35) «Просто объявление глобальной переменной вместо использования её в функции медленнее. PHP может просто проверять, не была ли создана глобальная переменная до этого.» [Цитата]
36) «Использование методов не зависит от числа методов определенных в классе. Т.к. я добавил еще 10 методов в класс test (до и после теста метода), что никак не повлияло на производительность.» [Цитата]
37) «Методы в производных классах работают быстрее, чем методы в базовом. » [Цитата]
38) «Пустая функция вызванная с одним параметром занимает примерно такое же время, как выполнение 7-8 $localVar++ операций. Вызов такого же метода, конечно же, около 15 таких операций.» [Цитата]
39) «Не все должно быть по ООП, обычно, это лишь логика, каждый методот и объект вызывает большое потребление памяти.» [Цитата]
40) «Никогда не доверяйте данным от пользователя, выделяйте строки ковычками, которые используете в SQL запросах, употребляя mysql_real_escape_string, вместо mysql_escape_string или addslashes. Так же возьмите на заметку, что если magic_quotes_gpc включены, то вам следует вначале использовать stripslashes.» [Цитата]
41) «Избегайте функции mail() — уязвима для header injection.» [Цитата]
42) «Обнулите все переменные после подключения к БД (пароль как минимум) — они вам больше не нужны.» [Цитата]
43) «RTFM! PHP требует фантастического рукоприкладства (=) — прим. перев.), возможно даже лучшего, чем описанное здесь, что требует хорошего владения языком, которое включает работу с примерами и разговоры на английском. Пожалуйста, ПОЛЬЗУЙТЕСЬ ЭТИМ!» (+1 — прим. перев.) [Цитата]

translated.by/you/50-php-optimisation-tips-revisited/into-ru/trans/
Оригинал (английский): 50+ PHP optimisation tips revisited (http://www.hm2k.com/posts/50-php-optimisation-tips-revisited)
Перевод: © ha7y.
  • +12
  • ha7y
  • 14 июня 2009, 22:41

Комментарии (16)

Ой, а зачем было так корявить логотип php? А за статью спасибо!
Кстати про коверканье логотипа, зайдите на любую PHP страницу с одной GET переменной — блаблабла.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
Нужно было оттянуться на php за все то страшное, что я о нем узнал =)))
  • avatar
  • SPU
  • 15 июня 2009, 01:19
  • #
  • 1
Было бы хорошо не просто переводить, а добавлять какие-то собственные комментарии, т.к. не все советы одинаково полезны.
Взять хоть самый первый:
Начиная с PHP5, время начала работы скрипта может быть найдено здесь:
$_SERVER[’REQUEST_TIME’]
пользуйтесь вместо time() или microtime()

1. Если быть точным, то не с PHP5, а с PHP 5.1.0.
2. На счет microtime() отжиг еще тот… переменная $_SERVER[’REQUEST_TIME’] хранит время в секундах, как она может заменить microtime()?
3. $_SERVER[’REQUEST_TIME’] ни фига не время запуска скрипта, а время прихода запроса на http-сервер. Сколько этот запрос мог провисеть в очереди на выполнение, никому, кроме time(), не известно. Единственное, что извиняет автора совета: поскольку время берется с точностью до секунды, при работе на слабо нагруженном сервере, погрешность будет минимальной. Т.е. полезность или вредность данного совета напрямую зависит от конкретной задачи.
Так уж получилось, что я не php программист. Но, как и любому, наверное, программисту, мне очень интересно как это все работает =) Хотя вряд ли я когда-нибудь буду делать сайты на php. Поэтому от меня не может последовать особых комментариев, хотя другие я, конечно же, вставлю.
Брр… За перевод спасибо, но читать — нереально. Зачем так много логотипов?
=)) Чтобы читать реальнее было! Многовато вышло…

Если что-то непонятно — спрашивайте, я как переводчик объясню значение, а другие, как матерые php-программисты не дадут соврать =)
Всё понятно, просто читать очень сложно. Уберите пожалуйста все логотипы PHP.

И что есть "[Цитата]"? Можно тоже убрать?
Ах, прошу прощения. В оригинале есть вставки "[Citation]", но однако на них стоят ссылки, которых в Вашем переводе нету.
упс, кажется, придется лазить в оригинал за ссылками
упс, логотипы перенес вправо, без них не нравится мне — уж извините
Теперь читать стало удобнее, спасибо.

Используйте isset вместо strlen везде, где это возможн


Возможно так и быстрее, но в раза два не читабельнее.

Не все должно быть по ООП

Это простите как? Может правильнее «Не все должно быть на ООП»?

ПОЛЬЗУТЕСЬ

Пропущена буква «й» =)
А так удобне?
>Не все должно быть по ООП
Имелось в виду:
Не все должно быть по парадигме Объектно-ориентированного программирования
А не:
Не все должно быть на Объектно-ориентированном программировании
пкомпилируются

Лишняя буква «п».

А вообще — скоро сам сяду да составлю из всех этих советов более внятные и с мини-объяснениями. А-то тут можно ужас в раза 1,5.
«И наконец-то не будете отвлекать меня от дел поважнее?» (с) один альтруист
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.