Статьи

Легкие победы для более совершенного PHP

Вступление

Создание вашего сайта более производительным может потребовать много слоев. От настройки обратного прокси-кеша с помощью Varnish до настройки группы балансировщиков нагрузки существует множество хорошо документированных параметров.

Что если вы только начинаете? Что делать, если у вас есть меньшее приложение? Есть ли вещи, которые вы можете сделать сейчас, которые будут иметь значение?

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

Как минимум, обновление до PHP 5.4

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

Если PHP 5.5.5 не вариант, вы ДОЛЖНЫ минимально начать с PHP 5.4. PHP 5.3 не только почти 4 года, он медленнее и использует больше памяти, чем PHP 5.4 .

Запуск Drupal? На PHP 5% быстрее при использовании почти на 50% меньше памяти.

Автозагрузка

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

Мы можем использовать Composer для достижения этого результата.

Композитор был рассмотрен в предыдущих статьях для управления зависимостями. Для автозагрузки вы можете просто добавить расположение классов в вашем файле composer.json. Единственный параметр конфигурации — это механизм сопоставления файлов, определяемый ключом в массиве JSON.

Например, если у вас есть классы в папке src

 {
    "autoload": {
        "psr-0": { "": "src/" }
    }
}

Если у вас есть классы, распределенные по папке resourceslibrary

 {
    "autoload": {
        "classmap": ["resources/", "library/", "Something.php"]
    }
}

Имейте в виду, однако, что, хотя это уменьшает необходимость использования requireinclude_once

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

Альтернативный автозагрузчик, который также нужно изучить, — это компонент Symfony2 Classloader, методика, описанная в предыдущей статье .

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

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

Если необходимо, сделайте свойства объекта общедоступными, чтобы избежать ненужных методов, так как при этом используется меньше памяти при выполнении:

 class A {
    public $foo;
    public function setFoo($bar) { $this->foo = $bar; }
    public function getFoo() { return $this->foo; }
}

$bat = new A();

// Slower
$bat->setFoo('baz');
$baz = $bat->getFoo();

// Faster
$bat->foo = 'baz';
$baz = $bat->foo;

Определите размер циклов перед итерацией:

 // Slower
for ($i = 0; $i < count($j); $i++)

// Faster
$count = count($j);
for ($i = 0; $i < $count; $i++)

Используйте языковую конструкцию isset()

 // Check for existence and type of variable
if (isset($foo) && is_array($foo)) { return $bar; }

Редактировать: использование isset() Предыдущий пример кода был основан на моем неправильном понимании эталона на http://phpbench.com .

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

Профиль

Объективные измерения того, насколько хорошо работает ваш шедевр, дают ценную информацию и уменьшают субъективные отвлекающие факторы. Профилирование вашего кода очень просто, но требует компиляции расширения во время выполнения PHP.

Вы можете использовать расширение XDebug или расширение Advanced PHP Debugger (APD) для профилирования вашего кода. Просто обновите ваш php.ini или добавьте INI-файл для вашего расширения с соответствующими параметрами конфигурации:

Пример конфигурации XDebug ini для OSX с / brew:

 [xdebug]
zend_extension="/usr/local/Cellar/php54-xdebug/2.2.3/xdebug.so"   
xdebug.profiler_enable=1   
xdebug.profiler_output_dir="/tmp"

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

Для более надежного профилирования и мониторинга вы можете также рассмотреть возможность установки инструментов из AppDynamics, которые при установке в качестве демона сервера и расширения PHP позволяют проводить углубленный анализ ваших сложных и крупных приложений. Это отличный вариант для оптимизации унаследованного кода.

Кэширование OpCode

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

Начиная с PHP 5.5 (еще одна причина для обновления), OpCache , проект кэширования с открытым исходным кодом от Zend, включен по умолчанию .

Для более ранних версий вам просто нужно установить ZendOpCache через PECL.

Пример конфигурации ini ZendOpCache на OSX с / brew:

 [opcache]
zend_extension="/usr/local/Cellar/php54-opcache/7.0.2/opcache.so"   
zend_optimizerplus.memory_consumption=128   
zend_optimizerplus.interned_strings_buffer=8   
zend_optimizerplus.max_accelerated_files=4000   
zend_optimizerplus.revalidate_freq=60   
zend_optimizerplus.fast_shutdown=1   
zend_optimizerplus.enable_cli=1   
zend_optimizerplus.enable_file_override=1   
apc.cache_by_default = false

Резюме

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


Это спонсированная статья. Компания, которая спонсировала это, компенсировала SitePoint, чтобы написать и опубликовать его. Спонсируемые статьи, независимо написанные SitePoint, позволяют нам разрабатывать и представлять контент, который наиболее полезен и актуален для наших читателей.