Зачем нужна оптимизация? Для возможности написать в "readme.txt", что скипт оптимизирован. Или если он создает большую нагрузку (например, когда ресурс популярный). И все. Если приведенные условия никакого значения не играют, оптимизацию можно не проводить.
Содержание разбито на пункты, чтобы было легче ориентироваться в тексте. Некоторые пункты недоказаны из-за их очевидности.
1. Использование одинарных кавычек повышает скорость парсинга PHP-кода, так как в коде, заключенном в двойные кавычки, могут находится переменные и мнемонические подстановки. То есть код
print ('Это сторока о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-чень длинная'); О том, какую функцию лучше использовать для вывода текста, будет сказано чуть ниже.
2. При использовании двойных кавычек для вывода строк избегать вложенных в них переменных. Например, код
print ("Время $time минут.");
будет интерпретирован за более длительное время (порядка 1.2 - 1.4 длительнее), чем код
print ('Время '.$time.' минут.');
Потому что в первом случае необходимо сначала прочитать строку, потом извлечь из нее переменную, подставить ее значение. Во втором случае происходит склейка текста.
3. Многие любят повсюду вводить переменные. Рассмотрим пример вывода статьи, объемом 30 килобайт.
$string = 'Статья Рога и копыта
Автор: admin
Объем: 30 КБайт'; print($string);
Каждая переменная занимает некоторый объем памяти. Так что лучше здесь вразу вывести текст, а не заносить его в переменную.
print('Статья Рога и копыта
Автор: admin
Объем: 30 КБайт');
Конечно, если переменная используется более двух-трех раз, то лучше использовать первый вариант (такое очень редко встречается).
4. Размер переменных. Здесь все ясно. Переменная $winxppro выигрыват переменной $WindowsXPProfessional. Старайтесь не давать переменным имена больше семи символов.
5. Работа со строками на примере парсинга символов. Очень часто (в гостевой книге, например) встречается такой код
Работает это заметно быстрее, хоть и выглядит с непривычки ужасающе. Называется «вложенные функции»
6. Собственные функции взамен встроенных - лишняя работа. Допустим, веб-мастер из предыдущего примера решил закрыть XSS уязвимость в своей гостевой книге и написал следующий код, заменяющий потенциально опасные символы их аналогами.
Того же самого можно добится, используя встроенную функцию htmlspecialchars()
print(htmlspecialchars($msg));
Скорость выполнения скрипта заметно увеличится. Чем больше обрабатываемый текст, тем больше выигрыш от применения второй функции. Еще один повсеместно используемый шаблон: чтение файла.
function format(&$msg){ print(substr(chop(stripslashes(trim(str_replace("\r",' ',str_replace("\n",' ',$msg))))),0,1024)); } print(format($msg1)); print(format($msg2));
8. «Лишние» функции. Зачем так сделано, неизвестно. Возможно, просто веб-мастер забыл поправить.
print('А я мысли свои '); print('как окурки тушу...');
Лучше вызывать функцию один раз.
print('А я мысли свои '.'как окурки тушу...');
9. Регулярные выражения и замена строк. Второе выполняется гораздо быстрее. Пример неправильного применения парсинга строк
print(ereg_replace('я дурак','ты дурак',$msg));
Здесь достаточно просто заменять строку.
print(str_replace('я дурак','ты дурак',$msg));
Функция eregi
eregi("МаС+иВ",$text);
или, например,
eregi("(ма[a-zа-я]{1,20})",$text);
работает в два раза медленнее preg_match
preg_match("/МаС+иВ/im",$text);
или, например,
preg_match("/(ма[a-zа-я]{1,20})/im",$text);
Примеров можно привести много. А при поиске последовательности, которой в тексте нет, eregi выполняется быстрее preg_match. Также eregi выгдна тем, что у нее есть кэш. Если производить парсинг небольшого (несколько сотен килобайт) файла две сотни раз подряд, то затраченное время будет в тысячи раз меньше, чем это делалось бы с функцией preg_match.
10. Не переусердствуйте оптимизазацией вывода на «экран». Известно, что содержимое вне тегов PHP-кода, PHP-процессор не обрабатывает и передает в неизменном виде. Если таких переходов много при маленьком их размере, скорость выполнения уменьшается. Здесь надо экспериментировать. Единого решения нет.
11. Для организации цикла for, например, для чтения строк в файле, используют встроенную функцию sizeof() вместо count(), так как ее выполнение происходит быстрее, хотя в некоторых справочниках написано, что они являются алиасами.
12. Польза функции include(). Представим, что у нас есть код, в котором разные его части выполняются или вообще не выполняются - в зависимости от переданных значений. А каждая такая часть занимает строк двести. В этом случае полезно использовать функцию include() и загружать части файла по мере их надобности, поскольку язык PHP - интерпретируемый, то есть каждый раз происходит разбор кода, это заметно снизит время выполнения скрипта.
13. Глобальные переменные в функциях снижают скорость выполнения скрипта. Следующий код будет работать медленне, чем следующий за ним.
function f1(){ global $z; return $z*$z; }
А этот код работает в два раза быстрее
function f1($x){ return $x*$x; }
14. Ускорения загрузки страниц можно добиться, используя встроенную функцию gzip-сжатия. Для этого в самом начале скрипта пишем
@ob_start("ob_gzhandler");
А в его конце -
@ob_end_flush();
15. «Лишние» пробелы, также снижают скорость выполнения скипта. Здесь все ясно: сначала PHP-процесоор читает скрипт, потом интерпретирует. Пробелы читаются тоже.
16. При переборе неассоциативных массивов лучше использовать циклы for или while - они практически неотличимы; ассоциативных - foreach.
17. Если необходимо сверить длину строки с заданной, обычно пользуются функцией strlen().
if (strlen($msg) < 5) { echo "Msg is too short"; }
Можно увеличить скорость выполнения, используя isset().
if (!isset($msg {5})) { echo "Msg is too short"; }
Вызов isset() происходит быстрее, чем strlen() т.к. isset() - это не функция, а языковой конструкт, и его выполнение не требует выполнения поиска в таблице и перевода в нижний регистр. Это значит, что виртуально нет прыжка "наверх", в "шапку" кода, где определена длина строки.
18. Вывод текста. Обычно используют print() или echo(). Последнее выполняется быстрей, так как print() возвращает статус состояния произведенной операции. Использовать printf() вообще не рекомендуется, так как для создания форматирования printf() распознает указанную строку с форматирующим кодом, который заменяет на содержимое переменной. Можете себе представить, насколько это медленно. heredoc чуть быстрее prinf() и имеет расширенную функциональность. Если вам необходимо вывести большой или не очень большой кусок статичного текста, самым быстрым и легким способом будет оставить его за кодом PHP.