Посторим вместе

Посторим вместе

Found a mistake ?

Обнаружили ошибку на сайте ? Выделите фрагмент текста и нажмите на Shift + Enter.

Last files

Date iconOct.28

Система управления веб сайтом CompactCMS.Бесплатная система.RequirementsTo be able to run Compact...

Date iconAug.22

Features Here are some of the main features of HemingwayEx: Widgetized: This theme can be used wi...

Всего пользователей

1487 registered
0 today
0 this week
0 this month
Last: Васпел




Locations of visitors to this page
Main arrow Articles arrow PHP arrow Оптимизация кода PHP
Оптимизация кода PHP Print E-mail
User Rating: / 0
PoorBest 
Written by Master   
Monday, 22 September 2008
Зачем нужна оптимизация? Для возможности написать в "readme.txt", что скипт оптимизирован. Или если он создает большую нагрузку (например, когда ресурс популярный). И все. Если приведенные условия никакого значения не играют, оптимизацию можно не проводить.

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

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

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

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

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

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

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

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

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

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

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

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

Автор: admin

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

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

print('Статья Рога и копыта

Автор: admin

Объем: 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('&','&',$msg);
$msg=str_replace('"','"',$msg);
$msg=str_replace('<','<',$msg);
$msg=str_replace('>'','>',$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.

php


Views: 665

  Comments (1)
 1 Written by This e-mail address is being protected from spam bots, you need JavaScript enabled to view it , on 17:00 06.11.2008
Этапять, зачот!

Write Comment
Name:
E-mail
Comment:



Code:* Code

 
< Prev   Next >