Відповіді:
Оновлення : Виправлено виправлення у 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 файлів ...
Однак ви можете додати параметри thhos під час запуску композитора з php:
php -n -d extension=needed_ext.so composer.phar
-n
підкаже PHP ігнорувати будь-який php.ini. Це запобіжить завантаженню xdebug для цієї самої команди.
-d
параметри дозволяють додавати будь-яку потрібну опцію (для прикладів, активувати потрібно_запис.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 у "додатковому режимі":
#!/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-включеним: 1m33
Запустити з xdebug, але ini-відключено: 0m19
Виконати без xdebug: 0m10
COMPOSER_DISABLE_XDEBUG_WARN=1
: якщо ви отримаєте попередження, це просто означає, що ваш скрит не працює. Визначення xdebug.remote_autostart
здається марним, якщо віддалена налагодження відключена.
xdebug.remote_autostart
. Про ефективність сценаріїв: Композитор перевіряє, чи завантажено розширення xdebug, а не якщо він насправді щось робить, подивіться тут на код . Параметри ini чудово працюють у "звичайних" скриптах для php, але знову ж таки: я не робив жодних тестів на продуктивність ...
Якщо ви використовуєте PHPStorm, останній випуск (2016.2) оснащений функцією для ввімкнення XDebug для сценаріїв CLI на вимогу, а це означає, що ви можете просто вимкнути XDebug у всьому світі на вашій машині розробки. IDE дозволить ввімкнути його тоді, коли це буде потрібно кодом у ваших проектах.
PhpStorm 2016.2 вводить режим Xdebug On Demand, де ви можете відключити Xdebug для вашої глобальної установки PHP, і PhpStorm дозволить це лише тоді, коли це потрібно - коли ви налагоджуєте сценарії або коли вам потрібні звіти про покриття коду.
Вам потрібно відредагувати налаштування інтерпретаторів PHP, щоб включити шлях до XDebug, як описано у прив’язаній статті.
Мені це здається ідеальним рішенням, оскільки я, як правило, хочу лише XDebug, поки я перебуваю в IDE.
Однак XDebug має інші можливості використання, коли ви перебуваєте в режимі офлайн, наприклад, розширені скиди стека в журналах помилок, які ви втратите, відключивши його в усьому світі. Звичайно, у вас не повинно бути включено XDebug у виробництві, тому це буде обмежено для використання в розробці випадків, таких як бета-тестування або автоматизовані тестування сценаріїв CLI.
Замість того, щоб заплутатися з тимчасовим включенням або відключенням модуля PHP, коли у вас можуть бути одночасні процеси з використанням PHP (наприклад, як частина конвеєра CI), ви можете сказати PHP вказати на інший каталог завантаження модуля.
Хоча це схоже на деякі рішення, згадані вище, це вирішує декілька кращих випадків, що дуже корисно при використанні Дженкінсом або іншим учасником 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 і коментує розширення zend xdebug, а потім завантажує цей файл конфігурації, коли він запускає композитор .
Я відкрив проблему, щоб побачити, чи хочуть вони включити цю зміну:
https://github.com/composer/windows-setup/isissue/58
Ви можете знайти мої інструкції та код там.
Як зазначається у відповіді Джойса , ця проблема вже не існує в останній версії композитора.
Документація композитора була оновлена для цього . У ньому детально описано, як можна включити xdebug за допомогою Composer (якщо потрібно).
Ви можете оновити свою версію Composer, скориставшись самостійним оновленням .
На моєму Mac я повинен був зробити: sudo php /opt/local/bin/composer self-update
Більш детальну інформацію про це в контексті установки на PHP Homebrew можна знайти в цьому випуску .
Ось мій внесок, заснований на встановленій 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
Сценарій обгортки:
Сценарій поєднаний з установкою ОС X / Homebrew PHP 5.5. Шляхи повинні бути налаштовані для роботи з іншими версіями PHP та макетами каталогу директорів інших операційних систем та менеджерів пакетів. Зауважте також, що для деяких версій sed не потрібен аргумент порожнього рядка, що слідує за -i
параметром.
Сценарій є простим, оскільки він працює безпосередньо на основних файлах конфігурації PHP, однак це також є недоліком: Xdebug також буде відключений для будь-яких сценаріїв, які, можливо, виконуються одночасно з цим сценарієм.
У моєму середовищі розробки це прийнятний компроміс, враховуючи, що композитор виконується вручну і лише зрідка; однак, можливо, ви не хочете використовувати цю техніку, якщо виконувати 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}')"
Моє швидке рішення для встановлення макпортів із декількома версіями 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