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

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

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

Как отключить xdebug только при запуске Composer?

Обновление : проблема была исправлена ​​в 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' > "$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 $@ 

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

 sudo php5dismod -s cli xdebug 

Он удаляет символическую ссылку /etc/php5/cli/conf.d/ из /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 

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

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

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

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

-d позволяет вам добавить любой желаемый параметр (например, активируйте need_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 

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

 #!/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" 

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

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

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

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

 source ~/.bash_profile 

ПРИМЕНЕНИЕ:

 $ composer --version 

ЗАМЕТКА:
Вам необязательно использовать какой-либо другой параметр.
В зависимости от вашей системы у вас может быть .bashrc вместо .bash_profile .

ОБНОВИТЬ:

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

 alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer" 

Обычно я создаю сценарий оболочки для каждого проекта, поскольку каждый проект имеет другую версию 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: 1m33

Запуск с xdebug, но ini-disabled: 0m19

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

Если вы используете 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 автоматизированного тестирования в разработке.

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

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

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

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

Прямая обработка настроек PHP

Вот мой вклад, основанный на установке Homebrew -установленной PHP на 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, передавая команды args (строка 3)
  • использует sed для восстановления файла конфигурации, повторного включения Xdebug (строка 4)

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

Caveat Utilitor

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

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

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

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

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

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

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

На моем Mac я должен был сделать: sudo php /opt/local/bin/composer self-update

Более подробную информацию об этом в контексте установки PHP Homebrew можно найти в этой проблеме .

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

 alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')" 

Вместо того, чтобы путаться с временным включением или отключением 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.

Мое быстрое решение для установки 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 затронуты

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

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

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

sudo rm 20-xdebug.ini

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