Для всех, кто использует на своем сайте язык 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 код:
$str= mysql_fetch_object(mysql_query($result));
echo $str->field2.'-->'.$str->field6;
останется работоспособным.
При формировании больших запросов вставки данных в базу данных (например, MySQL) через insert, все строчки старайтесь поместить в БД за один-три insert'а. Занесение каждой строчки отдельно не только сильно загрузит сервер БД, но и задержит выполнение Вашего скрипта.
В случае, если необходимо использовать одни и те же сложно вычисляемые данные (например, которые достаются из БД через запрос с последующей обработкой строк) в разных местах (разных классах) одной системы, то старайтесь их вычислять всего один раз и хранить в глобальной переменной для всей системы и передавать в класс (скрипт) только один раз, непосредственно при создании класса (подключении скрипта).
При больших нагрузках на Ваш Web-сервер задумайтесь над использованием стандартных решений для включения кэша (кэш-технологии). Например, воспользуйтесь бесплатным PHP классом JCache_Lite_Function.