Отключение xdebug при запуске композитора

98

При запуске composer diagnoseвыдает следующую ошибку:

Расширение xdebug загружено, это может немного замедлить работу Composer. Рекомендуется отключить его при использовании Composer.

Как отключить xdebug, только когда я запускаю Composer?

greg0ire
источник

Ответы:

81

Обновление : проблема исправлена ​​в Composer 1.3 . Обновите композитор до последней версии, выполнив composer self-updateвместо попытки следующего обходного пути.


Вот моя модификация кода @ezzatron. Я обновил скрипт для обнаружения файлов ini из вывода phpinfo.

#!/bin/sh

php_no_xdebug () {
    temporaryPath="$(mktemp -t php.XXXX).ini"

    # Using awk to ensure that files ending without newlines do not lead to configuration error
    php -i | grep "\.ini" | grep -o -e '\(/[a-z0-9._-]\+\)\+\.ini' | grep -v xdebug | xargs awk 'FNR==1{print ""}1' | grep -v xdebug > "$temporaryPath"

    php -n -c "$temporaryPath" "$@"
    rm -f "$temporaryPath"
}

php_no_xdebug /usr/local/bin/composer.phar $@
# On MacOS with composer installed using brew, comment previous line
# Install jq by executing `brew install jq` and uncomment following line.
# php_no_xdebug /usr/local/Cellar/composer/`brew info --json=v1 composer | jq -r '.[0].installed[0].version'`/libexec/composer.phar $@
Джойс Бабу
источник
3
ИМХО, это, безусловно, самое элегантное решение проблемы. Спасибо, Джойс!
Thomas Hansen
2
Лучший. Скрипт. Ever
Maciej Paprocki
1
Мне пришлось настроить shebang на, bin/bashа не /bin/sh, поскольку последнему не понравилось functionключевое слово (Ubuntu 14.04 LTS).
ashnazg
Я обновил код и удалил ключевое слово function для лучшей совместимости.
Джойс Бабу
1
Вы можете подтвердить, что используете последнюю версию, запустивcomposer self-update
Джойс Бабу
77

Эта команда отключит модуль PHP5 Xdebug для CLI (и, следовательно, композитора):

sudo php5dismod -s cli xdebug

Он удаляет символическую ссылку xdebug.ini из/etc/php5/cli/conf.d/

Это было предложено на http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

Обратите внимание, что для Ubuntu 16.04 вам, вероятно, нужно запустить его следующим образом:

sudo phpdismod -s cli xdebug
правящий
источник
4
Я добавил два псевдонима alias xdebug-on='sudo php5enmod -s cli xdebug'и alias xdebug-off='sudo php5dismod -s cli xdebug', поэтому теперь легко включать xdebug-onи отключать xdebug-offxdebug.
Даниэль Меке
Не переносной. Вероятно, только для Linux.
Дити
Отлично работает с коробкой Laravel Homestead (Ubuntu / Debian). Более подробное описание того, как это работает: laracasts.com/discuss/channels/forge/disable-xdebug
Джастин,
2
спасибо за это :) но у меня ubuntu 16.04, и если кому-то понадобится это, просто запустите sudo phpdismod -s cli xdebug
Angel M.
Как насчет php7 в ubuntu? Мне нужно только удалить символическую ссылку? /etc/php/7.0/cli/conf.d
Gastonnina
40

Я не думаю, что есть возможность настроить PHP так, чтобы он мог загружать разные конфигурации в соответствии с целевым сценарием. По крайней мере, не без дублирования файлов .ini ...

Однако вы можете добавить эти параметры при запуске композитора с php:

php -n -d extension=needed_ext.so composer.phar

-nскажет PHP игнорировать любой php.ini. Это предотвратит загрузку xdebug для этой самой команды.

-doptions позволяет вам добавить любую опцию, которую вы хотите (например, активировать required_ext.so). Вы можете использовать несколько -dвариантов. Конечно, это необязательно, возможно, вам это не понадобится.

