Disabilitare xdebug durante l'esecuzione di composer


98

Durante l'esecuzione composer diagnose, ottengo il seguente errore:

L'estensione xdebug è caricata, questo può rallentare un po 'Composer. Si consiglia di disabilitarlo quando si utilizza Composer.

Come posso disabilitare xdebug solo quando sto eseguendo Composer?

Risposte:


81

Aggiornamento : il problema è stato risolto in Composer 1.3 . Aggiorna il compositore alla versione più recente eseguendo composer self-update, invece di provare la seguente soluzione alternativa.


Ecco la mia modifica del codice di @ ezzatron. Ho aggiornato lo script per rilevare i file ini dall'output di 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
Questa è di gran lunga la soluzione più elegante al problema, IMHO. Grazie Joyce!
Thomas Hansen

2
Migliore. Script. Ever
Maciej Paprocki

1
Ho dovuto regolare lo shebang su bin/bashpiuttosto che /bin/sh, poiché a quest'ultimo non piaceva la functionparola chiave (Ubuntu 14.04 LTS).
ashnazg

Ho aggiornato il codice e rimosso la parola chiave function, per una migliore compatibilità.
Joyce Babu

1
Puoi confermare che stai eseguendo l'ultima versione eseguendocomposer self-update
Joyce Babu

77

Questo comando disabiliterà il modulo Xdebug PHP5 per la CLI (e quindi il compositore):

sudo php5dismod -s cli xdebug

Rimuove il collegamento simbolico xdebug.ini da/etc/php5/cli/conf.d/

Questo è stato suggerito su http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

Nota che per Ubuntu 16.04 probabilmente dovrai eseguirlo in questo modo:

sudo phpdismod -s cli xdebug

4
Ho aggiunto i due alias alias xdebug-on='sudo php5enmod -s cli xdebug'e alias xdebug-off='sudo php5dismod -s cli xdebug', quindi ora è facile abilitare xdebug-one disabilitare xdebug-offxdebug.
Daniel Mecke,

Non portatile. Probabilmente solo Linux.
Diti

Funziona alla grande sulla scatola Laravel Homestead (Ubuntu / Debian). Una descrizione più lunga di come funziona: laracasts.com/discuss/channels/forge/disable-xdebug
Justin

2
grazie per questo :) ma ho Ubuntu 16.04 e se qualcuno avrà bisogno di usarlo basta eseguire sudo phpdismod -s cli xdebug
Angel M.

Che ne dici di php7 in Ubuntu? Devo solo rimuovere il collegamento simbolico? /etc/php/7.0/cli/conf.d
gastonnina

40

Non credo che ci sia un'opzione per configurare PHP in modo che possa caricare diverse configurazioni in base allo script mirato. Almeno, non senza duplicare i file .ini ...

Tuttavia, puoi aggiungere queste opzioni quando esegui Composer con php:

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

-ndirà a PHP di ignorare qualsiasi php.ini. Ciò impedirà a xdebug di caricare proprio questo comando.

-doptions ti permette di aggiungere qualsiasi opzione tu voglia (ad esempio, attivare needed_ext.so). Puoi utilizzare più -dopzioni. Ovviamente questo è opzionale, potresti non averne bisogno.

Quindi puoi creare un alias, per renderlo di nuovo zuccherino.

Una soluzione tipica (perché il compositore ha bisogno di json):

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

greg0ire> la mia soluzione, basata su questo:

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

Sembra brutto (ho provato e non ci sono riuscito con xargs), ma funziona ... ho dovuto disabilitare alcune estensioni, altrimenti ricevo i seguenti avvertimenti:

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

Ho provato -nieri e ho avuto un problema perché mi mancava l' pharestensione. Proverò ad aggiungere sempre più estensioni finché non funziona, penso che questa sia una buona soluzione. Come per l'alias, ho già alcuni alias zsh che non mantengo. Forse proverò a sostituire il binario con uno script bash, o vedrò se riesco a configurare gli alias.
greg0ire

Il problema con questo approccio alla whitelist, tuttavia, è che la whitelist potrebbe aumentare a seconda di ciò che le persone richiedono nel loro composer.json, ad esempio "ext-ldap": "*", o semplicemente a seconda di ciò che è necessario per far funzionare correttamente le attività di post installazione … Se solo ci fosse un modo per inserire un'estensione nella lista nera…
greg0ire

