PHPУскоряем PHP скрипты

Перевод статьи «Speeding up your PHP scripts»

Я программирую на PHP с 13-ти лет, за многие годы я видел множество различных стилей программирования и использования стандартов. Однако, большинство из них не было оптимизированно.

Сейчас я хотел бы рассказать о различных путях увеличения скорости Ваших скриптов с помощью оптимизации направленной на снижение нагрузки на сервер.

Ковычки
Старайтесь использовать одинарные ковычки везде, где возможно. С ними скрипт будет обрабатываться быстрее, чем с двойными, т.к. PHP ищет переменные в тексте заключенном в двойные ковычки.
Использование одинарных ковычек в массивах также рекомендуется, т.к. это быстрее будет быстре работы без ковычек или с двойными.

Echo vs print
Echo быстрее, чем print. Если Вы используете конкатенацию в вызовах echo, то у Вас есть возможность еще больше оптимизировать Ваши скрипты использованием множества параметров вместо сложения строк. Функция print не способна принять несколько параметров — даже не пытайтесь (прим. перев. — =)).
$resource = 'OLO';
echo 'the user of ', $resource, ' has been selected for a special event.';
//slower and more widely used
echo 'The user of ' . $resource . ' has been selected for a special event.'; event.';

О циклах
Определяйте значения пределов для счетчиков перед циклом, иначе они будут пересчитываться при каждой итерации.
$array = array('Open-', 'Life', '.org');
$count = count($array);
//slow : for($i=0; $i < count($array); $i++)
for($i=0; $i < $count; $i++)
{
	echo array[$i];
}

Простые условия
Вместо множества блоков if-else, лучше использовать оператор switch, когда это возможно.

Includes и requires
Существует насколько способов улучшить за счет этого скорость. И прежде всего, бросьте использование require_once — оно гораздо медлительнее include_once. Попробуйте использовать полные пути к файлам в функциях include require — это сбережет серверу время на вычисление пути.

Управление строками
Попробуйте как можно чаще использовать str_ функции вместо preg_.
Str_replace куда быстрее, чем preg_replace, если Вам не нужны регулярные выражения. С другой стороны, strstr быстрее, чем str_replace.
Постарайтесь использовать их вместо preg_ функций: strpos, strpbrk, strncasecmp.
Если Вам нужно сравнить длину строки с каким-то определенным числом, то лучше использовать трюк с isset вместо употребления strlen.
$str = "have a nice day";
//slow
if(strlen($str) < 7)
//fast
if(isset($str{7}))

Потому, что isset — языковая конструкция, в отличии от более высокоуровневой strlen.

Конечно, существуют инструменты, которые помогут Вам:
www.nusphere.com/products/php_profiler.htm
www.adepteo.net/profiler/
www.xdebug.org/docs/profiler
Они расскажут, сколько уходит на парсинг Вашего скрипта и какие части требуют времени больше остальных. Это упрощает поиск узких мест в коде.
  • +10
  • ha7y
  • 13 июня 2009, 23:53

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

  • avatar
  • SPU
  • 14 июня 2009, 01:16
  • #
  • 5
ИМХО, какая-то бессмысленная статья. Для полного новичка, никогда не заглядывавшего в справку и на оф. сайт, может и интересно. А для тех, кто понимает, как работает php, все эти вещи совершенно очевидны.
Кстати, подобные вопросы часто задают на собеседованиях, чтобы быстро избавиться от неадекватных претендентов на вакансии php-программистов и т.п.
P.S. Самый лучший путь оптимизации — использовать инструменты по назначению с пониманием того, как они работают, а не чтение советов.
Согласен.
Особенно про циклы и ветвления прикольно — еще в школе проходили =)
(но сокращать статью не хотелось)
Подобные заметки действительно хорошо помогают при освоении особенностей изучаемого языка программирования.
Со мной был интересный случай, после того, как я прочел пару-тройку подобных статей, но для С++ (я — ява-программист, но знаком с широким кругом разнообразных языков). Я пришел сдавать задачи, а преподаватель удивленно спросил, скомпилируется ли Это =) А когда я объяснил ему все те «трюки» что были употреблены (направленные на производительность программы и наглядность кода), он намекнул мне о трудоустройстве в фирму, где работал сам =)))
Во-первых, согласен с SPU;
Во-вторых, от себя скажу, что сие — бойан: на хабре уже была пара статей, где написано всё тоже самое + ещё некоторые моменты.

И да, мне сейчас 14 и я уже всё это знаю.
Не представляю PHP программисты, который не знает этих основ :-)
Во-первых, искренее за Вас рад.
По-вторых, байан бойану — рознь.

Сейчас же подпишу в заголовке, что перевод посвящается матерым php-программистам.
>на хабре уже была пара статей
Кстати, Вы не могли бы дать ссылки на эти статьи — и мне интересно, и новички, что наткнутся на эту рады будут =)
  • avatar
  • fog
  • 14 июня 2009, 08:57
  • #
  • 5
SPU, NoIndex ну что вы накинулись на человека, это же просто перевод.
+1, хотел тоже самое написать, когда увидел оценку ниже чем раньше.
Я просто высказался по поводу подобных статей. Понятно, что тот, кто переводил, тут совершенно не при чем. Соответственно, я статью не минусовал.
Извиняюсь, я не знал что эта статья — перевод :)
По моему статья ничего. Только начинаю учить и мануал на оф. сайте не читал еще =). Так что спасибо, ha7y, за полезные советы.
Если есть интересные статьи, которые:
— можно (и нужно) перевести с английского на русский =))
— соответствуют тематике Open-Life.org
— желательно, не слишком объемные, я не бэтмен — 10 минут для меня мало =)

То буду рад рассмотреть ваши предложения. Особому вниманию уделяются хорошие статьи по программированию (лично для меня: java, linux, javascript, sql и т.д., но есть и другие люди, которых пивом не угощай — дай что-нибудь перевести =)).
Статьи не соответствующие предложенным требованиям можно обсудить в личке ;-)
=)
www.hm2k.com/posts/50-php-optimisation-tips-revisited — если не трудно, переведи все советы, начинаю с 11 (просто 10 уже переведены).
done =)
Народ, глупо как-то минусовать мой пост только за то, что я не увидел, что статья — перевод, уж простите.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.