Затем вы можете создать псевдоним, чтобы он снова стал сладким.

Типичное решение (потому что композитору нужен json):

php -n -d extension=json.so composer.phar

greg0ire> мое решение, основанное на этом:

#!/bin/bash
options=$(ls -1 /usr/lib64/php/modules| \

    grep --invert-match xdebug| \

    # remove problematic extensions
    egrep --invert-match 'mysql|wddx|pgsql'| \

    sed --expression 's/\(.*\)/ --define extension=\1/'| \

    # join everything together back in one big line
    tr --delete '\n'
)

# build the final command line
php --no-php-ini $options ~/bin/composer $*

alias composer=/path/to/bash/script.sh

Это выглядит некрасиво (я пробовал и не смог сделать это с помощью xargs), но работает ... Мне пришлось отключить некоторые расширения, иначе я получаю следующие предупреждения:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysqli.so' - /usr/lib64/php/modules/mysqli.so: undefined symbol: mysqlnd_connect in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_mysql.so' - /usr/lib64/php/modules/pdo_mysql.so: undefined symbol: pdo_parse_params in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_pgsql.so' - /usr/lib64/php/modules/pdo_pgsql.so: undefined symbol: pdo_parse_params in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/wddx.so' - /usr/lib64/php/modules/wddx.so: undefined symbol: php_XML_SetUserData in Unknown on line 0
Гуй-Дон
источник
Я попробовал -nвчера, и у меня возникла проблема, потому что мне не хватало pharрасширения. Я буду стараться добавлять все больше и больше расширений, пока они не заработают, думаю, это хорошее решение. Что касается псевдонима, у меня уже есть несколько псевдонимов zsh, которые я не поддерживаю. Возможно, я попытаюсь заменить двоичный файл сценарием bash или посмотреть, смогу ли я настроить псевдонимы.
greg0ire
Проблема с этим подходом с использованием белого списка заключается в том, что белый список может увеличиваться в зависимости от того, что люди требуют в их composer.json, например "ext-ldap": "*", или просто в зависимости от того, что необходимо для правильного выполнения задач после установки. … Если бы только был способ занести расширение в черный список…
greg0ire
1
Я попробую что-нибудь сделать с выводомphp -m
greg0ire
Мне это приходит в голову, но я предполагаю, что вы используете xdebug в среде разработки. Композитор настолько медленный, что ему нужна эта настройка?
Гуй-Дон
О нет, я только что видел это из вывода diagnose, и поскольку я создаю контейнеры докеров для разработки для для своей команды, малейшее улучшение скорости может принести пользу им всем
greg0ire
14

Создав псевдоним, вы подавите это composer xdebugсообщение об ошибке.

Просто добавьте эту строку ~/.bash_aliasesв свою систему, и она должна работать безупречно.

alias composer="php -n /usr/local/bin/composer"

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

source ~/.bash_profile

ИСПОЛЬЗОВАНИЕ:

$ composer --version

ПРИМЕЧАНИЕ.
Вам не обязательно использовать какие-либо другие параметры.
В зависимости от вашей системы у вас может быть .bashrcвместо .bash_profile.

ОБНОВИТЬ:

Как упоминает @AlexanderKachkaev в комментариях, не стоит добавлять memory_limit следующим образом, чтобы избежать сбоев в некоторых ситуациях:

alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Адриано Роза
источник
3
Это не будет работать очень хорошо, если одно из расширений потребуется в сценариях после установки или обновления… может быть хорошим решением для простых проектов.
greg0ire
1
-nОпция отключает Pharрасширение поэтому он может не работать изcomposer.phar
brzuchal
1
Это сработало для меня. Вдобавок я отключил ограничение памяти, чтобы не вылетало:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Александр Качкаев
Это решение довольно простое и работает в моей ситуации. Предложение по ограничению памяти от @AlexanderKachkaev является обязательным. Будьте готовы отредактировать ответ.
Генри
12