1
Proverò a fare qualcosa con l'output diphp -m
greg0ire

Mi viene in mente, ma presumo che tu usi xdebug in un ambiente di sviluppo. Il compositore è così lento da aver bisogno di questo aggiustamento?
Gui-Don,

Oh no, l'ho appena visto dall'output di diagnose, e dato che sto costruendo container Docker di sviluppo per il mio team, il più piccolo miglioramento della velocità potrebbe avvantaggiarli tutti
greg0ire

14

Creando un alias sopprimerai quel composer xdebugmessaggio di errore.

Basta aggiungere questa linea al tuo ~/.bash_aliasesall'interno del tuo sistema e dovrebbe funzionare perfettamente.

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

Ricarica la shell per rendere disponibile il nuovo alias composer.

source ~/.bash_profile

UTILIZZO:

$ composer --version

NOTA:
non è necessario utilizzare necessariamente altri parametri.
A seconda del sistema si potrebbe avere un .bashrcposto di .bash_profile.

AGGIORNARE:

Come menzionato da @AlexanderKachkaev nei commenti, non vale la pena aggiungere memory_limit come segue per evitare il crash in alcune situazioni:

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

3
Questo non funzionerà molto bene non appena una delle estensioni è necessaria negli script di post installazione o post aggiornamento ... potrebbe essere una buona soluzione su progetti semplici però.
greg0ire

1
L' -nopzione disabilita l' Pharestensione, quindi potrebbe non essere eseguita dacomposer.phar
brzuchal

1
Questo ha funzionato per me. Inoltre, ho disabilitato il limite di memoria per evitare crash:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Alexander Kachkaev

Questa soluzione è piuttosto semplice e praticabile per la mia situazione. Il suggerimento sul limite di memoria di @AlexanderKachkaev è un must. Sii bravo a modificare la risposta.
Henry

12

Ho trovato una risposta che funziona abbastanza bene per OSX e potrebbe probabilmente essere adattata per qualsiasi versione PHP che carica le sue estensioni utilizzando singoli file .ini nella "directory ini aggiuntiva":

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

Grande! Ho creato uno script generico basato su questo per Ubuntu 14.04-15.10 gist.github.com/perk11/816c4e64023ea26976cf
Konstantin Pereiaslov

Fantastico, funziona bene su Mac OS, su brew installato php 7.1. TY!
Antonio Carlos Ribeiro

7

Di solito creo uno script di shell per progetto, poiché ogni progetto ha un'altra versione di PHP. È in una /bin/directory accanto a composer.phare composer.jsone lo eseguo come ./bin/composernella directory del mio progetto.

