Risposte:
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 $@
bin/bash
piuttosto che /bin/sh
, poiché a quest'ultimo non piaceva la function
parola chiave (Ubuntu 14.04 LTS).
composer self-update
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
alias xdebug-on='sudo php5enmod -s cli xdebug'
e alias xdebug-off='sudo php5dismod -s cli xdebug'
, quindi ora è facile abilitare xdebug-on
e disabilitare xdebug-off
xdebug.
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
-n
dirà a PHP di ignorare qualsiasi php.ini. Ciò impedirà a xdebug di caricare proprio questo comando.
-d
options ti permette di aggiungere qualsiasi opzione tu voglia (ad esempio, attivare needed_ext.so). Puoi utilizzare più -d
opzioni. 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
-n
ieri e ho avuto un problema perché mi mancava l' phar
estensione. 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.
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…
php -m
diagnose
, e dato che sto costruendo container Docker di sviluppo per il mio team, il più piccolo miglioramento della velocità potrebbe avvantaggiarli tutti
Creando un alias sopprimerai quel composer
xdebug
messaggio di errore.
Basta aggiungere questa linea al tuo ~/.bash_aliases
all'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 .bashrc
posto 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"
-n
opzione disabilita l' Phar
estensione, quindi potrebbe non essere eseguita dacomposer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
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"
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.phar
e composer.json
e lo eseguo come ./bin/composer
nella 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 -d
opzioni disabilitano efficacemente xdebug. La COMPOSER_DISABLE_XDEBUG_WARN=1
parte 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
COMPOSER_DISABLE_XDEBUG_WARN=1
: se ricevi un avviso, significa solo che il tuo scrit non funziona. La definizione xdebug.remote_autostart
sembra inutile se il debug remoto è disabilitato.
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 ...
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.
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.
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.
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ì.
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 .
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
Lo script wrapper:
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' -i
opzione.
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.
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.
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}')"
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:
Non elegante, ma semplice.
$1…$7
... forse è $@
o qualcosa del genere, dovrai guardare.
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.
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.
sudo phpdismod xdebug
sarebbe il metodo preferito per il brutorm