Я придумал ответ, который очень хорошо работает для OSX и, вероятно, может быть адаптирован для любой версии PHP, которая загружает свои расширения с использованием отдельных файлов .ini в «дополнительном каталоге ini»:

#!/bin/sh

function php-no-xdebug {
    local temporaryPath="$(mktemp -t php-no-debug)"

    find /opt/local/etc/$1/php.ini /opt/local/var/db/$1/*.ini ! -name xdebug.ini | xargs cat > "$temporaryPath"
    php -n -c "$temporaryPath" "${@:2}"
    rm -f "$temporaryPath"
}

alias composer="php-no-xdebug php56 ~/bin/composer"
эззатрон
источник
Большой! Я создал на его основе универсальный скрипт для Ubuntu 14.04-15.10 gist.github.com/perk11/816c4e64023ea26976cf
Константин
Отлично, отлично работает на Mac OS, на пиве установлен php 7.1. ТЫ!
Антонио Карлос Рибейро
7

Обычно я создаю сценарий оболочки для каждого проекта, поскольку у каждого проекта есть другая версия PHP. Он находится в /bin/каталоге рядом с composer.pharи, composer.jsonи я запускаю его как ./bin/composerв каталоге моего проекта.

Это выглядит так (для php56)

#!/bin/sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

COMPOSER_DISABLE_XDEBUG_WARN=1 /opt/local/bin/php56 \
    -d xdebug.remote_enable=0 -d xdebug.profiler_enable=0 \
    -d xdebug.default_enable=0 $DIR/../composer.phar "$@"

Параметры -dэффективно отключают xdebug. COMPOSER_DISABLE_XDEBUG_WARN=1Часть отключает вопросы предупреждения композитора.

Отключение расширения xdebug предпочтительно (см. Устранение неполадок композитора ), но мне лично нравится более простой сценарий.

Некоторое время на моей машине: 2 Запуск с xdebug и ini-enabled: 1 мин 33

Запуск с xdebug, но с отключенным ini: 0m19

Запускать без xdebug: 0m10

Joost
источник
Я думаю, поскольку вы отключаете XDebug, вам не нужно COMPOSER_DISABLE_XDEBUG_WARN=1: если вы получаете предупреждение, это просто означает, что ваш скрипт не работает. Определение xdebug.remote_autostartкажется бесполезным, если удаленная отладка отключена.
greg0ire
Вы правы xdebug.remote_autostart. Об эффективности скриптов: Composer проверяет, загружено ли расширение xdebug, а не делает ли оно что-либо, посмотрите здесь код . Параметры ini отлично работают в «обычных» сценариях php, но опять же: я не проводил тестов производительности ...
Joost
(Наконец) нашел соответствующую часть в руководстве композитора об этом устранении неполадок: влияние xdebug на composer . В нем объясняется, что отключения всех параметров xdebug с помощью флагов ini недостаточно для уменьшения проблем с производительностью. Так что мой сценарий не сработает. Жаль!
Joost
Я немного посчитал (в Mac OS X) и должен сказать, что вполне доволен улучшением производительности с помощью моего скрипта! С Xdebug опция включена он принимает 1m33 с опцией отключен он принимает 0m19 . Без расширения xdebug требуется 0 мин . 10 мин .
Joost
Хорошо, в любом случае улучшение есть. Не самое лучшее доступное улучшение, но тем не менее огромное улучшение (по крайней мере, для OS X)
greg0ire
6

Если вы используете PHPStorm, последний выпуск (2016.2) поставляется с функцией включения XDebug для сценариев CLI по запросу, что означает, что вы можете просто отключить XDebug глобально на своей машине разработки. IDE будет включать его на лету, когда это потребуется для кода внутри ваших проектов.

https://blog.jetbrains.com/phpstorm/2016/06/xdebug-on-demand-for-cli-php-scripts-in-phpstorm-2016-2-eap/

PhpStorm 2016.2 представляет режим Xdebug On Demand, в котором вы можете отключить Xdebug для своей глобальной установки PHP, а PhpStorm будет включать его только тогда, когда это необходимо - когда вы отлаживаете свои скрипты или когда вам нужны отчеты о покрытии кода.

Вам необходимо отредактировать настройки PHP Interpreters, чтобы включить путь к XDebug, как описано в связанной статье.

Мне это кажется идеальным решением, так как XDebug мне обычно нужен только в среде IDE.

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

сипилот
источник
5

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

Хотя это похоже на некоторые из упомянутых выше решений, это решает несколько крайних случаев, что очень полезно при использовании Jenkins или другим исполнителем CI, который одновременно запускает тесты на одной машине.

Самый простой способ сделать это - использовать переменную окружения PHP_INI_SCAN_DIR

Использовать это в скрипте или задаче сборки очень просто:

export PHP_INI_SCAN_DIR=/etc/php.d.noxdebug php composer install

Конечно, вы можете сначала подготовить /etc/php.d.noxdebug, сделав что-то вроде:

mkdir /etc/php.d.noxdebug cp /etc/php.d/* /etc/php.d.noxdebug rm /etc/php.d.noxdebug/xdebug.ini

Это означает, что у вас есть среда, аналогичная старой среде php, с отсутствием только одного модуля. Это означает, что вам не нужно беспокоиться о необходимости загрузки модулей phar / json, как в случае с решением php -n.

Хоббиты
источник
Я бы использовал символические ссылки вместо простого копирования файлов ini.
greg0ire
1
Я уклонялся от использования символических ссылок, потому что это создает впечатление, что папки синхронизированы, а новые модули не будут автоматически добавлены в папку noxdebug.
KHobbits
4

Я придумал решение для установщика Composer на базе Windows - он должен работать для любой установки Composer, он просто делает копию загруженного файла INI и комментирует расширение xdebug zend, а затем загружает этот файл конфигурации при запуске composer .

Я открыл проблему, чтобы узнать, хотят ли они интегрировать это изменение:

https://github.com/composer/windows-setup/issues/58

Здесь вы можете найти мои инструкции и код.

mindplay.dk
источник
Просто и эффективно :) Придется ли снова применять это после обновления композитора через самообновление?
marcovtwout
4

Как отмечено в ответе Джойса , этой проблемы больше нет в последней версии Composer.

Документация Composer была обновлена, чтобы отметить это . В нем подробно описано, как включить xdebug с помощью Composer (при необходимости).

Вы можете обновить свою версию Composer, используя самообновление .

На моем Mac мне пришлось сделать: sudo php /opt/local/bin/composer self-update

Дополнительные сведения об этом в контексте установки Homebrew PHP можно найти в этом выпуске .

Томас Клоуз
источник
Замечательно! Вы знаете, где пиар этого изменения? Мне это нужно в другом приложении CLI
Tomáš Votruba
3

Прямое управление конфигурацией PHP

Вот мой вклад, основанный на установке PHP, установленной Homebrew в Mac OS X.

Это оболочка сценария оболочки, предназначенная для сохранения в виде исполняемого файла по адресу /usr/local/bin/composer, с двоичным файлом Composer по адресу/usr/local/bin/composer.phar :

#!/bin/sh
sed -i '' -e 's:zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":;zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":' /usr/local/etc/php/5.5/conf.d/ext-xdebug.ini
/usr/local/bin/php /usr/local/bin/composer.phar "$@"
sed -i '' -e 's:;zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":' /usr/local/etc/php/5.5/conf.d/ext-xdebug.ini

Теория Операции

Скрипт-оболочка:

  • использует sed для временного изменения файла конфигурации, отключая Xdebug (строка 2)
  • выполняет Composer, передавая аргументы команде (строка 3)
  • использует sed для восстановления файла конфигурации, повторно активируя Xdebug (строка 4)

Сценарий связан с установкой PHP 5.5 для OS X / Homebrew. Пути должны быть скорректированы для работы с другими версиями PHP и компоновками каталогов других операционных систем и менеджеров пакетов. Также обратите внимание, что некоторым версиям sed не требуется аргумент пустой строки, следующий за-i параметра.

Caveat Utilitor

Сценарий прост в том, что он работает непосредственно с основными файлами конфигурации PHP, однако это также является недостатком: Xdebug также будет отключен для любых сценариев, которые выполняются одновременно с этим сценарием.

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

j13k
источник
Я не уверен, что это повлияет на то, как Composer обрабатывает ошибки - у вас есть конкретный пример или проблема? Скрипт предназначен для быстрого решения проблемы и не проходил тщательных боевых испытаний. Сказав это, за то время, пока я его использовал, он работал без каких-либо проблем.
j13k
1
Меня беспокоит, что последняя строка скрипта может не запуститься.
greg0ire
2

В большинстве случаев вам не требуется xdebug в режиме CLI. Если это приемлемо для вас, вы можете настроить cli и cgi по-другому.

Итак, если вы сделаете php-cli.ini и conf-cli.d рядом с выходящим файлом php.ini, вы можете настроить cli и cgi по-другому (для cgi это будут php.ini и conf.d ). Только не помещайте xdebug.ini в conf-cli.d.

Вазген Манукян
источник
2

Если вы устанавливаете композитор с помощью brew в OS X, вы можете использовать этот псевдоним:

alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')"
Bukashk0zzz
источник
1

Моим быстрым решением для установки macports с несколькими версиями PHP было написать эту простую оболочку-оболочку для Composer:

/user/local/bin/composer-nodebug.sh

#!/bin/bash

sudo mv /opt/local/var/db/php53/xdebug.ini /opt/local/var/db/php53/xdebug.NOT
sudo mv /opt/local/var/db/php54/xdebug.ini /opt/local/var/db/php54/xdebug.NOT
sudo mv /opt/local/var/db/php55/xdebug.ini /opt/local/var/db/php55/xdebug.NOT
composer $1 $2 $3 $4 $5 $6 $7
sudo mv /opt/local/var/db/php53/xdebug.NOT /opt/local/var/db/php53/xdebug.ini
sudo mv /opt/local/var/db/php54/xdebug.NOT /opt/local/var/db/php54/xdebug.ini
sudo mv /opt/local/var/db/php55/xdebug.NOT /opt/local/var/db/php55/xdebug.ini

Затем запустите любые команды композитора, например:

sudo composer-nodebug.sh update

Недостатки:

  • требует sudo (если вы не chmod файлы INI)
  • если вы убьете его на полпути, файлы INI будут изменены
  • потребует добавления будущих версий PHP.
  • пока он работает, другие процессы PHP затронуты

Не элегантно, но просто.

сипилот
источник
Я думаю, есть ярлык, который вы можете использовать вместо $1…$7... может быть, это $@или что-то в этом роде, вам придется поискать.
greg0ire
> если вы убьете его на полпути, файлы INI будут изменены, вы любезно исправите, что, перехватывая сигнал уничтожения,> потребует добавления будущих версий PHP. вы также можете исправить это с помощью простого цикла
greg0ire
1

Создание псевдонима для композитора для отключения xdebug и предотвращения ошибок памяти:

Добавьте эту строку в свой ~ / .bash_profile

alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'

Перезагрузите терминал, чтобы новый псевдоним стал доступен.

Маттиас Шобнер
источник
-3

Вот мое быстрое решение, чтобы избавиться от предупреждения Xdebug в версии PHP5-cli. Я удалил поддержку Xdebug для PHP5-cli в Ubuntu 14.04.

cd /etc/php5/cli/conf.d/

sudo rm 20-xdebug.ini

Теперь больше никаких предупреждений Xdebug на PHP5-cli.

Милин Местры
источник
2
sudo phpdismod xdebugбудет предпочтительным методом грубого обращенияrm
Джефф Пакетт