it-swarm.com.ru

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

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

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

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

97
greg0ire

Обновление : проблема была исправлена ​​в Composer 1. . Обновите 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]
74
Joyce Babu

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

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
76
ruleant

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

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

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

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

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

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

Типичное решение (потому что composer нужен 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
40
Gui-Don

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

Просто добавьте эту строку в ваш ~/.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"
14
Adriano Rosa

Я пришел с ответом, который довольно хорошо работает для OSX и, возможно, может быть адаптирован для любой версии PHP, которая загружает свои расширения с использованием отдельных файлов .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"
12
ezzatron

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

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

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

Запустить с xdebug, но отключить ini: 0m19

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

7
Joost

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

6
scipilot

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

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

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

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

4
mindplay.dk

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

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

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

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

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

4
Thomas Clowes

Прямое манипулирование конфигурацией 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 "[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

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

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

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

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

Будьте осторожны

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

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

3
j13k

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

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

3
Vazgen Manukyan

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

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

Самый простой способ сделать это - использовать переменную окружения 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.

3
KHobbits

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

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

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

Затем выполните любые команды composer, например:

Sudo composer-nodebug.sh update

Недостатки:

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

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

1
scipilot

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

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

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

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

0
Matthias Schobner