Будет ли включение XDebug на рабочем сервере замедлять работу PHP?

Название в значительной степени говорит обо всем... это плохая идея? Я хотел бы иметь расширенные сообщения отладки, которые XDebug предоставляет на сервере.

[править] Просто чтобы прояснить ситуацию. Я знаю, что есть риски безопасности. Возможно, я должен дополнить свой вопрос и привести более точные причины, почему я хотел бы сделать это.

Наш производственный сервер также содержит платформу для тестирования. Иногда мы используем его для тестирования вещей в среде, максимально приближенной к производственной. Главное, что я ищу, это использование улучшенного XDebug var_dump(),

Это не сервер приложений для приложений с высоким трафиком, и производительность не так уж велика. Мне было просто любопытно, заметно ли повлияет производительность XDebug.

Кроме того, я думаю, я мог бы включить его только для VirtualHost, который определяет сайты тестирования.

12 ответов

Решение

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

Во-первых, когда вы добавляете поведение отладки на ваш сервер, механизм отладки "присоединяется" к процессу PHP и получает сообщения от механизма, чтобы остановиться на точках останова, а это ПЛОХО, потому что вводит удар высокой производительности, чтобы иметь другой процесс остановка или "сохранение" парсера PHP.

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

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

РЕДАКТИРОВАТЬ Поскольку, очевидно, мой ответ недостаточно документирован, вы должны проверить эти источники

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

Замедлить в 4 раза

Я провел несколько тестов, просто включив модуль, без фактической отладки, замедляя запрос на моей машине для разработки с 1 до 4 секунд.

Полное удаление xdebug (даже если оно не было включено) увеличило загрузку страницы на 50% (с 60 до 30 мс). У нас был xdebug сидя "спящий" (ожидание триггера). Мы думали, что, поскольку он дремлет, это не причинит никакого вреда, но, парень, мы ошиблись.

Мы прокомментировали строку zend_extension в конфигурации php около 21:43. Средняя нагрузка также снизилась с 0,4 до 0,2 на ядро:

С какой стати ты хочешь что-то подобное? Отладка перед развертыванием в производство. Это замедлит работу приложения.

Xdebug 3

XDebug 3 теперь позволяет отключить его, чтобы накладные расходы были близки к 0: https://xdebug.org/docs/install#mode

Вы можете использовать конфигурацию ниже в рабочей среде, чтобы установить xdebug с минимальными издержками, близкими к 0:

      [xdebug]
xdebug.mode=off

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

Я знаю, что это старый пост, но поскольку проблема с Xdebug все еще существует 10 лет назад, я хотел бы указать на соответствующий отчет об ошибке (закрыт как WONTFIX NOTABUG): https://bugs.xdebug.org/view.php?id=1668

Tl;dr:

Простая установка xdebug (в linux @least) замедлит весь php на сайте до обхода, с числом обращений от 2x до 20x, даже если все флаги выключены. НЕ УСТАНАВЛИВАЙТЕ xdebug В ПРОИЗВОДСТВЕ - НИКОГДА. А еще лучше изучить менее навязчивые варианты отладки.

Xdebug предназначен для добавления полных трасс стека в журналы ошибок, то есть значение ini display_errors, которое, конечно, должно быть выключено (даже в разработке я не хочу этого). Он не разрешает удаленное подключение к отладчику, если вы не включите параметр ini remote_attach. Хотя это медленнее, если у вас есть таинственная ошибка PHP, такая как выделение максимальной памяти или ошибка сегментации, это единственный способ увидеть, где это произошло на самом деле.

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

Примечание: очевидно, это не относится ни к кому. Не каждый может легко клонировать сервер. Если вы используете облачные сервисы, такие как AWS и т. Д., Это будет очень просто. Если вы используете инструменты для настройки сервера, такие как Ansible, Chef, Puppet, для создания своего сервера, то это тоже будет просто.

Вы никогда не должны держать это на производстве.

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

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

Скорость выполнения - ваша наименьшая проблема, в любом случае это повлияет на нее, равно как и на память.

Я проверил влияние на производительность с помощью этого инструмента тестирования php. Отказ от ответственности Я создал инструмент.

Ответ - модуль xdebug значительно замедляет выполнение кода: от 2x до 7x раз в зависимости от теста. Вот мои результаты:

# env information
php version        :     7.4.5
platform           : WINNT x64

# disable xdebug extension in php.ini
$ php src/benchmark.php --iterations 1000 --time-per-iteration 50 --save xdebug_off

# enable xdebug extension
$ php src/benchmark.php --iterations 1000 --time-per-iteration 50 --save xdebug_on

# compare
$ php src/compare.php --file1 benchmark_xdebug_off_20201127-0946.txt --file2 benchmark_xdebug_on_20201127-0939.txt
------------------------------------------------
test_math                  OFF       ON
mean               :      3762      531   -85.9%
median             :      4226      568   -86.6%
mode               :      4655      596   -87.2%
minmum             :       918      188   -79.5%
maximum            :      4722      612   -87.0%
quartile 1         :      3081      490   -84.1%
quartile 3         :      4580      595   -87.0%
IQ range           :      1498      105   -93.0%
std deviation      :       984       87   -91.1%
normality          :     11.0%    11.0%
------------------------------------------------
test_strings
mean               :      1419      677   -52.3%
median             :      1521      688   -54.7%
mode               :      1580      974   -38.4%
minmum             :       537       90   -83.2%
maximum            :      1629     1071   -34.3%
quartile 1         :      1319      452   -65.7%
quartile 3         :      1582      892   -43.6%
IQ range           :       262      440    67.8%
std deviation      :       226      248     9.8%
normality          :      6.6%     6.6%
------------------------------------------------
test_loops
mean               :      8131     1208   -85.1%
median             :      8617     1240   -85.6%
mode               :      9109     1407   -84.6%
minmum             :      3167      589   -81.4%
maximum            :      9666     1435   -85.2%
quartile 1         :      7390     1116   -84.9%
quartile 3         :      9253     1334   -85.6%
IQ range           :      1863      217   -88.3%
std deviation      :      1425      164   -88.4%
normality          :      5.6%     5.6%
------------------------------------------------
test_if_else
mean               :    279630    31263   -88.8%
median             :    293553    31907   -89.1%
mode               :    303706    37696   -87.6%
minmum             :    104279    12560   -88.0%
maximum            :    322143    37696   -88.3%
quartile 1         :    261977    28386   -89.2%
quartile 3         :    307904    34773   -88.7%
IQ range           :     45927     6387   -86.1%
std deviation      :     39034     4405   -88.7%
normality          :      4.7%     4.7%
------------------------------------------------
test_arrays
mean               :      5705     3275   -42.6%
median             :      5847     3458   -40.9%
mode               :      6040     3585   -40.6%
minmum             :      3366     1609   -52.2%
maximum            :      6132     3645   -40.6%
quartile 1         :      5603     3098   -44.7%
quartile 3         :      5965     3564   -40.3%
IQ range           :       361      465    28.8%
std deviation      :       404      394    -2.5%
normality          :      2.4%     2.4%
------------------------------------------------

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

Вы можете использовать XDebug в производстве, если вы "делаете это правильно". Вы можете включить расширение в "спящем" режиме, который активируется только через запросы, которые проходят через определенное имя HOSTS. Вот подробности здесь:

http://www.drupalonwindows.com/en/content/remote-debugging-production-php-applications-xdebug

Другие вопросы по тегам