Antworten:
Update : Das Problem wurde in Composer 1.3 behoben . Aktualisieren Sie den Composer durch Ausführen auf die neueste Version composer self-update
, anstatt die folgende Problemumgehung zu versuchen.
Hier ist meine Änderung des Codes von @ ezzatron. Ich habe das Skript aktualisiert, um INI-Dateien aus der phpinfo-Ausgabe zu erkennen.
#!/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
eher anpassen als /bin/sh
, da letzterer das function
Schlüsselwort (Ubuntu 14.04 LTS) nicht mochte .
composer self-update
Dieser Befehl deaktiviert das PHP5 Xdebug-Modul für CLI (und damit Composer):
sudo php5dismod -s cli xdebug
Es entfernt den xdebug.ini- Symlink von/etc/php5/cli/conf.d/
Dies wurde auf http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/ vorgeschlagen.
Beachten Sie, dass Sie Ubuntu 16.04 wahrscheinlich folgendermaßen ausführen müssen:
sudo phpdismod -s cli xdebug
alias xdebug-on='sudo php5enmod -s cli xdebug'
und alias xdebug-off='sudo php5dismod -s cli xdebug'
, so ist es jetzt einfach xdebug-on
, xdebug-off
xdebug zu aktivieren und zu deaktivieren .
Ich glaube nicht, dass es eine Option gibt, PHP so zu konfigurieren, dass es je nach Zielskript unterschiedliche Konfigurationen laden kann. Zumindest nicht ohne Duplizieren von INI-Dateien ...
Sie können diese Optionen jedoch hinzufügen, wenn Sie Composer mit PHP ausführen:
php -n -d extension=needed_ext.so composer.phar
-n
wird PHP anweisen, jede php.ini zu ignorieren. Dadurch wird verhindert, dass xdebug für genau diesen Befehl geladen wird.
-d
Mit options können Sie jede gewünschte Option hinzufügen (aktivieren Sie beispielsweise required_ext.so). Sie können mehrere -d
Optionen verwenden. Dies ist natürlich optional, Sie benötigen es möglicherweise nicht.
Dann können Sie einen Alias erstellen, um ihn wieder zuckerhaltig zu machen.
Eine typische Lösung (weil der Komponist json braucht):
php -n -d extension=json.so composer.phar
greg0ire> meine lösung, basierend darauf:
#!/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
Es sieht hässlich aus (ich habe versucht und es mit xargs nicht geschafft), funktioniert aber ... Ich musste einige Erweiterungen deaktivieren, sonst erhalte ich die folgenden Warnungen:
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
gestern versucht und hatte ein Problem, weil mir die phar
Erweiterung fehlte . Ich werde versuchen, immer mehr Erweiterungen hinzuzufügen, bis es funktioniert. Ich denke, das ist eine gute Lösung. Gemäß dem Alias habe ich bereits einige zsh-Aliase, die ich nicht pflege. Vielleicht werde ich versuchen, die Binärdatei durch ein Bash-Skript zu ersetzen oder zu sehen, ob ich die Aliase konfigurieren kann.
composer.json
Benutzer in ihrer Whitelist benötigen , z. B. "ext-ldap": "*", oder einfach abhängig davon, was erforderlich ist, damit die Aufgaben nach der Installation ordnungsgemäß ausgeführt werden … Wenn es nur eine Möglichkeit gäbe, eine Erweiterung auf die schwarze Liste zu setzen…
php -m
diagnose
, und da ich Entwicklungs-Docker-Container für mein Team
Durch das Erstellen eines Alias unterdrücken Sie diese composer
xdebug
Fehlermeldung.
Fügen Sie diese Zeile einfach zu Ihrem ~/.bash_aliases
System hinzu und sie sollte einwandfrei funktionieren.
alias composer="php -n /usr/local/bin/composer"
Laden Sie die Shell neu, um den neuen Alias composer
verfügbar zu machen .
source ~/.bash_profile
VERWENDUNG:
$ composer --version
HINWEIS:
Sie müssen nicht unbedingt einen anderen Parameter verwenden.
Abhängig von Ihrem System haben Sie möglicherweise eine .bashrc
anstelle von .bash_profile
.
AKTUALISIEREN:
Wie @AlexanderKachkaev in den Kommentaren erwähnt, ist es nichts wert, das memory_limit wie folgt hinzuzufügen, um Abstürze in einigen Situationen zu vermeiden:
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
-n
Option deaktiviert die Phar
Erweiterung, so dass sie möglicherweise nicht voncomposer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Ich habe eine Antwort gefunden, die für OSX ziemlich gut funktioniert und wahrscheinlich für jede PHP-Version angepasst werden kann, die ihre Erweiterungen mithilfe einzelner INI-Dateien im "zusätzlichen Verzeichnis" lädt:
#!/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"
Normalerweise erstelle ich ein Shell-Skript pro Projekt, da jedes Projekt eine andere PHP-Version hat. Es befindet sich in einem /bin/
Verzeichnis neben composer.phar
und composer.json
und ich führe es wie ./bin/composer
in meinem Projektverzeichnis aus.
Es sieht so aus (für 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 "$@"
Die -d
Optionen deaktivieren xdebug effektiv. Der COMPOSER_DISABLE_XDEBUG_WARN=1
Teil deaktiviert die Probleme mit dem Warnkomponisten.
Das Deaktivieren der xdebug-Erweiterung wird bevorzugt (siehe Composer-Fehlerbehebung ), aber ich persönlich mag das einfachere Skript.
Einige Timings auf meinem Computer: 2 Mit xdebug ausführen und ini-fähig: 1m33
Mit xdebug ausführen, aber ini-deaktiviert: 0m19
Laufen Sie ohne xdebug: 0m10
COMPOSER_DISABLE_XDEBUG_WARN=1
: Wenn Sie eine Warnung erhalten, bedeutet dies nur, dass Ihr Skript nicht funktioniert. Das Definieren xdebug.remote_autostart
scheint nutzlos, wenn das Remote-Debugging deaktiviert ist.
xdebug.remote_autostart
. Informationen zur Wirksamkeit von Skripten: Composer prüft, ob die xdebug-Erweiterung geladen ist, und nicht, ob tatsächlich etwas unternommen wird. Sehen Sie sich den Code hier an . Die INI-Optionen funktionieren gut in "normalen" PHP-Skripten, aber noch einmal: Ich habe keine Leistungstests durchgeführt ...
Wenn Sie PHPStorm verwenden, enthält die neueste Version (2016.2) eine Funktion zum Aktivieren von XDebug für CLI-Skripten bei Bedarf. Dies bedeutet, dass Sie XDebug einfach global auf Ihrem Entwicklungscomputer deaktivieren können. Die IDE aktiviert es im laufenden Betrieb, wenn es von Code in Ihren Projekten benötigt wird.
PhpStorm 2016.2 führt den Xdebug On Demand-Modus ein, in dem Sie Xdebug für Ihre globale PHP-Installation deaktivieren können. PhpStorm aktiviert es nur dann, wenn dies erforderlich ist - beim Debuggen Ihrer Skripte oder wenn Sie Berichte zur Codeabdeckung benötigen.
Sie müssen die Einstellungen Ihrer PHP-Interpreter bearbeiten, um den Pfad zu XDebug einzuschließen, wie im verlinkten Artikel beschrieben.
Für mich scheint dies die perfekte Lösung zu sein, da ich normalerweise nur XDebug möchte, während ich in der IDE bin.
XDebug hat jedoch andere Verwendungsmöglichkeiten, wenn Sie "offline" sind, z. B. erweiterte Stack-Dumps in Fehlerprotokollen, die Sie verlieren würden, wenn Sie es global deaktivieren. Natürlich sollte XDebug in der Produktion nicht aktiviert sein, daher ist dies auf Anwendungsfälle wie Betatests oder automatisierte Tests von CLI-Skripten in der Entwicklung beschränkt.
Anstatt das PHP-Modul vorübergehend zu aktivieren oder zu deaktivieren, können Sie PHP anweisen, auf ein anderes Modulladeverzeichnis zu verweisen, wenn Sie möglicherweise gleichzeitig Prozesse mit PHP verwenden (z. B. als Teil einer CI-Pipeline).
Dies ähnelt zwar einigen der oben genannten Lösungen, löst jedoch einige Randfälle, was sehr nützlich ist, wenn es von Jenkins oder einem anderen CI-Läufer verwendet wird, der gleichzeitig Tests auf demselben Computer ausführt.
Der einfachste Weg, dies zu tun, ist die Verwendung der Umgebungsvariablen PHP_INI_SCAN_DIR
Die Verwendung in einem Skript oder einer Build-Aufgabe ist einfach:
export PHP_INI_SCAN_DIR=/etc/php.d.noxdebug
php composer install
Natürlich möchten Sie zuerst /etc/php.d.noxdebug vorbereiten und dabei Folgendes tun:
mkdir /etc/php.d.noxdebug
cp /etc/php.d/* /etc/php.d.noxdebug
rm /etc/php.d.noxdebug/xdebug.ini
Dies bedeutet, dass Sie eine ähnliche Umgebung wie die alte PHP-Umgebung haben und nur ein Modul fehlt. Das heißt, Sie müssen sich keine Sorgen machen, dass Sie die phar / json-Module wie bei der php-n-Lösung laden müssen.
Ich habe eine Lösung für das Windows-basierte Composer-Installationsprogramm entwickelt. Sie sollte für jede Composer-Installation funktionieren. Sie erstellt lediglich eine Kopie der geladenen INI-Datei, kommentiert die Erweiterung xdebug zend aus und lädt diese Konfigurationsdatei, wenn Composer ausgeführt wird .
Ich habe eine Ausgabe geöffnet, um zu sehen, ob sie diese Änderung integrieren möchten:
https://github.com/composer/windows-setup/issues/58
Dort finden Sie meine Anweisungen und meinen Code.
Wie in der Antwort von Joyce erwähnt , ist dieses Problem in der neuesten Version von Composer nicht mehr vorhanden.
Die Composer-Dokumentation wurde aktualisiert, um dies zu beachten . Hier erfahren Sie, wie Sie xdebug mit Composer aktivieren können (falls erforderlich).
Sie können Ihre Composer-Version mithilfe der Selbstaktualisierung aktualisieren .
Auf meinem Mac musste ich Folgendes tun: sudo php /opt/local/bin/composer self-update
Weitere Details dazu im Rahmen einer Homebrew PHP-Installation finden Sie in dieser Ausgabe .
Hier ist mein Beitrag basierend auf einer von Homebrew installierten PHP-Installation unter Mac OS X.
Es handelt sich um einen Shell-Script-Wrapper, der als ausführbare Datei unter gespeichert werden kann /usr/local/bin/composer
, wobei die Composer-Binärdatei unter /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
Das Wrapper-Skript:
Das Skript ist an eine OS X / Homebrew-Installation von PHP 5.5 gekoppelt. Die Pfade sollten so angepasst werden, dass sie mit anderen PHP-Versionen und Verzeichnislayouts anderer Betriebssysteme und Paketmanager funktionieren. Beachten Sie auch, dass einige Versionen von sed das Argument der leeren Zeichenfolge nach der -i
Option nicht benötigen .
Das Skript ist sehr einfach, indem sich direkt auf den wichtigsten PHP - Konfigurationsdateien arbeiten, jedoch ist dies auch ein Nachteil: Xdebug auch für alle Skripts deaktiviert werden , die gleichzeitig mit diesem Skript ausgeführt werden passieren.
In meiner Entwicklungsumgebung ist dies ein akzeptabler Kompromiss, da Composer manuell und nur gelegentlich ausgeführt wird. Möglicherweise möchten Sie diese Technik jedoch nicht verwenden, wenn Sie Composer als Teil eines automatisierten Bereitstellungsprozesses ausführen.
In den meisten Fällen benötigen Sie xdebug im CLI-Modus nicht. Wenn dies für Sie akzeptabel ist, können Sie cli und cgi unterschiedlich konfigurieren.
Wenn Sie also php-cli.ini und conf-cli.d in die Nähe des Beendens der Datei php.ini bringen, können Sie cli und cgi unterschiedlich konfigurieren (für cgi wären es php.ini und conf.d ). Fügen Sie xdebug.ini einfach nicht in conf-cli.d ein.
Wenn Sie Composer mit Brew unter OS X installieren, können Sie diesen Alias verwenden:
alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')"
Meine schnelle Lösung für eine Macports-Installation mit mehreren PHP-Versionen bestand darin, diesen einfachen Shell-Wrapper für Composer zu schreiben:
/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
Führen Sie dann alle Composer-Befehle wie folgt aus:
sudo composer-nodebug.sh update
Nachteile:
Nicht elegant, aber einfach.
$1…$7
... vielleicht ist es $@
oder so, Sie müssen schauen.
Erstellen eines Alias für Composer zum Deaktivieren von xdebug und zum Verhindern von Speicherfehlern:
Fügen Sie diese Zeile Ihrem ~ / .bash_profile hinzu
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
Starten Sie das Terminal neu, um den neuen Alias verfügbar zu machen.
Hier ist meine schnelle Lösung, um die Xdebug-Warnung in der PHP5-cli-Version zu entfernen. Ich habe die Unterstützung von Xdebug für PHP5-cli unter Ubuntu 14.04 entfernt.
cd /etc/php5/cli/conf.d/
sudo rm 20-xdebug.ini
Jetzt keine Xdebug-Warnung mehr auf PHP5-cli.
sudo phpdismod xdebug
wäre die bevorzugte Methode zu brutalrm