Reply to this topicStart new topicStart Poll

оптимизация php скриптов

Max
Отправлено: Oct 14 2008, 10:48 AM
Quote Post


  Команда ЭйсВэб
*

Группа: Admin
Сообщений: 989
Пользователь №: 44
Регистрация:
13-September 06



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

Используйте одинарные кавычки вместо двойных

Дело в том, что текст, заключенный в двойные кавычки сканируется процессором на наличие в нем переменных, а также мнемонических подстановок (например, \n для вставки в текст символа новой строки).
print("Это совершенно обычный текст, но PHP-процессор сканирует его на наличие переменных и мнемонических подстановок перед тем, как вывести. При достаточной длине такой строки, этот процесс занимает значительное время.");

Если же текст заключен в одинарные кавычки, то PHP-интерпретатор послушно выводит его в первозданном виде, даже не думая искать в нем что-то. Это отнимает намного меньшее время, чем в предыдущем примере.
print('PHP-процессор сильно обрадуется, увидев строку, заключенную в одинарные кавычки. А как тут не обрадоваться — ведь не нужно делать бесполезную работу!');Естественно, строки такого вида можно использовать не только в функциях, но и в переменных.$string='Какое счастье не парсить лишний раз эту строку!';

Не заключайте переменные в кавычки

Очень часто приходиться видеть подобную картину.

CODE
print("PHP-процессору пришлось обрабатывать эту страницу $time секунд.");


Усвоя мой предыдущий совет, и зная, что PHP-интерпретатору намного легче "склеивать" строки, чем сканировать их на наличие переменных и заменять их на соответствующие этим переменным строки, нетрудно догадаться, что мой предыдущий пример — пример неэффективного использования ресурсов сервера. А теперь порадуем сервер оптимизированным скриптом.

CODE
print('PHP-процессор, радуясь жизни, обработал этот скрипт за '.$time.' секунд.');


Для тех, кто в танке: склейка строк производится с помощью точки (.), то есть

CODE
print('Адрес этого сайта — http://'.$_SERVER['HTTP_HOST'].'/!');


выведет текст «Адрес этого сайта — _http://argon.com.ru/!»

Используйте минимум переменных

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

CODE
$content='Здесь, например, может быть текст статьи, килобайт эдак на 8… Хороши хоть в одинарные кавычки заключить догадались';
print($content);


Спрашивается, а нахрена занимать лишнюю память, попусту нагружая сервер?.. Намного эффективней сделать так.

CODE
print('PHP-процессору доставляет одно удовольствие выводить такие строки.');


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

Если в скрипте используются переменные с неоправданно длинными именами, нагрузка на сервер, естественно возрастает.

CODE
$windows_xp_edition='Professional';
$windows_xp_build='2600';
$windows_server2003_edition='Standard';
$windows_server2003_build='3200';


Но и слишком лаконичные имена давать тоже не стоит — в будущем при правке скрипта внушительных размеров сто раз вспомнишь мать его создателя, причем не ласковым словом smile.gif

CODE
$ifa='Professional';
$ifb='2600';
$ifc='Standard';
Sifd='3200';


Оптимальный же вариант — давать лаконичные, но понятные имена, не превышающие восьми символов.

CODE
$wxped='Professional';
$wxpbld='2600';
$ws2k3ed='Standard';
Sws2k3bld='3200';


Используйте вложенные функции

Очень часто приходиться видеть такое дело.

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


Такой код, конечно, очень легко читать и править… Но может быть пожертвовать читаемостью воимя заметного прироста производительности?

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


Согласен, выглядит это ужасающе, зато наблюдается ощутимый прирост производительности! Сделать такую штуку очень просто, если начинать с конца, подставляя каждый раз вместо переменной соответствующее ей значение…
Используйте встроенные функции

Приведу простой пример скрипта, заменяющего все специальные символы HTML на соответствующие им мнемонические подстановки.

