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

98

Lors de l'exécution composer diagnose, j'obtiens l'erreur suivante:

L'extension xdebug est chargée, cela peut ralentir un peu Composer. Il est recommandé de le désactiver lors de l'utilisation de Composer.

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

Greg0ire
la source

Réponses:

81

Mise à jour : le problème a été résolu dans Composer 1.3 . Mettez à jour le compositeur 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 $@
Joyce Babu
la source
3
C'est de loin la solution la plus élégante au problème, à mon humble avis. Merci Joyce!
Thomas Hansen
2
Meilleur. Scénario. Ever
Maciej Paprocki
1
J'ai dû ajuster le shebang à bin/bashplutôt que /bin/sh, car ce dernier n'aimait pas le functionmot - clé (Ubuntu 14.04 LTS).
ashnazg
J'ai mis à jour le code et supprimé le mot-clé de fonction, pour une meilleure compatibilité.
Joyce Babu
1
Vous pouvez confirmer que vous utilisez la dernière version en exécutantcomposer self-update
Joyce Babu
77

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

sudo php5dismod -s cli xdebug

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

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

Notez que pour Ubuntu 16.04, vous devez probablement l'exécuter comme ceci:

sudo phpdismod -s cli xdebug
souverain
la source
4
J'ai ajouté les deux alias alias xdebug-on='sudo php5enmod -s cli xdebug'et alias xdebug-off='sudo php5dismod -s cli xdebug', il est donc maintenant facile d'activer xdebug-onet de désactiver xdebug-offxdebug.
Daniel Mecke
Pas portable. Probablement Linux uniquement.
Diti
Fonctionne très bien sur la boîte Laravel Homestead (Ubuntu / Debian). Une description plus longue de son fonctionnement: laracasts.com/discuss/channels/forge/disable-xdebug
Justin
2
merci pour cela :) mais j'ai ubuntu 16.04 et si quelqu'un a besoin de l'utiliser, lancez simplement sudo phpdismod -s cli xdebug
Angel M.
Que diriez-vous de php7 dans ubuntu? Dois-je seulement supprimer le lien symbolique? /etc/php/7.0/cli/conf.d
gastonnina
40

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

-ndira à PHP d'ignorer tout php.ini. Cela empêchera xdebug de se charger pour cette même commande.

-doptions vous permet d'ajouter n'importe quelle option que vous voulez (par exemple, activer required_ext.so). Vous pouvez utiliser plusieurs -doptions. Bien sûr, c'est facultatif, vous n'en aurez peut-être pas besoin.

Ensuite, vous pouvez créer un alias pour le rendre à nouveau sucré.

Une solution typique (car le compositeur 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 échoué de le faire avec xargs), mais cela fonctionne ... 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
Guidon
la source
J'ai essayé -nhier et j'ai eu un problème car il me manquait l' pharextension. Je vais essayer d'ajouter de plus en plus d'extension jusqu'à ce que cela fonctionne, je pense que c'est une bonne solution. Selon l'alias, j'ai déjà des alias zsh que je ne maintiens pas. Je vais peut-être essayer de remplacer le binaire par un script bash, ou voir si je peux configurer les alias.
greg0ire le
Le problème avec cette approche de liste blanche, cependant, est que la liste blanche peut augmenter en fonction de ce que les gens ont besoin dans leur composer.json, par exemple "ext-ldap": "*", ou simplement en fonction de ce qui est nécessaire pour que les tâches de post-installation s'exécutent correctement … Si seulement il y avait un moyen de mettre sur liste noire une extension…
greg0ire
1
Je vais essayer de faire quelque chose avec la sortie dephp -m
greg0ire
Cela me vient à l'esprit, mais je suppose que vous utilisez xdebug dans un environnement de développement. Le compositeur est-il si lent qu'il a besoin de cette modification?
Gui-Don
Oh non, je viens de voir cela à partir de la sortie de diagnose, et puisque je construis des conteneurs docker de développement pour mon équipe, la plus petite amélioration de la vitesse pourrait bénéficier à tous
greg0ire
14

En créant un alias, vous supprimerez cela composer xdebug message d'erreur.

Ajoutez simplement cette ligne à votre ~/.bash_aliasessystème et cela devrait fonctionner parfaitement.

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

Rechargez le shell pour rendre le nouvel alias composerdisponible.

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 pourriez avoir un à la .bashrcplace de .bash_profile.

