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

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

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

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

Ответ 1

Обновление: проблема была исправлена в Composer 1.3. Обновите composer до последней версии, выполнив 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" "[email protected]"
    rm -f "$temporaryPath"
}

php_no_xdebug /usr/local/bin/composer.phar [email protected]
# 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 [email protected]

Ответ 2

Эта команда отключит модуль 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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

source ~/.bash_profile

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

$ composer --version

Примечание:
Вам необязательно использовать какой-либо другой параметр.
В зависимости от вашей системы у вас может быть .bashrc вместо .bash_profile.

UPDATE:

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

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

Ответ 5

Я придумал ответ, который очень хорошо подходит для 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"

Ответ 6

Обычно я создаю оболочку script для каждого проекта, так как каждый проект имеет другую версию 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 "[email protected]"

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

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

Некоторые тайминги на моей машине: 2 Запустите с помощью xdebug и ini-enabled: 1m33

Запустите с xdebug, но ini-disabled: 0m19

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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

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

Ответ 10

Прямая обработка конфигурации PHP

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

Это оболочка оболочки script, предназначенная для сохранения в качестве исполняемого файла в /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 "[email protected]"
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

Теория работы

Обертка script:

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

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

Утилита Caveat Utilitor

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

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

Ответ 11

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

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

Ответ 12

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

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

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

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

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.

Ответ 13

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

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

Ответ 14

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

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

Ответ 15

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

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

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

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

Ответ 17

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

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

sudo rm 20-xdebug.ini

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