CODE
$string=str_replace('&','&',$string);
$string=str_replace('"','"',$string);
$string=str_replace('<','&lt;',$string);
$string=str_replace('>'','&gt;',$string);
print($string);


Этого же самого можно добиться, если использовать такой код.
print(htmlspecialchars($string));

И выглядит поприятнее, и весит меньше и заметно снижает нагрузку на сервер, особенно при обработке длинных строк.

Еще один пример. С помощью этого скрипта можно прочитать содержимое какого-нибудь текстового файла в массив.

CODE
$fp=fopen('database.txt','r');
while($array[]=fgets($fp,1024));
fclose($fp);


Но PHP имеет жутко полезную встроенную функцию file(), которая выполняет абсолютно то же самое, но намного быстрее!

CODE
file('database.txt');


Вывод: никогда не ленитесь лишний раз заглянуть в справочник функций PHP. Уверен, что вы там найдете множество средств, облегчающих вашу (и сервера) жизнь.
Используйте собственные функции

Часто необходимо обработать несколько строк по совершенно одинаковому алгоритму. Вот, что делают неопытные программисты…

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


А опытные пойдут более простым путем.

CODE
function format(&$string){
print(substr(chop(stripslashes(trim(str_replace("\r",' ',str_replace("\n",' ',$string))))),0,1024));
}
print(format($string1));
print(format($string2));


Таким образом можно выполнять одно и тоже действие несколько раз, минимально нагружая сервер.
Не создавайте лишних функций

К примеру, если довольно опытный программист забудет или вообще не будет знать о существовании встроенной нужной ему функции, он с легкостью способен написать такую сам.

CODE
function optimize(&$string){
$string=str_replace('&','&amp;',$string);
$string=str_replace('"','&quot;',$string);
$string=str_replace('<;','&lt;',$string);
$string=str_replace('>'','&gt;',$string);
}
print(optimize($string));


А ведь можно обойтись более простыми средствами.

CODE
print(htmlspecialchars($string);


Не используйте лишние функции

Вот пример неэффективного кода.

CODE
print('Мой дядя ');
print('самых честных грабил…');


Но его можно очень просто оптимизировать.

CODE
print('Мой дядя '.'самых честных правил…');


Чувствуете разницу? Поверьте, хостер в этом случае вам будет только благодарен за освободившиеся ресурсы сервера…
Рационально используйте функции

Например, такой скрипт.

QUOTE
print(ereg_replace('нормальный','несчастный',$string));


Включает алгоритм обработки регулярных выражений (POSIX), там, где это совсем не требуется. А сервер нагружается намного сильнее. А ведь можно облегчить его участь, заменив прожорливую функцию на менее жадную к ресурсам.

CODE
print(str_replace('несчастный','счастливый',$string));


Не дергайте лишний раз обработчик

Известно, что все, содержащееся вне тега PHP-кода, PHP-процессор не обрабатывает, а просто передает в неизменном виде. Некоторые пользуются этим вот так.
…шапка страницы…

CODE
<?php
print($заголовок);
?>
навигация
<?php
include('динамический контент');
?>
подвал страницы


Но ввод в режим обработки PHP и вывод из него нагружают сервер более, чем если бы использовалось вот это.

CODE
<?php
print('…шапка страницы…'.$заголовок.'…навигация…');
include('динамический контент');
print('…подвал страницы…');
?>


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

Взято отсюда http://argon.com.ru


--------------------
IXBB.RU - бесплатный хостинг форумов
Альтернативный бесплатный софт! - аналог офиса, корела, ftp клиент
Сапа бот ищет тебя!

user posted image
PMEmail Poster
Top
Wanted
Отправлено: Dec 30 2008, 01:35 PM
Quote Post


  Генерал
*

Группа: Members
Сообщений: 245
Пользователь №: 1942
Регистрация:
15-October 08



Хорошая статься - http://webfy.ru/article/91.html


--------------------
98% ошибок системы находятся в полуметре от монитора....
PMEmail PosterUsers WebsiteICQ
Top
dudeonthehorse
Отправлено: Dec 21 2010, 06:18 PM
Quote Post


  Команда ЭйсВэб
*

Группа: Super moderator
Сообщений: 763
Пользователь №: 2933
Регистрация:
26-October 09



QUOTE
Используйте одинарные кавычки вместо двойных
на сколько это снижает нагрузку по факту? я сужу с колокольни разработчиков того же битрикса. просматривая исходники продукта, вижу сплошь и рядом лишь двойные кавычки, а кода там дай бох! все же там не конченные дураки сидят, но оперируют только двойными кавычками. битрикс - система достаточно высоконагружаемая и аспект производительности их волнует.
QUOTE
Не дергайте лишний раз обработчик
тот же вопрос. почему не дергать? и так ли это насчет открытия/закрытия обработчика? Вся система шаблонизатора в битриксе завязана на синтаксисе с бесконечными открытиями/закрытиями php обработчика. ставить читаемость кода в ущерб производительности тоже как то нелепо, по крайней мере
PMEmail PosterICQ
Top

Topic Options Reply to this topicStart new topicStart Poll

 



[ Script Execution time: 0.0384 ]   [ 10 queries used ]   [ GZIP выключен ]