web-dev-qa-db-fra.com

Désactivation de xdebug lors de l'exécution de composer

Lors de l'exécution de composer diagnose, l'erreur suivante apparaît:

L'extension xdebug est chargée, cela peut ralentir un peu Composer. Il est recommandé de le désactiver lorsque vous utilisez Composer.

Comment puis-je désactiver xdebug uniquement lorsque j'utilise Composer?

97
greg0ire

Mise à jour : Le problème a été corrigé dans Composer 1. . Mettez à jour composer vers la dernière version en exécutant composer self-update au lieu d'essayer la solution de contournement suivante.


Voici ma modification du code de @ ezzatron. J'ai mis à jour le script pour détecter les fichiers ini à partir de la sortie 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 $@
75
Joyce Babu

Cette commande désactivera le module PHP5 Xdebug pour la CLI (et donc le composeur):

Sudo php5dismod -s cli xdebug

Il supprime le lien symbolique xdebug.ini de /etc/php5/cli/conf.d/

Ceci a été suggéré le http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

Notez que pour Ubuntu 16.04, vous devrez probablement le lancer comme ceci:

Sudo phpdismod -s cli xdebug
76
ruleant

Je ne pense pas qu’il existe une option pour configurer PHP afin qu’il puisse charger différentes configurations en fonction du script ciblé. Du moins, pas sans dupliquer les fichiers .ini ...

Cependant, vous pouvez ajouter ces options lors de l'exécution de composer avec php:

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

-n dira à PHP d'ignorer le fichier php.ini. Cela empêchera xdebug de se charger pour cette commande.

Les options -d vous permettent d'ajouter les options de votre choix (par exemple, activer needed_ext.so). Vous pouvez utiliser plusieurs options -d. Bien sûr, c'est optionnel, vous n'en aurez peut-être pas besoin.

Vous pouvez ensuite créer un alias pour le rendre à nouveau sucré.

Une solution typique (parce que composer a besoin de json):

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

greg0ire> ma solution, basée sur cela:

#!/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

Cela a l'air moche (j'ai essayé et je n'ai pas réussi à faire ça avec xargs), mais ça marche… j'ai dû désactiver certaines extensions, sinon j'obtiens les avertissements suivants:

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

En créant un alias, vous supprimerez le message d'erreur composerxdebug.

Ajoutez simplement cette ligne à votre ~/.bash_aliases au sein de votre système et cela devrait fonctionner parfaitement.

alias composer="php -n /usr/local/bin/composer"

Rechargez le shell pour rendre le nouvel alias composer disponible.

source ~/.bash_profile

USAGE:

$ composer --version

REMARQUE:
Vous n'avez pas nécessairement besoin d'utiliser un autre paramètre.
En fonction de votre système, vous pouvez utiliser un .bashrc au lieu de .bash_profile.

PDATE:

Comme @AlexanderKachkaev le mentionne dans les commentaires, il est inutile d'ajouter le paramètre memory_limit comme suit pour éviter les plantages dans certaines situations:

alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
14
Adriano Rosa

Je trouvais une réponse qui fonctionnait plutôt bien pour OSX et qui pourrait probablement être adaptée à toute version de PHP qui charge ses extensions à l'aide de fichiers .ini individuels dans le "répertoire ini supplémentaire":

#!/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

Je crée généralement un script Shell par projet, car chaque projet a une autre version PHP. C'est dans un répertoire /bin/ à côté de composer.phar et composer.json et je l'exécute en tant que ./bin/composer dans le répertoire de mon projet.

