Ускоряем работу скриптов ч.3
Создано Евгений Злобин в мая 22, 2008Ускоряем работу скриптов ч.1
Ускоряем работу скриптов ч.2
Ну вот и третья часть. Перейдем сразу к делу.
8 ) Использование двойных и одинарных кавычек.
Что дают нам двойные кавычки? PHP сможет распознавать управляющие последовательности и переменные. В отличии от двойных кавычек, строка в одинарных распознается только как строка и переменные в ней будут являться лишь частью её. Т.е. на обработку строки, заключенную в двойные кавычки будет уходить несколько больше времени, чем на обработку с одинарными.
echo "hallo $name $fam";
echo 'hallo ' . $name . ' ' . $fam;
Что же использовать? Всё зависит от ситуации. Я всегда использую одинарные кавычки, а вот для SQL-запросов двойные, лично мне так удобнее.
9) Замена.
Если новичек добирается до регулярных выражений, то это чревато тем, что он будет везде использовать их, даже там, где можно обойтись. В частности str_replace работает быстрее, чем preg_replace, в свою очередь strtr ещё быстрее, чем str_replace.
// Замена переменных в шаблоне
$text = ereg_replace("<!--a-->", $a, $text);
$text = ereg_replace("<!--b-->", $b, $text);
$text = ereg_replace("<!--c-->", $c, $text);
$text = ereg_replace("<!--d-->", $d, $text);
// Это по меньшей мере ужасно, но встречается очень часто.
// Оптимизируем и получаем одну строку:
$text = str_replace(array('<!--a-->', '<!--b-->', '<!--c-->', '<!--d-->'),
array($a, $b, $c, $d), $text);
10) Функция в функции.
Покажу на примере и всё станет ясно. Предположим, нам нужно убрать пробелы у строки и вырезать первые 5 символов:
$str = trim($str);
$str = substr($str, 0, 5);
Давайте сожмем всё это дело:
$str = substr(trim($str), 0, 5);
Другой вопрос, что при этом ухудшается читаемость кода, причем это далеко не самый сложный пример. А при использовании сразу нескольких функций в функциях и более громоздком выражении мы получаем очень не удобоваримую строку кода. Поэтому тут нужно выбирать – либо максимальная оптимизация, либо читабельность кода.
11) Подключение файлов.
Для внедрения в код php сторонних файлов есть целых четыре конструкции: include, include_once, require, require_once.
include: инклудит файл во время исполнения сценария.
require: при запуске (НЕ при исполнении) происходит замена конструкции require. Причем, если этот файл уже был подключен, то новое подключение не произойдет.
Функции с _once проверяют был ли до этого уже подключен данный файл. На данный момент особой разницы в скорости нет, поэтому используйте их по назначению.
12) Интересные последствия.
Если и дальше пытаться упаковать как можно больше код, то можно встретиться с непонятными явлениями.
Учитывая, что в официальной документации по PHP в Главе 14 написано:
«Выражения – это краеугольный камень PHP. Почти все, что вы пишите в PHP, является выражением. Самое простое и точное определение выражения – `все что угодно, имеющее значение`. «
Следовательно я могу использовать конструкции типа && (логическое AND), || (логичекое OR) и пр.
Рассмотрим один примерчик:
$var = 0;
$sp = 0;
if ($var == 0) $sp = 3 AND $var = 2;
echo "sp = $sp <br />";
echo "var = $var";
Здесь мы вместо использования фигурных скобок при выполнении двух действий, объединили их оператором AND.
В итоге мы получаем:
sp = 3
var = 2
Ещё один непонятный прикол случается с тернарным оператором (кстати, это название он получил от того, что имеет сразу три операнда):
условие ? действие_1 : действие_2;
Если в «действии» я захочу использовать echo,
true ? echo 'не работает' : 0 ;
то у меня ничего не выйдет и вылезет ошибка:
Parse error: parse error, unexpected T_ECHO
Проблема кроется здесь в том, что
Поскольку echo – это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций
А print может вести себя как обыная функция. Поэтому приходится применять хак
будем вместо echo использовать print:
true ? print 'работает' : 0 ;
Соотвественно мы не сможем использваоть такую конструкцию true ? if () … или например, false ? for ($i = 0 …)
Несколько слов по поводу isset. Не многие знают, что можно одновременно проверять существование сразу нескольких переменных isset($a, $b).
На этом пока всё. Если придумаю ещё что-нибудь, то обязательно выйдет новая часть.
Может быть Вам это интересно?
- Ускоряем работу скриптов ч.1
- Ускоряем работу скриптов ч.2 (хаки на PHP)
- YouTube API & JavaScript Upload
- UTF и проблема с русскими буквами И, ш
- Утилита BCP для экспорта\импорта в MSSQL
© "Паутина фриланса".


Все довольно интересно. Это я о все серии статей в целом.
Тема очень актуальная, быстродействие – одно из важнейших требований для веб.
Хорошая серия. Продолжение будет?
Меня щас очень интересует оптимизация скриптов, а особенно мускул. Мемкэш тоже интересен, надо пробовать его. Ну и вообще, тема создания высоконагруженных сайтов.
Что можете посоветовать? Что еще почитать стоит?
ЗЫ создал вот я монстра, надо щас оптимизировать его – пока маленький был так шустро работал, а щас притормаживает. Изза этого пока не могу переключиться на создание новых сервисов.
TYUS, вообще есть даже специальные конференции по поводу «высоконагруженных систем» http://www.highload.ru/
В этом году она пройдет в Москве 6 и 7 октября. Места свободные судя по всему там ещё есть, т.ч. можете смотаться туда )
Там у них правда раскол произошел вроде, поэтому конференции две. О второй можно узнать тут http://www.highload.info
Евгений, конференции эт конечно хорошо, тока живу я в Новосибе, а до Москвы смотаться туда и обратно самолет стоит 20тыров плюс сама конференция не бесплатна.
Было б хорошо, если б они потом результаты и доклады и т.п. вещи на сайте выложили.
Вот если бы в НСК было, я б пошел.
Замечательная статья, на некоторые грабли сам наступал, до сего момента
Колонки Вашего сайта заезжают друг на друга. Очень тяжело читать.
Александр, можно скриншот?
Евгений Злобин, вот скрин http://savepic.info/v.php?id=b7945f2ddbf62edd1f1d9e09e3a319d9.jpg
Условия: моник 19-ка, 1024х768, IE 7. на широкоформатнике все кул.
А вот ТАК смотрится блог на монике 14 дюймов с разрешением экрана 1280х800
У меня тоже самое надобы исправить.
555, Sergey, спасибо! Обязательно что-нибудь придумаю, чтобы данной проблемы не было )
А сразу несколько переменных на пустоту проверить empty() можно в сжатой форме?
Я сам кодер, очень интерестно почитать, ненал что можно ускорять работу php. Спасибо!