Вопрос

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

Это было полезно?

Решение

Профиль.Профиль.Профиль.Я не уверен, есть ли что-нибудь для 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 ...;
}

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

Другие советы

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

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

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

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

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

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

    if (count($array) === 0) возвращает;

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

    если (!$array) возвращает;

    Еще одна функция-вызов устранен!

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

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

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

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

Вы можете использовать инструмент профилирования, такой как xhprof, чтобы просмотреть, какую часть вашего кода можно оптимизировать, и вот ссылка, по которой нужно перейти: http://michaelsanford.com/compiling-xhprof-for-php-5-4/

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

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

1) Откройте NetBeans, затем выберите опцию в строке меню Tools > Plugin.Затем найдите название подключаемого модуля "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 code sniffer.

"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", чтобы избавиться от этой ошибки.После этой команды вы можете снова запустить приведенную выше команду, чтобы установить Mess detector.

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 beans и следуйте по пути Tools>Options>PHP> PHPCSMD

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

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

Проводили ли вы какое-либо профилирование?

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

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

Те, о которых я могу вспомнить...

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

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

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

  • Абсолютные пути для require и includes.

  • Используйте strpos, str_replace и т.д.вместо регулярных выражений, когда это возможно.

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

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

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

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

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

Сначала следуйте некоторым другим советам, таким как профилирование и принятие правильных решений о распределении ресурсов, напримеркэширование.

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top