Создать ответ 
Советы по ускорению выполнения PHP кода
Автор Сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #1
Советы по ускорению выполнения PHP кода
Для всех, кто использует на своем сайте язык PHP, могу дать несколько полезных советов, как повысить скорость выполнения PHP кода без особых усилий.

Перед тем как пытаться заняться кешированием и масштабированием стоит для начала попробовать оптимизировать имеющийся PHP код.

Стоит придерживаться следующих несложных правил:

• Старайтесь выносить переменные из строк, это примерно на 25-40% работает быстрее.
PHP код:
<?php $x="test=".$test?>

• Имена переменных выбирайте короче семи символов. Это увеличит скорость примерно на 15%.
• В массивах старайтесь не обращаться к элементам по имени и без использования кавычек. Особенно это касается многомерных массивов. Таким образом можно сэкономить до 40%.
• А если обращение к элементу массива вынести из строки (как указано в самом первом пункте), то можно дополнительно сэкономить ещё примерно 25-30%.
• Старайтесь использовать Perl-ориентированные регулярные выражения. Или хотя бы сравнивайте их с POSIX-аналогами по скорости выполнения. Скорость в таких случаях может отличаться до 200% при различных запросах.
• SizeOf() быстрее чем Count(), а при использовании в циклах SizeOf лучше вообще заменить на какую-нибудь переменную.
• For и while практически не отличимы, так что для перебора простых индексных массивов нужно использовать for или while, а для ассоциативных массивов уже лучше воспользоваться foreach. При соблюдении данных рекомендаций можно получить прирост до 30% к скорости.
• Для чтения файла лучше использовать file(), т.к. он быстрее, чем fopen()+цикл. Примерное ускорение может достигнуть до 40%.

Прочитать про всё это подробнее, а так же посмотреть графики скорости и загрузить все примеры можно вот тут - php.spb.ru

Еще немного про оптимизацию PHP кода.
При внедрении кусков PHP-кода в HTML код страницы всегда старайтесь использовать только полные открывающие и закрывающие скобки <?php и ?>! Это обезопасит Вас от вариаций настройки short_open_tag (в файле php.ini) на разных серверах и возможно сэкономит много времени при переносе или загрузке ваших сайтов (проектов) на различные сервера.

При выводе на экран старайтесь вместо printf и sprintf использовать функцию вывода echo там, где это возможно. Да и вообще, нет надобности использовать функции printf и sprintf, так как они выполняются гораздо медленней чем echo потому, что были созданы для интерпретации и вывода строки с ее обработкой, подстановкой значений, в отформатированном виде. Об этом и говорит буква f в конце названия обоих функций.

Пример плохого кода:

PHP код:
sprintf('десять');
printf('двадцать'); 

Пример хорошего кода:

PHP код:
echo 'десять';
echo 
'двадцать'

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

Лучший вариант подстановки переменной в строку (самый быстрый способ):

PHP код:
echo 'Вес автомобиля: '.$weight

Худший вариант прямой подстановки переменной в строку (медленный способ):

PHP код:
echo "Вес автомобиля: $weight"

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

Пример медленного кода:

PHP код:
$n 0;
if (
$n != 0)
 {
     
//$n не равно 0
 

else
 {
     
//$n равно 0 
 


Пример быстрого кода:

PHP код:
$n 0;
if (
$n 0)
 {
     
//$n не равно 0
 
}
 else
 {
     
//$n равно 0
 


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

Для проверки строки на пустоту лучше использовать функцию trim($str);
Данная функция не только проверит пуста ли строка, но также обрежет все несущественные символы - пробелы (табуляции, white-spaces и другие невидимые символы) и вернет положительное значение, в случае если в строке есть хоть какие-то значимые символы.

Вместо использования кода:

PHP код:
if ($stroka != '')
 {
     
//обработка $stroka 
 


Используйте лучше вот такой код:

PHP код:
if (trim($stroka))
 {
     
//обработка $stroka 
 


Для получения данных из форм методом Get и Post лучше всего будет использовать следующие самописные функции:

PHP код:
GetParam ($array$value$default '')
 {
     return (isset(
$array[$value])) ? $array[$value] : $default;
 }
 
GetParamSafe ($array$value$default '')
 {
     return (isset(
$array[$value])) ? addslashes($array[$value]) : $default;
 } 

Функция GetParam($_POST, 'myvar', 'empty') например, корректно получит данные из переменной $_POST['myvar'], и в случае если $_POST переменная не существует, то вернет значение по умолчанию, без всяких Waring и Notice.
Функция GetParamSafe($_POST, 'myvar', 'empty') делает ту же операцию, только возвращает уже экранированную переменную (это будет полезно для защиты сайта от SQL инъекций).
А данная конструкция позволяет получить целочисленное число из $_POST.

PHP код:
intval(GetParam($_POST'myvar''empty')): 

В случае если в массиве $_POST лежало совсем не число функция вернет 0;

Для простого сравнения строк не используйте функцию preg_match() или preg_match_all(), лучше воспользуйтесь функцией strstr() или strpos().

При получении строк из базы данных (из MySQL к примеру) старайтесь использовать функцию mysql_fetch_object.

На пример при изменении кода запроса с:

PHP код:
$result "SELECT name, balans FROM table_1 WHERE balans > 100" 

на код:

PHP код:
$result "SELECT * FROM table_1 WHERE balans > 100" 

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

PHP код:
$str mysql_fetch_array(mysql_query($result));
echo 
$str[0].'-->'.$str[1]; 
перестанет работать, в то время как
PHP код:
$strmysql_fetch_object(mysql_query($result));
echo 
$str->field2.'-->'.$str->field6
останется работоспособным.

При формировании больших запросов вставки данных в базу данных (например, MySQL) через insert, все строчки старайтесь поместить в БД за один-три insert'а. Занесение каждой строчки отдельно не только сильно загрузит сервер БД, но и задержит выполнение Вашего скрипта.

В случае, если необходимо использовать одни и те же сложно вычисляемые данные (например, которые достаются из БД через запрос с последующей обработкой строк) в разных местах (разных классах) одной системы, то старайтесь их вычислять всего один раз и хранить в глобальной переменной для всей системы и передавать в класс (скрипт) только один раз, непосредственно при создании класса (подключении скрипта).

При больших нагрузках на Ваш Web-сервер задумайтесь над использованием стандартных решений для включения кэша (кэш-технологии). Например, воспользуйтесь бесплатным PHP классом JCache_Lite_Function.
14.08.2011 11:41:25
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)


LiveInternet
© Copyright 2011-2024 by UsefulScript.ru