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

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

15.08.2008 18:25:25
13 ОТВЕТОВ
РЕШЕНИЕ

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

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

18
15.08.2008 22:39:42

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

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

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

3
15.08.2008 18:28:47

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

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

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

0
15.08.2008 18:29:48

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

0
15.08.2008 22:49:29

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

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

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

7
15.08.2008 22:50:50

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

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

0
15.08.2008 23:06:04

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

  • Петлевые инварианты всегда хороши для просмотра.

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

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

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

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

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

1
19.08.2008 14:59:57

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

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

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

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

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

    if (! $ array) return;

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

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

5
17.09.2008 21:39:20
if (! $array) return;может вызвать PHP Уведомление о неопределенной переменной, которую люди должны использоватьif(empty($array)) return false;
Bishoy 25.08.2014 11:12:56
Я написал этот комментарий в эпоху, используя версию PHP, в которой не было полезного режима STRICT. Люди должны считать этот пример устаревшим и действительно использовать empty (), чтобы всегда проверять, заполнена ли переменная (или null, empty, false)
Willem 26.08.2014 08:24:32

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

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

2
17.09.2008 21:50:21

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

0
17.09.2008 22:43:02

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

0
31.08.2013 07:38:30

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

Оптимизация 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, затем выберите опцию в строке меню Инструменты> Плагин. Затем найдите имя плагина "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
6.06.2014 04:53:01

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

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

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

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

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

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

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

0
27.12.2017 11:39:06