METTRE À JOUR:

Comme @AlexanderKachkaev le mentionne dans les commentaires, cela ne vaut rien d'ajouter la limite de mémoire comme suit pour éviter de planter dans certaines situations:

alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Adriano Rosa
la source
3
Cela ne fonctionnera pas très bien dès que l'une des extensions sera nécessaire dans les scripts de post-installation ou de mise à jour… pourrait être une bonne solution sur des projets simples.
greg0ire
1
L' -noption désactive l' Pharextension afin qu'elle ne puisse pas s'exécuter à partir decomposer.phar
brzuchal
1
Cela a fonctionné pour moi. De plus, j'ai désactivé la limite de mémoire pour éviter de alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
planter
Cette solution est assez simple et réalisable pour ma situation. La suggestion de limite de mémoire de @AlexanderKachkaev est un must. Soyez bon pour modifier la réponse.
Henry
12

J'ai trouvé une réponse qui fonctionne plutôt bien pour OSX, et qui pourrait probablement être adaptée à toute version de PHP qui charge ses extensions en utilisant des 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"
Ezzatron
la source
Génial! J'ai créé un script à usage général basé sur cela pour Ubuntu 14.04-15.10 gist.github.com/perk11/816c4e64023ea26976cf
Konstantin Pereiaslov
Fantastique, fonctionne très bien sur Mac OS, sur brew installé php 7.1. TY!
Antonio Carlos Ribeiro
7

Je crée généralement un script shell par projet, car chaque projet a une autre version PHP. C'est dans un /bin/répertoire à côté de composer.pharet composer.jsonet je l'exécute comme ./bin/composerdans mon répertoire de 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 -doptions désactivent efficacement xdebug. La COMPOSER_DISABLE_XDEBUG_WARN=1pièce désactive les problèmes de composition d'avertissement.

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

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

Exécuter avec xdebug mais ini-désactivé: 0m19

Exécuter sans xdebug: 0m10

Joost
la source
Je pense que puisque vous désactivez XDebug, vous n'avez pas besoin de COMPOSER_DISABLE_XDEBUG_WARN=1: si vous recevez un avertissement, cela signifie simplement que votre scrit ne fonctionne pas. La définition xdebug.remote_autostartsemble inutile si le débogage à distance est désactivé.
greg0ire
Vous avez raison xdebug.remote_autostart. À propos de l'efficacité des scripts: Composer vérifie si l'extension xdebug est chargée, pas si elle fait réellement quelque chose, regardez le code ici . Les options ini fonctionnent bien dans les scripts php "normaux" mais encore une fois: je n'ai fait aucun test de performance ...
Joost
(Enfin) a trouvé la partie pertinente dans le manuel du compositeur à propos de ce dépannage: l'impact de xdebug sur le compositeur . Il explique que la désactivation de toutes les options xdebug via des indicateurs ini n'est pas suffisante pour atténuer les problèmes de performances. Donc mon script ne fonctionnera pas. Dommage!
Joost
J'ai fait du timing (sur Mac OS X) et je dois dire que je suis assez content des améliorations de performances en utilisant mon script! Avec les options xdebug activées, cela prend 1m33 , avec les options désactivées, cela prend 0m19 . Sans l'extension xdebug, cela prend 0m10 .
Joost
Ok donc il y a quand même une amélioration. Pas la meilleure amélioration disponible, mais une énorme amélioration tout de même (au moins sur OS X)
greg0ire
6

Si vous utilisez PHPStorm, la dernière version (2016.2) comprend une fonctionnalité permettant d'activer XDebug pour les scripts CLI à la demande, ce qui signifie que vous pouvez simplement désactiver XDebug globalement sur votre machine de développement. L'EDI l'activera à la volée quand il sera nécessaire par le code dans vos projets.

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 On Demand où vous pouvez désactiver Xdebug pour votre installation PHP globale, et PhpStorm ne l'activera que lorsque cela sera nécessaire - lorsque vous déboguez vos scripts ou lorsque vous avez besoin de rapports de couverture de code.

Vous devez modifier vos préférences d'interpréteurs PHP pour inclure le chemin vers XDebug, comme décrit dans l'article lié.

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

