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






Не существует волшебного решения, и попытки предоставить общие решения вполне могут быть пустой тратой времени.
Где ваши узкие места? Например, ваши скрипты интенсивно используют процессор / базу данных / память?
Вы выполнили какое-либо профилирование?
Всякий раз, когда я смотрю на проблемы с производительностью, я думаю, что лучше всего определить, сколько времени требуется вашим страницам для запуска, а затем посмотреть на самые медленные из них. Когда вы получаете эти реальные метрики, вы часто можете улучшить производительность самых медленных на порядки, либо исправив медленный SQL-запрос, либо, возможно, немного сжав код.
Это, конечно, не требует нового оборудования или специального программного обеспечения, только критический взгляд на существующий код.
Тем не менее, это будет работать только так долго ... если вы действительно получаете достаточно трафика, чтобы выйти за пределы вашего оборудования, и / или есть некоторый код, который по своей сути медленный и действительно необходим, вам придется взглянуть на другие возможности.
Профиль. Профиль. Профиль. Я не уверен, есть ли что-нибудь для 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 для использования двоичного поиска по отсортированному массиву, и получил ожидаемое экспоненциальное ускорение.
Сначала следуйте другим советам, таким как профилирование и принятие правильных решений о распределении ресурсов, например кеширование.
Также примите во внимание производительность внешних ресурсов, таких как ваша база данных. В MySQL вы можете, например, проверить журнал медленных запросов. Вдобавок убедитесь, что вы не создали свою базу данных и не забыли о ней. Оптимизация ваших запросов (снова для MySQL) относительно реальных данных может дорого обойтись.
Те, о которых я могу думать ...
Инварианты цикла всегда хорошо смотреть.
Напишите E_STRICT и E_NOTICE совместимый код, особенно если вы регистрируются ошибки.
Избегайте оператора @.
Абсолютные пути для требований и включает.
По возможности используйте strpos, str_replace и т. д. Вместо регулярных выражений.
Кроме того, существует множество других методов, которые могут сработать, но, вероятно, не принесут вам особой пользы.
На самом деле подумайте об использовании профилировщика XDebug: он помогает проверить, насколько выполняется определенная функция по сравнению с тем, что вы ожидали.
Я стараюсь уменьшить количество инструкций, улучшая читаемость кода, заменяя логику поиском по массиву, когда это необходимо. Это то, что написал Джефф Этвуд в [Лучший код - это не код вообще] [1].
Ненужное тестирование:
if (count($array) === 0) return;
также можно записать как:
if (! $array) return;
Другой вызов функции исключен!
[1]: http://www.codinghorror.com/blog/archives/000878.html «Лучший код - это не код вообще»
Я написал этот комментарий в эпоху, когда использовалась версия PHP, в которой не было полезного режима STRICT. Люди должны считать этот пример устаревшим и действительно использовать empty (), чтобы всегда проверять, заполнена ли переменная (или null, empty, false)
включение файлов происходит медленно, а требовать их еще медленнее. Если вы используете __autoload для включения каждого класса, это будет складываться. Например.
Я всегда немного опасаюсь быть слишком умным в плане оптимизации кода, если это принесет в жертву ясность кода. Если вам нужно сделать код неясным, чтобы сделать его быстрым, не будет ли дешевле обновить износостойкость вместо того, чтобы тратить время на настройку кода? В конце концов, циклы процессора дешевле, чем циклы программиста.
Расмус Лердорф дал несколько хороших советов в своей недавней презентации "Просто это сложно" на FrOSCon '08. Если вы используете кеш байт-кода (и вам действительно следует его использовать), включение пропущенных путей сильно повредит, поэтому оптимизируйте свой файл require / require_once.
Вы можете использовать инструмент профилирования, такой как xhprof, чтобы увидеть, какую часть вашего кода можно оптимизировать!
Вы можете оптимизировать код с помощью двух основных вещей:
Пройдите через 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"
Это будет использоваться для установки «истинного» автоматического обнаружения пути для требуемых подключаемых модулей. Таким образом, они автоматически устанавливаются в желаемое место.
5) Затем выполните команду ниже, чтобы установить сниффер кода PHP.
"pear install --alldeps pear/PHP_CodeSniffer"
6) Теперь, чтобы установить Детектор сообщений PHP, выполнив следующую команду
"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, выполнив следующую команду
"pear install --alldeps phpunit/phpcpd"
9) Затем запустите команду
"pear config-set auto_discover 0"
Это будет использоваться для установки значения "false" для пути автоматического обнаружения.
10) Затем откройте net beans и перейдите по пути Tools> Options> PHP> PHPCSMD.
1) Используйте последнюю версию PHP
Основная команда упорно работает над улучшением производительности PHP в каждой версии.
2) Используйте кеш байт-кода
Начиная с PHP 5.5, в PHP был добавлен кеш байт-кода под названием OPcache. Использование OPcache может иметь огромное значение, особенно после выхода PHP 7. Он получает улучшения в каждой версии PHP и может даже получить Внедрение JIT в будущем.
3) Профилирование
При разработке профилирования вы сможете лучше понять, что именно происходит. Это очень помогает находить узкие места в вашем коде.
Одним из наиболее часто используемых инструментов является XHProf, но он больше не поддерживается официально и имеет проблемы с PHP> = 7. Альтернативой, когда вы хотите профилировать PHP> = 7, является Tideways, который является вилкой XHProf.
if (! $array) return;может вызвать уведомление PHP о неопределенной переменной, люди должны использоватьif (empty($array)) return false;