Производительность PHP - PullRequest
       48

Производительность PHP

12 голосов
/ 15 августа 2008

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

Ответы [ 13 ]

18 голосов
/ 15 августа 2008

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

Итак, где у вас есть функция:

function foo($stuff) {
    ...
    return ...;
}

Я бы изменил это на:

function foo($stuff) {
    trace_push_fn('foo');
    ...
    trace_pop_fn('foo');
    return ...;
}

(Это один из тех случаев, когда множественные возвраты в функции становятся помехой.)

И SQL:

function bar($stuff) {
    trace_push_fn('bar');

    $query = ...;
    trace_push_sql($query);
    mysql_query($query);
    trace_pop_sql($query);

    trace_pop_fn('bar');
    return ...;
}

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

7 голосов
/ 16 августа 2008

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

Вы также можете быть удивлены, сколько времени тратится на плохо написанные запросы к базе данных; время общих сгенерированных запросов и посмотреть, можно ли их переписать. Время, затрачиваемое на выполнение реального кода PHP, обычно довольно ограничено, если только вы не используете некоторые неоптимальные алгоритмы.

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

5 голосов
/ 06 июня 2014

Вы можете оптимизировать код с помощью двух основных вещей:

Оптимизация связанной с PHP библиотеки и сервера

Пройдите https://www.digitalocean.com/community/articles/how-to-optimize-apache-web-server-performance Или

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

Оптимизация кода с использованием профилировщика кода и анализатора кода

Вам необходимо установить Netbeans, чтобы использовать этот плагин. Вот шаги, которые вы должны выполнить:

1) Откройте NetBeans, затем выберите опцию в строке меню Инструменты> Плагин. Затем найдите имя плагина "phpcsmd" во вкладке доступных плагинов и установите его оттуда.

2) Теперь откройте терминал и станьте суперпользователем, набрав команду "sudo su".

3) Установите библиотеку PEAR (если она не установлена) в вашу систему, выполнив следующие команды в вашем терминале

a) wget http://pear.php.net/go-pear.phar
b) php go-pear.phar

Как нам это нужно для установки дополнительных дополнений.

4) Затем выполните команду

"pear config-set auto_discover 1"

Это будет использоваться для автоматического определения пути «true» для необходимых плагинов. Таким образом, они автоматически устанавливаются в нужное место.

5) Затем выполните приведенную ниже команду для установки сниффера кода PHP.

"pear install --alldeps pear/PHP_CodeSniffer"

6) Теперь, чтобы установить PHP Mess Detector, выполните следующую команду

"pear install --alldeps phpmd/PHP_PMD"

Если при установке этого модуля вы получили сообщение об ошибке «Недопустимое имя пакета / файл пакета« phpmd / PHP_PMD »». Чтобы избавиться от этой ошибки, вам нужно использовать эту команду «pear channel-Discover pear.phpmd.org». После этой команды вы можете снова запустить указанную команду, чтобы установить детектор сообщений.

7) Теперь, чтобы установить PHP Depend, выполните следующую команду

"pear install --alldeps pdepend/PHP_Depend"

8) Теперь установите PHP Copy Paste Detector, выполнив следующую команду

"pear install --alldeps phpunit/phpcpd"

9) Затем выполните команду

"pear config-set auto_discover 0"

Это будет использоваться для установки пути автоматического обнаружения "false".

10) Затем откройте net bean и следуйте по пути Инструменты> Параметры> PHP> PHPCSMD

5 голосов
/ 18 сентября 2008

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

Я пытаюсь уменьшить количество инструкций, улучшая читабельность кода, заменяя логику поисками в массивах, когда это необходимо. Это то, что написал Джефф Этвуд в «Лучший код - нет кода вообще» [1].

  • Кроме того, избегайте петель внутри другого цикл и вложенные операторы if / else.
  • Короткие функции. Иногда много код не нужно выполнять когда значение результата уже известен.
  • Ненужное тестирование:

    if (count ($ array) === 0) return;

    также можно записать как:

    if (! $ Array) return;

    Еще один вызов функции исключен!

    [1]: http://www.codinghorror.com/blog/archives/000878.html"The Лучший код - это не код вообще "

3 голосов
/ 15 августа 2008

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

Где ваши узкие места? Например, ваши скрипты интенсивно используют процессор / базу данных / память?

Вы выполняли профилирование?

2 голосов
/ 18 сентября 2008

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

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

1 голос
/ 19 августа 2008

Те, о которых я могу думать ...

  • Инварианты цикла всегда хорошо смотреть.

  • Запись E_STRICT и E_NOTICE совместимый код, особенно если вы регистрируются ошибки.

  • Избегайте оператора @.

  • Абсолютные пути для потребностей и включает в себя.

  • По возможности используйте strpos, str_replace и т. Д. Вместо регулярных выражений.

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

0 голосов
/ 27 декабря 2017

1) Используйте последнюю версию PHP

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

2) Использовать кэш байт-кода

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

3) Профилирование

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

Одним из наиболее часто используемых инструментов является XHProf, но он больше официально не поддерживается и имеет проблемы с PHP> = 7. Альтернативой, когда вы хотите профилировать PHP> = 7, является Tideways, который является форком XHProf.

0 голосов
/ 31 августа 2013

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

0 голосов
/ 18 сентября 2008

Расмус Лердорф дал несколько хороших советов в своей недавней презентации " Simple is Hard " на FrOSCon '08. Если вы используете кэш байт-кода (и вы действительно должны его использовать), включение пропусков путей сильно повредит, поэтому оптимизируйте ваш require / require_once.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...