36 советов. Как писать быстрые PHP скрипты

Печать RSS
327

Автор
Граф Озриор
0
Странно, что в русскоязычном интернете так мало внимания уделяется оптимизации быстродействия пхп-скриптов… Может быть, те кому важно быстродействие, вообще не пишут на пхп? Шутка Пожалуй, буду исправлять ситуацию… и начну с публикации этой небольшой подборки советов. Перечисленные в ней факты следует знать каждому пхп-программисту, который собирается писать скрипты хоть немного сложнее чем форма обратной связи на сайте
Автор
Граф Озриор
0
По возможности объявляйте методы как статические. Они вызываются в 4 раза быстрее.
echo быстрее чем print
Быстрее вызвать echo с несколькими аргументами – строковыми переменными – чем сначала склеивать их в одну.
Устанавливайте максимальное значение для счетчика цикла for вне цикла.
Выполняйте unset для ненужных больше переменных. Особенно это касается больших массивов.
Автор
Граф Озриор
0
Избегайте “магических” методов (__get, __set и пр.)
В вызовах include и require лучше использовать полный путь к скрипту.
Если вы хотите измерить время работы скрипта, то лучше использовать $_SERVER[’REQUEST_TIME’] чем time()
Заменяйте regex() на strncasecmp, strpbrk и stripos.
Если функция принимает аргументы как в виде массива, так и отдельные переменные, то быстрее будет вызывать ее несколько раз, чем передавать сразу все значения в виде массива.
Автор
Граф Озриор
0
switch() работает быстрее чем конструкции вида
if(...) {...} elseif (...) {...} elseif (...) ... 
Подключите модуль апача – mod_deflate.
Закрывайте неиспользуемые соединения с базой данных.
Ошибки, которые возникают при работе скрипта, тоже замедляют работу. Старайтесь их избегать
Не используйте функции при определении цикла. Пример:
for ($i=0; $i < count($longlongarray); $i)
Функция count() будет вызываться при каждой итерации массива.
Автор
Граф Озриор
0
Инкремент (i++) для локальной переменной выполнится в два раза быстрее чем для глобальной.
Инкремент для свойства объекта ($this->property++) выполняется в три раза медленнее чем для простой локальной переменной.
Инкремент для неинициализированной переменной будет выполняться в 9-10 раз дольше чем для инициализированной.
Одно только объявление глобальной переменной, которая в дальнейшем не используется, также замедляет работу (отнимает приблизительно столько же времени сколько и инкремент локальной переменной.
Методы из классов-потомков вызываются быстрее чем из классов-предков. (Мораль – не создавайте без нужды громоздкую иерархию классов.)
Вызов одной функции с передачей одного аргумента (тело функции пустое) занимает столько же времени сколько и 7-8 инкрементов для локальной переменной. Вызов такого же метода отнимет время равное 15 инкрементам.
Автор
Граф Озриор
0
Если в строке не используются имена переменных, то лучше использовать одинарные кавычки, чем двойные (не тратится время на поиск переменных в строке).
При выводе нескольких строк при помощи echo лучше перечислить их через запятую чем использовать конкатенацию.
Веб-серверу Apache потребуется как минимум в два раза больше времени чтобы отдать по запросу скрипт php, чем статичную страницу html.
PHP скрипты заново компилируются при каждом обращении к ним. Установите какое-нибудь кеширующее расширение на сервер (например, eAccelerator) – обычно это увеличивает производительность в 1-10 раз.
Включайте кеширование везде где это возможно. Используйте такие программы как memcached – высокопроизводительная система кеширования, предназначенная для увеличения производительности динамических веб-приложений, которое достигается за счет снижения нагрузки на базу данных.
Если нужно определить длину строки – используйте strlen(). Эта функция работает очень быстро потому что на самом деле она не выполняет подсчет символов. Она берет уже готовый результат из структуры zval (внутрення C-структура, которая используется для хранения переменных в PHP).
Автор
Граф Озриор
0
Не используйте функции там, где можно использовать встроенные конструкции языка 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 устраняет этот недостаток. Но, поскольку Зенд Оптимайзер установлен не на всех хостингах, лучше учесть этот момент во время создания скрипта… smile
Автор
Граф Озриор
0
Не стоит использовать ООП там где без него можно обойтись. Создание объектов и обращение к их методам создают дополнительную нагрузку.
Не стоит создавать классы в качестве контейнеров для данных. Массивы прекрасно справляются с этой задачей.
Не создавайте слишком много методов (хотя само по себе количество методов не отражается на времени обращения к каждому отдельному методу – быстрее будет работать тот скрипт, который использует меньшее количество вызовов.
По возможности используйте те функции, которые уже есть в языке PHP.
Если в вашем коде есть функции, которые сильно нагружают систему, подумайте – может есть смысл переписать их на C и подключить как расширение?
Используйте профайлер во время отладки кода. Он покажет вам самые узкие места в вашей программе.
Установите mod_gzip. Этот модуль Апача сжимает данные на лету и может уменьшить объем передаваемых данных на 80%

Фух, хватит на сегодня klass
A

Оранжевые штаны
0
В статьи это лучше добавь, да и не согласен, что не уделяется внимание оптимизации... Кстати, вот за эту мысль
if (!isset($password{8})) {
echo 'Your password is too short.';
}
спасибо, хорошая идея, не приходило в голову что можно длину не измерять, но кстати тут оговорочка, для текста, где используется например utf-8 и длина измеряется mb_strlen например, такое проблемно сделать, так что наверно это отпадает.
И кстати, mod_gzip не определяет поддерживает ли браузер сжатие, так что лучше это с помощбю ob_gzhandler делать
Изменил: Azzido (12.07.2010 / 21:45)
Автор
Граф Озриор
0
хех, вроди все))))) krut
Изменил: XoPyC (12.07.2010 / 21:45)
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск