36 советов. Как писать быстрые PHP скрипты
В русскоязычном интернете так мало внимания уделяется оптимизации быстродействия пхп-скриптов… Может быть, те кому важно быстродействие, вообще не пишут на пхп? Шутка. Пожалуй, буду исправлять ситуацию… и начну с публикации этой небольшой подборки советов. Перечисленные в ней факты следует знать каждому пхп-программисту, который собирается писать скрипты хоть немного сложнее, чем форма обратной связи на сайте.
- По возможности объявляйте методы как статические. Они вызываются в 4 раза быстрее.
- echo быстрее чем print
- Быстрее вызвать echo с несколькими аргументами — строковыми переменными — чем сначала склеивать их в одну.
- Устанавливайте максимальное значение для счетчика цикла for вне цикла.
- Выполняйте unset для ненужных больше переменных. Особенно это касается больших массивов.
- Избегайте “магических” методов (__get, __set и пр.)
- В вызовах include и require лучше использовать полный путь к скрипту.
- Если вы хотите измерить время работы скрипта, то лучше использовать $_SERVER[’REQUEST_TIME’] чем time()
- Заменяйте regex() на strncasecmp, strpbrk и stripos.
- Если функция принимает аргументы как в виде массива, так и отдельные переменные, то быстрее будет вызывать ее несколько раз, чем передавать сразу все значения в виде массива.
- switch() работает быстрее чем конструкции вида if(…) {…} elseif (…) {…} elseif (…) …
- Подключите модуль апача — mod_deflate.
- Закрывайте неиспользуемые соединения с базой данных.
- Ошибки, которые возникают при работе скрипта, тоже замедляют работу. Старайтесь их избегать.
- Не используйте функции при определении цикла. Пример:
for ($i=0; $i < count($longlongarray); $i) …
Функция count() будет вызываться при каждой итерации массива.
- Инкремент (i++) для локальной переменной выполнится в два раза быстрее чем для глобальной.
- Инкремент для свойства объекта ($this->property++) выполняется в три раза медленнее чем для простой локальной переменной.
- Инкремент для неинициализированной переменной будет выполняться в 9-10 раз дольше чем для инициализированной.
- Одно только объявление глобальной переменной, которая в дальнейшем не используется, также замедляет работу (отнимает приблизительно столько же времени сколько и инкремент локальной переменной.
- Методы из классов-потомков вызываются быстрее чем из классов-предков. (Мораль — не создавайте без нужды громоздкую иерархию классов.)
- Вызов одной функции с передачей одного аргумента (тело функции пустое) занимает столько же времени сколько и 7-8 инкрементов для локальной переменной. Вызов такого же метода отнимет время равное 15 инкрементам.
- Если в строке не используются имена переменных, то лучше использовать одинарные кавычки, чем двойные (не тратится время на поиск переменных в строке).
- При выводе нескольких строк при помощи echo лучше перечислить их через запятую чем использовать конкатенацию.
- Веб-серверу Apache потребуется как минимум в два раза больше времени чтобы отдать по запросу скрипт php, чем статичную страницу html.
- PHP скрипты заново компилируются при каждом обращении к ним. Установите какое-нибудь кеширующее расширение на сервер (например, eAccelerator) — обычно это увеличивает производительность в 1-10 раз.
- Включайте кеширование везде где это возможно. Используйте такие программы как memcached — высокопроизводительная система кеширования, предназначенная для увеличения производительности динамических веб-приложений, которое достигается за счет снижения нагрузки на базу данных.
- Если нужно определить длину строки — используйте strlen(). Эта функция работает очень быстро потому что на самом деле она не выполняет подсчет символов. Она берет уже готовый результат из структуры zval (внутрення C-структура, которая используется для хранения переменных в PHP).
- Не используйте функции там, где можно использовать встроенные конструкции языка PHP. Например, вместо
if (strlen($password) < 8 ) { echo ‘Your password is too short.’; }можно написать:
if (!isset($password{8})) { echo ‘Your password is too short.’;} - Постинкремент ($i++) намного медленнее чем преинкремент (++$i). Это связано с особенностями реализации языка PHP. Постинкремент создает одну временную переменную, в то время как постинкремент изменяет саму переменную непосредственно. Примечание: известно, что использование Zend Optimizer устраняет этот недостаток. Но, поскольку Зенд Оптимайзер установлен не на всех хостингах, лучше учесть этот момент во время создания скрипта…
- Не стоит использовать ООП там где без него можно обойтись. Создание объектов и обращение к их методам создают дополнительную нагрузку.
- Не стоит создавать классы в качестве контейнеров для данных. Массивы прекрасно справляются с этой задачей.
- Не создавайте слишком много методов (хотя само по себе количество методов не отражается на времени обращения к каждому отдельному методу — быстрее будет работать тот скрипт, который использует меньшее количество вызовов.
- По возможности используйте те функции, которые уже есть в языке PHP.
- Если в вашем коде есть функции, которые сильно нагружают систему, подумайте — может есть смысл переписать их на C и подключить как расширение?
- Используйте профайлер во время отладки кода. Он покажет вам самые узкие места в вашей программе.
- Установите mod_gzip. Этот модуль Апача сжимает данные на лету и может уменьшить объем передаваемых данных на 80%
Оригинальную статью извлёк через http://web.archive.org
Первоисточник уже потерян.
Ещё по теме:
- 10 PHP Micro Optimization Tips
- PHP: Micro vs. Macro optimization, or «Get the low hanging fruit first»
- 50+ PHP optimisation tips revisited
- A HOWTO on Optimizing PHP
- 40+ Useful Php tips for beginners — Part 1, Part 2, Part 3
- Немного об оптимизации и безопасности: 10 Advanced PHP Tips Revisited