Ускоряем работу скриптов ч.1
Создано Евгений Злобин в мая 16, 2008Очень часто можно заметить вопросы php-разработчиков по поводу оптимизации кода. По этому поводу ходит много слухов и появляется не меньше споров. Например до сих пор спорят что лучше использовать echo или print.
Поэтому давайте начнем со всего по порядку. Сразу отмечу, что некоторые из этих советов идут в разрез с читабельностью кода, поэтому решать что важнее именно вам.
1) echo быстрее print
На данный момент мало актуальный совет. Особенно, если вы приверженец ООП. Однако следует отметить, что ни echo, ни print не являются функциями, они есть ни что иное, как языковые конструкции. Однако print может вести себя как функция, что позволяет её использовать в сложных выражениях, например, с применением тернарных операторов( $bool ? print ‘true’ : print ‘false’; ), где echo не возможно использовать.
2) Лишние фигурные скобки
Очень часто приходится видеть подобный код:
if (условие)
{
действие;
}
если выполняется только одно действие, то фигурные скобки можно опустить. Пример:
if (a == 2) $a++;
Хотя это может вызвать некоторые проблемы у начинающих программистов. При необходимости добавить ещё одно действие, можно забыть поставить фигурные скобки и в итоге мы получаем трудно вылавливаемую ошибку:
if (выражение)
действие_1;
действие_2;
Этот же прием касается и других подобных конструкций. Например, циклы:
$sum = 0;
for ($i = 1; $i < 3; $i++) $sum += $i;
3) Подавление ошибок при помощи оператора @
На мой взгляд, использование @ показывает некомпетентность программиста. Если же действительно нужно скрыть показ ошибок, то можно использовать функцию error_reporting(). Либо использовать die(), если нужно блокировать вывод только в одном месте. Т.о. заместо
$handle = @fopen('data.dat','r');
будем использовать
$handle = fopen('data.dat','r') or die('Возникла ошибка');
Есть ещё более элегантный метод.
try
{
$handle = fopen('data.dat','r')
}
catch (Exception $error)
{
echo 'Возникла ошибка';
}
Если кто-то работал с Delphi, то ему сразу все станет ясно (try … except …) для остальных объясняю. В блоке try мы выполняем потенциально сбойный код и при возникновении ошибки будет выполнен код из блока catch, а в переменную $error будет записана полная информация о возникшей ошибке.
Рассмотрим класс Exception:
class Exception
{
protected $message = 'Unknown exception'; // текст ошибки
protected $code = 0; // числовой код возникшей ошибки
protected $file; // имя файла, в котором возникла ошибка
protected $line; // номер строки с ошибкой
function __construct($message = null, $code = 0);
final function getMessage(); // аналогично $message
final function getCode(); // аналогично $code
final function getFile(); // аналогично $file
final function getLine(); // аналогично $line
final function getTrace(); // содержит массив вызванных функций во время появления ошибки.
final function getTraceAsString(); // возвращает отформатированную строку обо всех вложенных вызовах
function __toString();
}
Код взят из официальной документации по PHP. Я веду к тому, что разработчик сам может переопределять метод __toString и таким образом создавать свои классы для обработки возникших нештатных ситуаций. Примеры, опять же, можно посмотреть в официальной документации.
Особенно хорош этот метод тем, что у программиста появляется возможность не только показывать свои сообщения об ошибках, но и записывать в log файл полную информацию о нештатных ситуациях.
4) Инкремент и декремент
Используйте следущую конструкцию $i++ вместо $i = $i + 1 и соответственно $i– вместо $i = $i – 1.
Запомните, что:
- Инкремент локальной переменной в методе – самый быстрый. Почти также работает инкремент локальной переменной в функции.
- Инкремент глобальной переменной в два раза медленее, чем локальной.
- Инкремент свойства объекта (т.е. $this->prop++) в три раза медленнее, чем локальной переменной.
- Инкремент неопределённой переменной в 9-10 раз медленнее, чем заранее инициализированной.
Да и ещё, есть такие штуки как $i++ и ++$i, однако не многие понимают различия в них. Если результат нужен до инкремента, применяем $i++ иначе ++$i.
p.s. продолжение следует, а пока расслабимся.
Пессимист видит чёрный туннель.
Оптимист видит свет в конце туннеля.
Реалист видит приближающийся поезд.
Машинист видит трёх дураков на рельсах.
Может быть Вам это интересно?
- YouTube API & JavaScript Upload
- Ускоряем работу скриптов ч.3
- Утилита BCP для экспорта\импорта в MSSQL
- Установка APE на CentOS
- Подключение по ssh
© "Паутина фриланса".


Да уж вокруг echo и print такой ажиотаж развели, что они уже первым номером в списке на оптимизацию идут. Хотя там должно быть «кешируй».
Где ставить скобки зависит от стиля кодирования, к примеру, если используется стиль кодирования Zend Framework то скобки ставятся всегда.
Собака это зло и самый важный пункт в этом посте, недавно из-за подавления ошибки в том же Zend Framework пришлось заглубиться в разбор его кода и после уничтожения @ стало понятно в чем проблема. Стоит избегать ее использования.
Евгений, спасибо за дельный комментарий. Вдвойне приятно, что этот блог посещают столь известные люди =)
[...] (Нет голосов) Loading … Ускоряем работу скриптов ч.1 мая [...]
[...] Ускоряем работу скриптов ч.1 Ускоряем работу скриптов ч.2 Ну вот и третья часть. Перейдем сразу к делу. [...]
Начинающие! Не берите в голову второй пункт с убиранием скобок, пусть все «тормозит» но хоть четко видно где и что расположено. Толку от такой оптимизации вряд-ли будет слишком много, а вот голову запудрить можно конкретно…
Кстати не совсем согласен и с третьим пунктом. В некоторых случаях гораздо проще поставить «хвостатую», чем громоздить длинные конструкции. Однако злоупотреблять «@» все-же не стоит.
Дмитрий Агафонов, безусловно это все оптимизация на спичках. И сейчас по прошествии времени я понимаю, что гораздо лучше, правильная архитектура приложения и код оформленый по стандартам. Но тем не менее для своих проектов я люблю сэкономить пару-тройку спичек )
В принципе, по поводу экономии, я полностью с вами согласен, программисту необходимо приучать себя писать код правильно и оптимально. Однако, по моему, это не как не должно вредить его восприятию, т.к. ковыряние в неработающем скрипте и поиск таких, порой трудно определяемых ошибок удовольствия ни кому не доставит. Лично я все-же против удаления скобок из if(). А вообще каждый решает сам что приемлемо конкретно для него, я свой выбор сделал в пользу фигурных скобок и не жалею об этом.
Добрый день!
Оптимизация скриптов на пхп, это конечно хорошо, но есть ли смысл оптимизировать на таком уровне?
как по мне,то лучше продумать код
Спасибо. читал очень внимательно. Не особо большой спец по php но кое чего знаю. Советы в статье все простые но перечитав еще раз понял что ошибок допускал целую кучу особенно с операторо if ставив кучу скобок. {} Сколько не читал книг на такие мелочи мало кто обращает внимание. все дают нудную теорию