FoxWeb

софт для студентов
Искать здесь

Оптимизация кода PHP

Раздел: PHP, MySQL, веб-программирование Автор: VIKT0R
E-mail: спаму - нет! Www: http://infobez.net.ru/
Просмотров: 2864 Дата: 13.12.2005
Зачем нужна оптимизация? Для возможности написать в "readme.txt", что скипт оптимизирован. Или если он создает большую нагрузку (например, когда ресурс популярный). И все. Если приведенные условия никакого значения не играют, оптимизацию можно не проводить.

Содержание разбито на пункты, чтобы было легче ориентироваться в тексте. Некоторые пункты недоказаны из-за их очевидности.

1. Использование одинарных кавычек повышает скорость парсинга PHP-кода, так как в коде, заключенном в двойные кавычки, могут находится переменные и мнемонические подстановки. То есть код

print ("Это сторока о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-чень длинная");

Выполнится гораздо медленне, чем следующий:

print ('Это сторока о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-чень длинная'); О том, какую функцию лучше использовать для вывода текста, будет сказано чуть ниже.

2. При использовании двойных кавычек для вывода строк избегать вложенных в них переменных. Например, код

print ("Время $time минут.");

будет интерпретирован за более длительное время (порядка 1.2 – 1.4 длительнее), чем код

print ('Время '.$time.' минут.');

Потому что в первом случае необходимо сначала прочитать строку, потом извлечь из нее переменную, подставить ее значение. Во втором случае происходит склейка текста.

3. Многие любят повсюду вводить переменные. Рассмотрим пример вывода статьи, объемом 30 килобайт.

$string = 'Статья Рога и копыта

Автор: admin

Объем: 30 КБайт';
print($string);


Каждая переменная занимает некоторый объем памяти. Так что лучше здесь вразу вывести текст, а не заносить его в переменную.

print('Статья Рога и копыта<br><br>Автор: admin<br><br>Объем: 30 КБайт');

Конечно, если переменная используется более двух-трех раз, то лучше использовать первый вариант (такое очень редко встречается).

4. Размер переменных. Здесь все ясно. Переменная $winxppro выигрыват переменной $WindowsXPProfessional. Старайтесь не давать переменным имена больше семи символов.

5. Работа со строками на примере парсинга символов. Очень часто (в гостевой книге, например) встречается такой код

$msg=str_replace("\n",' ',$msg);
$msg=str_replace("\r",' ',$msg);
$msg=trim($msg);
$msg=stripslashes($msg);
$msg=chop($msg);
$msg=substr($msg,0,1024);
print($msg);

Это хорошо, что данные хоть как-то фильтруются, однако лучше писать так.

print(substr(chop(stripslashes(trim(str_replace("\r",' ',str_replace("\n",' ',$msg))))),0,1024));

Работает это заметно быстрее, хоть и выглядит с непривычки ужасающе. Называется «вложенные функции»

6. Собственные функции взамен встроенных – лишняя работа. Допустим, веб-мастер из предыдущего примера решил закрыть XSS уязвимость в своей гостевой книге и написал следующий код, заменяющий потенциально опасные символы их аналогами.

$msg=str_replace('&','&amp;',$msg);
$msg=str_replace('"','&quot;',$msg);
$msg=str_replace('<','&lt;',$msg);
$msg=str_replace('>'','&gt;',$msg);
print($msg);

Того же самого можно добится, используя встроенную функцию htmlspecialchars()

print(htmlspecialchars($msg));

Скорость выполнения скрипта заметно увеличится. Чем больше обрабатываемый текст, тем больше выигрыш от применения второй функции.
Еще один повсеместно используемый шаблон: чтение файла.

$fp=fopen('db.dat','r');
while($array[]=fgets($fp,1024));
fclose($fp);

То же самое будет при использовании функции file()

file('db.dat');

7. Если есть повтор одного и того же действия, лучше написать свою функцию.
Вместо простого метода copy-paste

print(substr(chop(stripslashes(trim(str_replace("\r",' ',str_replace("\n",' ',$msg1))))),0,1024));
print(substr(chop(stripslashes(trim(str_replace("\r",' ',str_replace("\n",' ',$msg2))))),0,1024));

Выгодней написать свою функцию, например, такую

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.

?>статичный текст<?

Комментарии

snoggl 12.11.2007 15:58:51 #
очень полезная инфа!
mil-ast 02.04.2008 16:26:22 #
есть неточности. Некоторые "советы" проверял даже на практике, результат получал противоположный.
www.pc.obzornik.ru
VHero 10.06.2008 12:46:51 #
Полезная информация, но я много из этого знаю, хотелось бы поглубже узнать!

Оставить комментарий

Ваше имя

Ваш комментарий

Код   Защитный код. Если вы не видите здесь рисунок - обновите страницу.
Оценка   

Заметки по этой теме