Sembra questo (per 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 "$@"

Le -dopzioni disabilitano efficacemente xdebug. La COMPOSER_DISABLE_XDEBUG_WARN=1parte disabilita i problemi del compositore di avviso.

È preferibile disabilitare l'estensione xdebug (vedere risoluzione dei problemi del compositore ), ma personalmente mi piace lo script più semplice.

Alcuni tempi sulla mia macchina: 2 Esegui con xdebug e ini-enabled: 1m33

Esegui con xdebug ma disabilitato ini: 0m19

Esegui senza xdebug: 0m10


Penso che dal momento che stai disabilitando XDebug, non hai bisogno di COMPOSER_DISABLE_XDEBUG_WARN=1: se ricevi un avviso, significa solo che il tuo scrit non funziona. La definizione xdebug.remote_autostartsembra inutile se il debug remoto è disabilitato.
greg0ire

Hai ragione xdebug.remote_autostart. Informazioni sull'efficacia degli script: Composer controlla se l'estensione xdebug è caricata, non se sta effettivamente facendo qualcosa, guarda il codice qui . Le opzioni ini funzionano bene negli script php "normali" ma ancora: non ho eseguito test delle prestazioni ...
Joost

(Finalmente) ho trovato la parte pertinente nel manuale del compositore su questa risoluzione dei problemi: xdebug impact on composer . Spiega che disabilitare tutte le opzioni di xdebug tramite i flag ini non è sufficiente per mitigare i problemi di prestazioni. Quindi il mio script non funzionerà. Peccato!
Joost

Ho fatto un po 'di tempismo (su Mac OS X) e devo dire che sono abbastanza soddisfatto dei miglioramenti delle prestazioni usando il mio script! Con le opzioni xdebug abilitate ci vuole 1m33 , con le opzioni disabilitate ci vuole 0m19 . Senza l'estensione xdebug ci vogliono 0m10 .
Joost

Ok quindi c'è comunque un miglioramento. Non il miglior miglioramento disponibile, ma comunque un enorme miglioramento (almeno su OS X)
greg0ire

6

Se utilizzi PHPStorm, l'ultima versione (2016.2) include una funzionalità per abilitare XDebug per gli script CLI on-demand, il che significa che puoi semplicemente disattivare XDebug a livello globale sulla tua macchina di sviluppo. L'IDE lo abiliterà al volo quando è richiesto dal codice all'interno dei tuoi progetti.

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

PhpStorm 2016.2 introduce la modalità Xdebug On Demand in cui è possibile disabilitare Xdebug per l'installazione PHP globale e PhpStorm lo abiliterà solo quando necessario, quando si esegue il debug degli script o quando sono necessari rapporti sulla copertura del codice.

È necessario modificare le preferenze degli interpreti PHP per includere il percorso di XDebug, come descritto nell'articolo collegato.

A me questa sembra la soluzione perfetta, dato che di solito voglio XDebug solo mentre sono nell'IDE.

Tuttavia XDebug ha altri potenziali usi quando sei "offline", ad es. Stack dump estesi nei log degli errori, che potresti perdere disattivandolo globalmente. Ovviamente non dovresti avere XDebug abilitato in produzione, quindi questo sarebbe limitato a casi d'uso come il beta-test o il test automatico degli script CLI in fase di sviluppo.


5

Piuttosto che confondere con l'attivazione o la disattivazione temporanea del modulo PHP, quando potresti avere processi simultanei che utilizzano PHP (ad esempio come parte di una pipeline CI), puoi dire a PHP di puntare a una directory di caricamento del modulo diversa.

Sebbene sia simile ad alcune delle soluzioni sopra menzionate, risolve alcuni casi limite, il che è molto utile quando viene utilizzato da Jenkins o da un altro runner CI che esegue i test contemporaneamente sulla stessa macchina.

Il modo più semplice per farlo è usare la variabile d'ambiente PHP_INI_SCAN_DIR

Usarlo in uno script o in un'attività di compilazione è facile:

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

Ovviamente dovresti prima preparare /etc/php.d.noxdebug, facendo qualcosa come:

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

Ciò significa che hai un ambiente simile al vecchio ambiente php, con un solo modulo mancante. Significa che non devi preoccuparti di dover caricare i moduli phar / json come faresti con la soluzione php -n.


Userei collegamenti simbolici invece di copiare solo i file ini.
greg0ire

1
Ho evitato di usare i collegamenti simbolici perché dà l'impressione che le cartelle siano sincronizzate, mentre i nuovi moduli non sarebbero inclusi automaticamente nella cartella "noxdebug".
KHobits,

4

Ho trovato una soluzione per il programma di installazione di Composer basato su Windows: dovrebbe funzionare per qualsiasi installazione di Composer, fondamentalmente fa solo una copia del file INI caricato e commenta l'estensione xdebug zend, quindi carica quel file di configurazione quando esegue Composer .

Ho aperto un problema per vedere se vorrebbero integrare questa modifica:

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

Puoi trovare le mie istruzioni e il codice lì.


Semplice ed efficace :) Devi riapplicarlo dopo aver aggiornato il compositore tramite aggiornamento automatico?
marcovtwout

4

Come notato nella risposta di Joyce , questo problema non esiste più nell'ultima versione di Composer.

La documentazione di Composer è stata aggiornata per tenerne conto . Descrive in dettaglio come abilitare xdebug con Composer (se richiesto).

Puoi aggiornare la tua versione di Composer utilizzando l'aggiornamento automatico .

Sul mio Mac dovevo fare: sudo php /opt/local/bin/composer self-update

