36 советов. Как писать быстрые PHP скрипты (Рейтинг: +20)

Печать RSS
Странно, что в русскоязычном интернете так мало внимания уделяется оптимизации быстродействия пхп-скриптов… Может быть, те кому важно быстродействие, вообще не пишут на пхп? Шутка Пожалуй, буду исправлять ситуацию… и начну с публикации этой небольшой подборки советов. Перечисленные в ней факты следует знать каждому пхп-программисту, который собирается писать скрипты хоть немного сложнее чем форма обратной связи на сайте smile

По возможности объявляйте методы как статические. Они вызываются в 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%

Фух, хватит на сегодня smile
Добавил:
Рейтинг: +20
Просмотры: 3887
Комментарии (15) »