Réponses:
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 $@
bin/bash
plutôt que /bin/sh
, car ce dernier n'aimait pas le function
mot - clé (Ubuntu 14.04 LTS).
composer self-update
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
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-on
et de désactiver xdebug-off
xdebug.
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 tout php.ini. Cela empêchera xdebug de se charger pour cette même commande.
-d
options vous permet d'ajouter n'importe quelle option que vous voulez (par exemple, activer required_ext.so). Vous pouvez utiliser plusieurs -d
options. 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
-n
hier et j'ai eu un problème car il me manquait l' phar
extension. 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.
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…
php -m
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
En créant un alias, vous supprimerez cela composer
xdebug
message d'erreur.
Ajoutez simplement cette ligne à votre ~/.bash_aliases
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 pourriez avoir un à la .bashrc
place 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"
-n
option désactive l' Phar
extension afin qu'elle ne puisse pas s'exécuter à partir decomposer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
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"
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.phar
et composer.json
et je l'exécute comme ./bin/composer
dans 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 -d
options désactivent efficacement xdebug. La COMPOSER_DISABLE_XDEBUG_WARN=1
piè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
COMPOSER_DISABLE_XDEBUG_WARN=1
: si vous recevez un avertissement, cela signifie simplement que votre scrit ne fonctionne pas. La définition xdebug.remote_autostart
semble inutile si le débogage à distance est désactivé.
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 ...
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.
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.
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.
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.
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 .
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
Le script wrapper:
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' -i
option.
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é.
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.
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}')"
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:
Pas élégant, mais simple.
$1…$7
… peut-être que c'est $@
ou quelque chose comme ça, vous devrez regarder.
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.
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.
sudo phpdismod xdebug
serait la méthode préférée à la bruterm