Cela ressemble à ceci (pour 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 "$@"

Les options -d désactivent effectivement xdebug. La partie COMPOSER_DISABLE_XDEBUG_WARN=1 désactive l'avertissement composer.

Désactiver l'extension xdebug est préférable (voir dépannage du composeur ), mais j'aime personnellement le script plus simple.

Quelques timings sur ma machine: 2 Exécuter avec xdebug et ini-enabled: 1m33

Courir avec xdebug mais ini-disabled: 0m19

Courir sans xdebug: 0m10

7
Joost

Si vous utilisez PHPStorm, la dernière version (2016.2) inclut une fonctionnalité permettant d'activer les scripts XDebug for CLI à la demande, ce qui signifie que vous pouvez simplement désactiver XDebug globalement sur votre ordinateur de développement. Le IDE l'activera à la volée lorsque le code dans vos projets le demandera.

https://blog.jetbrains.com/phpstorm/2016/06/xdebug-on-demand-for-cli-php-scripts-in-phpstorm-2016-2-eap/

PhpStorm 2016.2 introduit le mode Xdebug à la demande dans lequel vous pouvez désactiver Xdebug pour votre installation globale PHP. PhpStorm ne l'activera que s'il le souhaite - lorsque vous déboguez vos scripts ou lorsque vous avez besoin de rapports de couverture de code .

Vous devez modifier vos préférences PHP Interpreters pour inclure le chemin d'accès à XDebug, comme décrit dans l'article lié.

Pour moi, cela semble être la solution idéale, car je ne veux généralement que XDebug lorsque je suis dans l'EDI.

Cependant, XDebug a d’autres utilisations potentielles lorsque vous êtes "hors ligne", par exemple. dumps de pile étendus dans les journaux d’erreur, ce que vous perdriez en le désactivant globalement. Bien entendu, XDebug ne devrait pas être activé en production. Cela serait donc limité aux cas d'utilisation tels que les tests en version bêta ou les scripts CLI en test automatisé en cours de développement.

6
scipilot

Je suis venu avec une solution pour l'installateur Composer basé sur Windows - cela devrait fonctionner pour toute installation de Composer, il s'agit en fait de copier le INI chargé _ fichier et commente l'extension xdebug zend, puis charge ce fichier de configuration lorsqu'il exécute composer.

J'ai ouvert un problème pour voir s'ils souhaitaient intégrer ce changement:

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

Vous pouvez trouver mes instructions et mon code ici.

4
mindplay.dk

Comme indiqué dans réponse de Joyce , ce problème n'existe plus dans la dernière version de Composer.

La documentation Composer a été mise à jour pour notez ceci . Il explique comment vous pouvez activer xdebug avec Composer (si nécessaire).

Vous pouvez mettre à jour votre version de Composer en utilisant self-update .

Sur mon Mac, je devais faire: Sudo php /opt/local/bin/composer self-update

Plus de détails à ce sujet dans le contexte d’une installation Homebrew PHP peuvent être trouvés dans ce problème .

4
Thomas Clowes

Manipulation directe de PHP config

Voici ma contribution basée sur une installation de Homebrew - PHP installé sur Mac OS X.

C'est un wrapper de script shell, conçu pour être enregistré en tant que fichier exécutable sous /usr/local/bin/composer, avec le binaire Composer sous /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

Théorie de fonctionnement

Le script wrapper:

  • utilise sed pour modifier temporairement le fichier de configuration, désactivant Xdebug (ligne 2)
  • exécute Composer en passant des arguments à la commande (ligne 3)
  • sed utilise pour restaurer le fichier de configuration, réactivant Xdebug (ligne 4)

Le script est couplé à une installation de PHP 5.5 sous OS X/Homebrew. Les chemins doivent être ajustés pour fonctionner avec les autres versions PHP et les présentations de répertoires d'autres systèmes d'exploitation et gestionnaires de paquets. Notez également que certaines versions de sed n'ont pas besoin de l'argument chaîne vide suivant l'option -i.

Caveat Utilitor

Le script est simple, car il fonctionne directement sur les principaux fichiers de configuration PHP, , mais est également un inconvénient: Xdebug sera également désactivé pour tous les scripts exécutés simultanément avec ce script.

Dans mon environnement de développement, il s'agit d'un compromis acceptable, étant donné que Composer est exécuté manuellement et occasionnellement. Toutefois, vous ne souhaiterez peut-être pas utiliser cette technique si vous exécutez Composer dans le cadre d'un processus de déploiement automatisé.

3
j13k

Dans la plupart des cas, vous n'avez pas besoin de xdebug en mode CLI. Si cela vous convient, vous pouvez configurer cli et cgi différemment.

Donc, si vous faites php-cli.ini et conf-cli.d presque à la sortie du fichier php.ini, vous pouvez configurer cli et cgi différemment (pour cgi ce serait - php.ini et conf.d). Il suffit de ne pas mettre xdebug.ini dans conf-cli.d.

3
Vazgen Manukyan

Plutôt que de confondre avec l'activation ou la désactivation temporaire du module PHP, lorsque vous pouvez avoir des processus simultanés utilisant PHP (par exemple dans le cadre d'un pipeline de CI), vous pouvez indiquer PHP pour pointer vers un autre répertoire de chargement de module.

Bien que cela soit similaire à certaines des solutions mentionnées ci-dessus, cela résout quelques cas Edge, ce qui est très utile lorsqu'il est utilisé par Jenkins ou un autre coureur de CI qui exécute des tests simultanément sur la même machine.

Le moyen le plus simple consiste à utiliser la variable d'environnement PHP_INI_SCAN_DIR

Utiliser ceci dans un script ou une tâche de construction est simple:

export PHP_INI_SCAN_DIR=/etc/php.d.noxdebug php composer install

Bien sûr, vous voudrez d’abord préparer /etc/php.d.noxdebug, en effectuant quelque chose comme:

mkdir /etc/php.d.noxdebug cp /etc/php.d/* /etc/php.d.noxdebug rm /etc/php.d.noxdebug/xdebug.ini

Cela signifie que vous avez un environnement similaire à l'ancien environnement php, avec seulement un module manquant. Cela signifie que vous n'avez pas à vous soucier de devoir charger les modules phar/json comme vous le feriez avec la solution php -n.

3
KHobbits

Si vous installez composer en utilisant brew sur OS X, vous pouvez utiliser cet alias:

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

Ma solution rapide pour une installation macports, avec plusieurs versions de PHP était d'écrire ce simple wrapper Shell pour 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

Ensuite, lancez les commandes composer comme ceci:

Sudo composer-nodebug.sh update

Désavantages:

  • nécessite Sudo (sauf si vous modifiez les fichiers INI)
  • si vous le tuez à mi-chemin, les fichiers INI sont modifiés
  • les futures versions de PHP seront ajoutées.
  • pendant qu'il exécute d'autres PHP processus sont affectés

Pas élégant, mais simple.

1
scipilot

Création d'un alias pour composer afin de désactiver xdebug et d'éviter les erreurs de mémoire:

Ajoutez cette ligne à votre ~/.bash_profile

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

Redémarrez le terminal pour rendre le nouvel alias disponible.

0
Matthias Schobner