Cependant, XDebug a d'autres utilisations potentielles lorsque vous êtes "hors ligne", par exemple les vidages de pile étendus dans les journaux d'erreurs, que vous perdriez en le désactivant globalement. Bien sûr, vous ne devriez pas avoir XDebug activé en production, donc cela serait limité aux cas d'utilisation tels que les tests bêta ou les scripts CLI de test automatisés en développement.

scipilote
la source
5

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

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

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

Il est facile d'utiliser ceci dans un script ou une tâche de construction:

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 faisant 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 un seul 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.

KHobbits
la source
J'utiliserais des liens symboliques au lieu de simplement copier des fichiers ini.
greg0ire
1
J'ai évité d'utiliser des liens symboliques car cela donne l'impression que les dossiers sont synchronisés, tandis que les nouveaux modules ne seraient pas automatiquement inclus dans le dossier «noxdebug».
KHobbits
4

J'ai proposé une solution pour le programme d'installation de Composer basé sur Windows - cela devrait fonctionner pour toute installation de Composer, il fait simplement une copie du fichier INI chargé et commente l'extension xdebug zend, puis charge ce fichier de configuration lorsqu'il exécute composer composer .

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

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

Vous pouvez y trouver mes instructions et mon code.

mindplay.dk
la source
Simple et efficace :) Devez-vous appliquer à nouveau cela après avoir mis à jour le compositeur via l'auto-mise à jour?
marcovtwout
4

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

La documentation de Composer a été mise à jour pour noter cela . Il détaille comment activer xdebug avec Composer (si nécessaire).

Vous pouvez mettre à jour votre version de Composer en utilisant la mise à jour automatique .

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 numéro .

Thomas Clowes
la source
C'est génial! Savez-vous où se situe le PR pour ce changement? J'en ai besoin dans une autre application CLI
Tomáš Votruba
3

Manipulation directe de la configuration PHP

Voici ma contribution basée sur un Homebrew installation PHP installée par sur Mac OS X.

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

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 par args à la commande (ligne 3)
  • utilise sed pour restaurer le fichier de configuration, réactivant Xdebug (ligne 4)

Le script est couplé à une installation OS X / Homebrew de PHP 5.5. Les chemins doivent être ajustés pour fonctionner avec d'autres versions de PHP et les dispositions 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 après l' -ioption.

Utilitaire d'avertissement

Le script est simple, en ce sens qu'il fonctionne directement sur les principaux fichiers de configuration PHP, cependant c'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, c'est un compromis acceptable, étant donné que Composer est exécuté manuellement et seulement 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é.

j13k
la source
Je ne suis pas sûr que cela changerait la façon dont les erreurs sont gérées par Composer - avez-vous un exemple ou une préoccupation spécifique? Le script est conçu comme une solution rapide au problème et n'a pas été testé en profondeur. Cela dit, depuis que je l'utilise, cela a fonctionné sans aucun problème.
j13k
1
Je crains que la dernière ligne du script ne soit pas exécutée.
greg0ire
2

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 rendez php-cli.ini et conf-cli.d près de la sortie du fichier php.ini, vous pouvez configurer cli et cgi différemment (pour cgi, ce serait php.ini et conf.d ). Ne mettez simplement pas xdebug.ini dans conf-cli.d.

Vazgen Manukyan
la source
2

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

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

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, exécutez toutes les commandes du compositeur 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
  • nécessitera l'ajout de futures versions de PHP.
  • pendant qu'il exécute d'autres processus PHP sont affectés

Pas élégant, mais simple.

scipilote
la source
Je pense qu'il y a un raccourci que vous pouvez utiliser à la place de $1…$7… peut-être que c'est $@ou quelque chose comme ça, vous devrez regarder.
greg0ire
> si vous le tuez à mi-chemin, les fichiers INI sont modifiés, vous corrigez le fait qu'en piégeant le signal de suppression> il faudra ajouter de futures versions de PHP. vous pouvez également résoudre ce problème avec une simple boucle
greg0ire
1

Création d'un alias pour composer pour désactiver xdebug et é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.

Matthias Schobner
la source
-3

Voici ma solution rapide pour supprimer l'avertissement Xdebug sur la version PHP5-cli. J'ai supprimé le support de Xdebug pour PHP5-cli sur Ubuntu 14.04.

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

sudo rm 20-xdebug.ini

Désormais, plus d'avertissement Xdebug sur PHP5-cli.

milin mestry
la source
2
sudo phpdismod xdebugserait la méthode préférée à la bruterm
Jeff Puckett