Ulteriori dettagli su questo nel contesto di un'installazione PHP Homebrew possono essere trovati in questo numero .


È fantastico! Sai dove si trova il PR di questo cambiamento? Ne ho bisogno in un'altra app CLI
Tomáš Votruba

3

Manipolazione diretta della configurazione PHP

Ecco il mio contributo basato su un'installazione PHP installata da Homebrew su Mac OS X.

È un wrapper di script di shell, progettato per essere salvato come file eseguibile in /usr/local/bin/composer, con il binario di Composer in /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

Teoria di funzionamento

Lo script wrapper:

  • usa sed per modificare temporaneamente il file di configurazione, disabilitando Xdebug (riga 2)
  • esegue Composer, passando attraverso args al comando (riga 3)
  • usa sed per ripristinare il file di configurazione, riabilitando Xdebug (riga 4)

Lo script è accoppiato a un'installazione OS X / Homebrew di PHP 5.5. I percorsi dovrebbero essere adattati per funzionare con altre versioni di PHP e altri sistemi operativi e layout di directory dei gestori di pacchetti. Si noti inoltre che alcune versioni di sed non è necessario l'argomento vuoto-stringa che segue l' -iopzione.

Utilità di avvertimento

Lo script è semplice, in quanto funziona direttamente sui file di configurazione PHP principali, tuttavia anche questo è uno svantaggio: Xdebug sarà disabilitato anche per tutti gli script che vengono eseguiti contemporaneamente a questo script.

Nel mio ambiente di sviluppo, questo è un compromesso accettabile, dato che Composer viene eseguito manualmente e solo occasionalmente; tuttavia potresti non voler utilizzare questa tecnica se esegui Composer come parte di un processo di distribuzione automatizzato.


Non sono sicuro che farebbe la differenza nel modo in cui gli errori vengono gestiti da Composer: hai un esempio specifico o un problema? Lo script è inteso come una soluzione rapida al problema e non è stato completamente testato in battaglia. Detto questo, nel tempo che l'ho usato, ha funzionato senza problemi.
j13k

1
La mia preoccupazione è che l'ultima riga dello script potrebbe non essere eseguita.
greg0ire

2

Nella maggior parte dei casi non è necessario xdebug in modalità CLI. Se questo è accettabile per te, puoi configurare cli e cgi in modo diverso.

Quindi se crei php-cli.ini e conf-cli.d vicino al file php.ini in uscita, puoi configurare cli e cgi in modo diverso (per cgi sarebbe php.ini e conf.d ). Basta non mettere xdebug.ini in conf-cli.d.


2

Se installi il compositore usando brew su OS X puoi usare questo alias:

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

1

La mia soluzione rapida per un'installazione di macports, con più versioni di PHP è stata quella di scrivere questo semplice wrapper di shell per 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

Quindi esegui tutti i comandi del compositore in questo modo:

sudo composer-nodebug.sh update

Svantaggi:

  • richiede sudo (a meno che tu non modifichi i file INI)
  • se lo uccidi a metà, i file INI vengono modificati
  • richiederà l'aggiunta di versioni future di PHP.
  • mentre è in esecuzione altri processi PHP sono interessati

Non elegante, ma semplice.


Penso che ci sia una scorciatoia che puoi usare invece di $1…$7... forse è $@o qualcosa del genere, dovrai guardare.
greg0ire

> se lo uccidi a metà strada i file INI vengono modificati, correggi il problema che intercettando il segnale di kill> richiederà l'aggiunta di versioni future di PHP. puoi anche risolverlo con un semplice ciclo
greg0ire

1

Creazione di un alias per il compositore per disabilitare xdebug e prevenire errori di memoria:

Aggiungi questa riga al tuo ~ / .bash_profile

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

Riavvia il terminale per rendere disponibile il nuovo alias.


-3

Ecco la mia soluzione rapida per eliminare l'avviso di Xdebug sulla versione PHP5-cli. Ho rimosso il supporto di Xdebug per PHP5-cli su Ubuntu 14.04.

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

sudo rm 20-xdebug.ini

Ora niente più avvisi di Xdebug su PHP5-cli.


2
sudo phpdismod xdebugsarebbe il metodo preferito per il brutorm
Jeff Puckett
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.