Відключення xdebug під час роботи композитора


98

Під час запуску composer diagnoseя отримую таку помилку:

Розширення xdebug завантажено, це може трохи уповільнити композитор. Деактивувати його під час використання Composer рекомендується.

Як я можу відключити xdebug лише тоді, коли я запускаю композитор?

Відповіді:


81

Оновлення : Виправлено виправлення у 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 $@

3
Це, безумовно, найелегантніше рішення проблеми, ІМХО. Дякую, Джойс!
Томас Хансен

2
Найкраще. Сценарій. Колись
Мацей Папроцький

1
Мені довелося скорегувати шебанг, bin/bashа не /bin/shтому, що останньому не сподобалося functionключове слово (Ubuntu 14.04 LTS).
ашназг

Я оновив код і видалив функціональне ключове слово, для кращої сумісності.
Джойс Бабу

1
Ви можете підтвердити, що ви працюєте з останньою версією, запустившиcomposer self-update
Джойс Бабу

77

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

4
Я додав два псевдоніми, alias xdebug-on='sudo php5enmod -s cli xdebug'і alias xdebug-off='sudo php5dismod -s cli xdebug'тому тепер легко включити xdebug-onта вимкнути xdebug-offxdebug.
Даніель Мекк

Не портативний. Можливо, лише для Linux.
Діті

Відмінно працює на коробці Laravel Homestead (Ubuntu / Debian). Більш довгий опис того, як це працює: laracasts.com/discuss/channels/forge/disable-xdebug
Джастін

2
дякую за це :), але у мене є ubuntu 16.04, і якщо комусь потрібно буде скористатися цим просто запустіть sudo phpdismod -s cli xdebug
Angel M.

Як щодо php7 в ubuntu? Чи потрібно лише видалити симпосилання? /etc/php/7.0/cli/conf.d
gastonnina

40

Я не думаю, що є можливість налаштувати 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, або побачу, чи можу я налаштувати псевдоніми.
greg0ire

Проблема цього підходу з білого списку полягає в тому, що білий список може зростати залежно від того, чого потребують люди composer.json, наприклад, "ext-ldap": "*", або просто залежно від того, що потрібно для того, щоб завдання встановлення повідомлення виконувалося належним чином … Якби тільки існував спосіб укласти в чорний список розширення…
greg0ire

1
Я спробую щось зробити з виходомphp -m
greg0ire

Мені це спадає на думку, але, я припускаю, ви використовуєте xdebug в середовищі розробки. Чи композитор настільки повільний, що йому потрібна ця настройка?
Гі-Дон

О ні, я щойно побачив це з результатів diagnose, і оскільки я будую контейнери для докерів для розвитку для своєї команди, найменше підвищення швидкості могло б принести користь усім їм
greg0ire

14

Створюючи псевдонім, ви придушите це 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"

3
Це не буде грати дуже добре, як тільки одне розширення потрібно в сценаріях після встановлення чи публікації оновлень… Хоча це може бути гарним рішенням для простих проектів.
greg0ire

1
-nОпція відключає Pharрозширення тому він може не працювати зcomposer.phar
brzuchal

1
Це працювало для мене. Крім того, я відключив обмеження пам’яті, щоб уникнути збоїв:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Олександр Качкаєв

Це рішення досить просте і працездатне для моєї ситуації. Пропозиція щодо обмеження пам’яті від @AlexanderKachkaev є обов'язковою. Добре відредагуйте відповідь.
Генрі

12

Я придумав відповідь, яка працює досить добре для 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"

Чудово! Я створив сценарій загального призначення на основі цього для Ubuntu 14.04-15.10 gist.github.com/perk11/816c4e64023ea26976cf
Костянтин

Фантастичний, відмінно працює на Mac OS, на встановленому вариві php 7.1. ТИ!
Антоніо Карлос Рібейро

7

Я зазвичай створюю сценарій оболонки для кожного проекту, оскільки кожен проект має іншу версію 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


Я думаю, оскільки ви вимикаєте XDebug, вам не потрібно COMPOSER_DISABLE_XDEBUG_WARN=1: якщо ви отримаєте попередження, це просто означає, що ваш скрит не працює. Визначення xdebug.remote_autostartздається марним, якщо віддалена налагодження відключена.
greg0ire

Ти маєш рацію xdebug.remote_autostart. Про ефективність сценаріїв: Композитор перевіряє, чи завантажено розширення xdebug, а не якщо він насправді щось робить, подивіться тут на код . Параметри ini чудово працюють у "звичайних" скриптах для php, але знову ж таки: я не робив жодних тестів на продуктивність ...
Joost

