При запуске 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' | 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 $@
bin/bash
а не /bin/sh
, поскольку последнему не понравилось function
ключевое слово (Ubuntu 14.04 LTS).
composer self-update
Эта команда отключит модуль 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
alias xdebug-on='sudo php5enmod -s cli xdebug'
и alias xdebug-off='sudo php5dismod -s cli xdebug'
, поэтому теперь легко включать xdebug-on
и отключать xdebug-off
xdebug.
Я не думаю, что есть возможность настроить PHP так, чтобы он мог загружать разные конфигурации в соответствии с целевым сценарием. По крайней мере, не без дублирования файлов .ini ...
Однако вы можете добавить эти параметры при запуске композитора с php:
php -n -d extension=needed_ext.so composer.phar
-n
скажет PHP игнорировать любой php.ini. Это предотвратит загрузку xdebug для этой самой команды.
-d
options позволяет вам добавить любую опцию, которую вы хотите (например, активировать 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 или посмотреть, смогу ли я настроить псевдонимы.
composer.json
, например "ext-ldap": "*", или просто в зависимости от того, что необходимо для правильного выполнения задач после установки. … Если бы только был способ занести расширение в черный список…
php -m
diagnose
, и поскольку я создаю контейнеры докеров для разработки для для своей команды, малейшее улучшение скорости может принести пользу им всем
Создав псевдоним, вы подавите это 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"
-n
Опция отключает Phar
расширение поэтому он может не работать изcomposer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Я придумал ответ, который очень хорошо работает для 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"
Обычно я создаю сценарий оболочки для каждого проекта, поскольку у каждого проекта есть другая версия 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
COMPOSER_DISABLE_XDEBUG_WARN=1
: если вы получаете предупреждение, это просто означает, что ваш скрипт не работает. Определение xdebug.remote_autostart
кажется бесполезным, если удаленная отладка отключена.
xdebug.remote_autostart
. Об эффективности скриптов: Composer проверяет, загружено ли расширение xdebug, а не делает ли оно что-либо, посмотрите здесь код . Параметры ini отлично работают в «обычных» сценариях php, но опять же: я не проводил тестов производительности ...
Если вы используете PHPStorm, последний выпуск (2016.2) поставляется с функцией включения XDebug для сценариев CLI по запросу, что означает, что вы можете просто отключить XDebug глобально на своей машине разработки. IDE будет включать его на лету, когда это потребуется для кода внутри ваших проектов.
PhpStorm 2016.2 представляет режим Xdebug On Demand, в котором вы можете отключить Xdebug для своей глобальной установки PHP, а PhpStorm будет включать его только тогда, когда это необходимо - когда вы отлаживаете свои скрипты или когда вам нужны отчеты о покрытии кода.
Вам необходимо отредактировать настройки PHP Interpreters, чтобы включить путь к XDebug, как описано в связанной статье.
Мне это кажется идеальным решением, так как XDebug мне обычно нужен только в среде IDE.
Однако у XDebug есть и другие потенциальные применения, когда вы находитесь «в автономном режиме», например, расширенные дампы стека в журналах ошибок, которые вы потеряете, отключив его глобально. Конечно, у вас не должно быть включено XDebug в производственной среде, поэтому это будет ограничено такими случаями использования, как бета-тестирование или сценарии CLI автоматического тестирования в процессе разработки.
Вместо того, чтобы путаться с временным включением или отключением модуля 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.
Я придумал решение для установщика Composer на базе Windows - он должен работать для любой установки Composer, он просто делает копию загруженного файла INI и комментирует расширение xdebug zend, а затем загружает этот файл конфигурации при запуске composer .
Я открыл проблему, чтобы узнать, хотят ли они интегрировать это изменение:
https://github.com/composer/windows-setup/issues/58
Здесь вы можете найти мои инструкции и код.
Как отмечено в ответе Джойса , этой проблемы больше нет в последней версии Composer.
Документация Composer была обновлена, чтобы отметить это . В нем подробно описано, как включить xdebug с помощью Composer (при необходимости).
Вы можете обновить свою версию Composer, используя самообновление .
На моем Mac мне пришлось сделать: sudo php /opt/local/bin/composer self-update
Дополнительные сведения об этом в контексте установки Homebrew 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
Скрипт-оболочка:
Сценарий связан с установкой PHP 5.5 для OS X / Homebrew. Пути должны быть скорректированы для работы с другими версиями 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.
Если вы устанавливаете композитор с помощью brew в OS X, вы можете использовать этот псевдоним:
alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')"
Моим быстрым решением для установки 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
Недостатки:
Не элегантно, но просто.
$1…$7
... может быть, это $@
или что-то в этом роде, вам придется поискать.
Создание псевдонима для композитора для отключения xdebug и предотвращения ошибок памяти:
Добавьте эту строку в свой ~ / .bash_profile
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
Перезагрузите терминал, чтобы новый псевдоним стал доступен.
Вот мое быстрое решение, чтобы избавиться от предупреждения Xdebug в версии PHP5-cli. Я удалил поддержку Xdebug для PHP5-cli в Ubuntu 14.04.
cd /etc/php5/cli/conf.d/
sudo rm 20-xdebug.ini
Теперь больше никаких предупреждений Xdebug на PHP5-cli.
sudo phpdismod xdebug
будет предпочтительным методом грубого обращенияrm