При запуске 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 позволит включить его на лету, когда это необходимо в коде внутри ваших проектов.
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
Здесь вы можете найти мои инструкции и код.
Вот мой вклад, основанный на установке 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
Сценарий оболочки:
Скрипт связан с установкой OS X / Homebrew PHP 5.5. Пути должны быть скорректированы для работы с другими версиями PHP и других макетов директорий других операционных систем и менеджеров пакетов. Также обратите внимание, что некоторым версиям sed не нужен аргумент пустой строки, следующий за опцией -i
.
Сценарий прост, поскольку он работает непосредственно с основными файлами конфигурации 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
Недостатки:
Не элегантный, но простой.
Вот мое быстрое решение избавиться от предупреждения Xdebug в версии PHP5-cli. Я удалил поддержку Xdebug для PHP5-cli на Ubuntu 14.04.
cd /etc/php5/cli/conf.d/
sudo rm 20-xdebug.ini
Теперь на PHP5-cli больше нет предупреждений Xdebug.