(Нарешті) знайшов відповідну частину в посібнику для композиторів про це усунення несправностей: вплив xdebug на композитора . Це пояснює, що відключення всіх параметрів xdebug через прапор INI недостатньо, щоб зменшити проблеми з продуктивністю. Тож мій сценарій не працюватиме. Шкода!
Joost

Я зробив деякі терміни (на Mac OS X), і я повинен сказати, що я цілком задоволений покращенням продуктивності за допомогою мого сценарію! З Xdebug опція включена він приймає 1m33 з опцією відключений він приймає 0m19 . Без розширення xdebug потрібно 0m10 .
Joost

Гаразд, так чи інакше, є покращення. Не найкраще доступне вдосконалення, але все-таки величезне поліпшення (принаймні, в ОС X)
greg0ire

6

Якщо ви використовуєте 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.


5

Замість того, щоб заплутатися з тимчасовим включенням або відключенням модуля 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.


Я використовував би символьні посилання замість того, щоб просто копіювати ini-файли.
greg0ire

1
Я ухилився від використання символьних посилань, оскільки це створює враження, що папки синхронізуються, тоді як нові модулі не будуть автоматично включені в папку "noxdebug".
KHobbits

4

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

Я відкрив проблему, щоб побачити, чи хочуть вони включити цю зміну:

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

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


Просте та ефективне :) Чи потрібно вам це знову застосовувати після оновлення композитора шляхом самооновлення?
marcovtwout

4

Як зазначається у відповіді Джойса , ця проблема вже не існує в останній версії композитора.

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

Ви можете оновити свою версію Composer, скориставшись самостійним оновленням .

На моєму Mac я повинен був зробити: sudo php /opt/local/bin/composer self-update

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


Це чудово! Чи знаєте ви, де піар цієї зміни? Мені це потрібно в іншому додатку CLI
Томаш Вотруба,

3

Пряма маніпуляція конфігурацією 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

Теорія функціонування

Сценарій обгортки:

  • використовує sed, щоб тимчасово змінити файл конфігурації, відключивши Xdebug (рядок 2)
  • виконує композитор, передаючи команду через аргументи (рядок 3)
  • використовує sed для відновлення файлу конфігурації, повторного включення Xdebug (рядок 4)

Сценарій поєднаний з установкою ОС X / Homebrew PHP 5.5. Шляхи повинні бути налаштовані для роботи з іншими версіями PHP та макетами каталогу директорів інших операційних систем та менеджерів пакетів. Зауважте також, що для деяких версій sed не потрібен аргумент порожнього рядка, що слідує за -iпараметром.

Caveat Utilitor

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

У моєму середовищі розробки це прийнятний компроміс, враховуючи, що композитор виконується вручну і лише зрідка; однак, можливо, ви не хочете використовувати цю техніку, якщо виконувати Composer як частину автоматизованого процесу розгортання.


Я не впевнений, що це вплине на те, як композитор обробляє помилки - чи є у вас конкретний приклад чи стурбованість? Сценарій призначений як швидке вирішення проблеми і не був ретельно перевірений битвою. Сказавши, що в той час, коли я ним користувався, він працював без проблем.
j13k

1
Мене хвилює те, що останній рядок сценарію може бути запущений.
greg0ire

2

У більшості випадків вам не потрібен xdebug в режимі CLI. Якщо це для вас прийнятно, ви можете налаштувати cli та cgi по-різному.

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


2

Якщо ви встановлюєте композитор за допомогою brew на OS X, ви можете використовувати цей псевдонім:

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

1

Моє швидке рішення для встановлення макпортів із декількома версіями 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

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


Я думаю, що є ярлик, який ви можете використовувати замість $1…$7… можливо, це $@чи щось подібне, вам доведеться подивитися.
greg0ire

> якщо ви вб'єте його посередині способу, модифіковані файли INI, ви вирішите виправити, що, захоплюючи сигнал вбивства, знадобляться нові версії PHP. Ви також можете це виправити за допомогою простого циклу
greg0ire

1

Створення псевдоніма для композитора для відключення xdebug та запобігання помилок пам'яті:

Додайте цей рядок до свого ~ / .bash_profile

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

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


-3

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

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

sudo rm 20-xdebug.ini

Тепер більше немає попередження Xdebug на PHP5-cli.


2
sudo phpdismod xdebugбув би кращим методом для грубого зверненняrm
Джефф Пукетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.