Wyłączanie xdebug podczas uruchamiania programu Composer


98

Podczas uruchamiania composer diagnosepojawia się następujący błąd:

Wczytane jest rozszerzenie xdebug, co może nieco spowolnić program Composer. Zalecane jest wyłączenie go podczas korzystania z Composera.

Jak mogę wyłączyć xdebug tylko wtedy, gdy używam Composera?

Odpowiedzi:


81

Aktualizacja : problem został rozwiązany w Composer 1.3 . Zaktualizuj kompozytora do najnowszej wersji, wykonując composer self-update, zamiast wypróbować następujące obejście.


Oto moja modyfikacja kodu @ ezzatron. Zaktualizowałem skrypt, aby wykrywał pliki ini z wyjścia 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
To zdecydowanie najbardziej eleganckie rozwiązanie problemu, IMHO. Dzięki Joyce!
Thomas Hansen

2
Najlepsza. Scenariusz. Ever
Maciej Paprocki

1
Musiałem dostosować shebang bin/bashraczej niż /bin/sh, ponieważ temu drugiemu nie podobało się functionsłowo kluczowe (Ubuntu 14.04 LTS).
ashnazg

Zaktualizowałem kod i usunąłem słowo kluczowe function, aby zapewnić lepszą kompatybilność.
Joyce Babu

1
Możesz potwierdzić, że korzystasz z najnowszej wersji, uruchamiająccomposer self-update
Joyce Babu

77

To polecenie wyłączy moduł PHP5 Xdebug dla CLI (a tym samym kompozytor):

sudo php5dismod -s cli xdebug

Usuwa link symboliczny xdebug.ini z/etc/php5/cli/conf.d/

Zasugerowano na http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

Zauważ, że w przypadku Ubuntu 16.04 prawdopodobnie musisz go uruchomić w ten sposób:

sudo phpdismod -s cli xdebug

4
Dodałem dwa aliasy alias xdebug-on='sudo php5enmod -s cli xdebug'i alias xdebug-off='sudo php5dismod -s cli xdebug'tak jest teraz łatwo włączyć xdebug-oni wyłączyć xdebug-offxdebug.
Daniel Mecke

Nie przenośny. Prawdopodobnie tylko dla Linuksa.
Diti

Działa świetnie na pudełku Laravel Homestead (Ubuntu / Debian). Dłuższy opis tego, jak to działa: laracasts.com/discuss/channels/forge/disable-xdebug
Justin

2
dzięki za to :) ale mam ubuntu 16.04 i jak ktoś będzie musiał z tego skorzystać po prostu uruchom sudo phpdismod -s cli xdebug
Angel M.

A co z php7 w Ubuntu? Czy muszę tylko usunąć łącze symboliczne? /etc/php/7.0/cli/conf.d
gastonnina

40

Myślę, że nie ma opcji konfiguracji PHP, aby mógł ładować różne konfiguracje zgodnie z docelowym skryptem. Przynajmniej nie bez powielania plików .ini ...

Możesz jednak dodać te opcje podczas uruchamiania programu Composer z php:

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

-npowie PHP, aby ignorował wszelkie pliki php.ini. Zapobiegnie to załadowaniu xdebug dla tej samej komendy.

-doptions pozwala na dodanie dowolnej opcji (na przykład uaktywnij required_ext.so). Możesz użyć wielu -dopcji. Oczywiście jest to opcjonalne, możesz tego nie potrzebować.

Następnie możesz utworzyć alias, aby znów był słodki.

Typowe rozwiązanie (ponieważ kompozytor potrzebuje json):

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

greg0ire> moje rozwiązanie oparte na tym:

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

Wygląda brzydko (próbowałem i nie udało mi się tego zrobić z xargs), ale działa… Musiałem jednak wyłączyć niektóre rozszerzenia, w przeciwnym razie otrzymuję następujące ostrzeżenia:

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

Próbowałem -nwczoraj i miałem problem, ponieważ brakowało mi pharrozszerzenia. Postaram się dodawać coraz więcej rozszerzeń, aż zadziała, myślę, że to dobre rozwiązanie. Jeśli chodzi o alias, mam już kilka aliasów zsh, których nie utrzymuję. Może spróbuję zamienić plik binarny na skrypt bash lub zobaczę, czy mogę skonfigurować aliasy.
greg0ire

Problem z tym podejściem do białej listy polega jednak na tym, że biała lista może się rozrosnąć w zależności od tego, czego ludzie potrzebują w swoich composer.json, na przykład „ext-ldap”: „*”, lub po prostu w zależności od tego, co jest potrzebne, aby zadania po instalacji działały poprawnie … Gdyby tylko istniał sposób na umieszczenie rozszerzenia na czarnej liście…
greg0ire

1
Spróbuję coś zrobić z wyjściemphp -m
greg0ire

Przychodzi mi do głowy, ale zakładam, że używasz xdebug w środowisku programistycznym. Czy kompozytor jest tak powolny, że potrzebuje tej poprawki?
Gui-Don

O nie, właśnie widziałem to na podstawie danych wyjściowych diagnose, a ponieważ
buduję kontenery docker

14

Tworząc alias, pominiesz ten composer xdebugkomunikat o błędzie.

Po prostu dodaj tę linię do ~/.bash_aliasesswojego systemu i powinna działać bezbłędnie.

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

Załaduj ponownie powłokę, aby udostępnić nowy alias composer.

source ~/.bash_profile

STOSOWANIE:

$ composer --version

UWAGA:
Nie musisz koniecznie używać żadnego innego parametru.
W zależności od systemu możesz mieć .bashrczamiast .bash_profile.

AKTUALIZACJA:

Jak @AlexanderKachkaev wspomina w komentarzach, nie warto dodawać parametru memory_limit w następujący sposób, aby uniknąć awarii w niektórych sytuacjach:

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

3
Nie będzie to dobrze działać, gdy tylko jedno z rozszerzeń będzie potrzebne w skryptach po instalacji lub po aktualizacji… może być jednak dobrym rozwiązaniem w przypadku prostych projektów.
greg0ire

1
-nWyłącza opcja Pharprzedłużenia więc może nie działać zcomposer.phar
brzuchal

1
To zadziałało dla mnie. Ponadto wyłączyłem limit pamięci, aby uniknąć awarii:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Alexander Kachkaev

To rozwiązanie jest dość proste i wykonalne w mojej sytuacji. Sugestia limitu pamięci od @AlexanderKachkaev jest koniecznością. Dobrze jest edytować odpowiedź.
Henry

12

Wymyśliłem odpowiedź, która działa całkiem nieźle na OSX i prawdopodobnie mogłaby zostać dostosowana do dowolnej wersji PHP, która ładuje swoje rozszerzenia przy użyciu pojedynczych plików .ini w "dodatkowym katalogu ini":

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

Wspaniały! Na tej podstawie stworzyłem skrypt ogólnego przeznaczenia dla Ubuntu 14.04-15.10 gist.github.com/perk11/816c4e64023ea26976cf
Konstantin Pereiaslov

Fantastycznie, działa dobrze na Mac OS, na brew zainstalowanym php 7.1. TY!
Antonio Carlos Ribeiro

7

Zwykle tworzę skrypt powłoki na projekt, ponieważ każdy projekt ma inną wersję PHP. Jest w /bin/katalogu obok composer.phari composer.jsoni uruchomić go jak ./bin/composerw moim katalogu projektu.

Wygląda to tak (dla 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 "$@"

Te -dopcje skutecznie wyłączyć xdebug. Ta COMPOSER_DISABLE_XDEBUG_WARN=1część wyłącza ostrzeżenie o problemach z kompozytorem.

Preferowane jest wyłączenie rozszerzenia xdebug (zobacz rozwiązywanie problemów z kompozytorem ), ale osobiście podoba mi się prostszy skrypt.

Niektóre czasy na moim komputerze: 2 Uruchom z xdebug i włączoną obsługą ini: 1m33

Uruchom z xdebug, ale ini-wyłączone: 0m19

Uruchom bez xdebug: 0m10


Myślę, że skoro wyłączasz XDebug, nie potrzebujesz COMPOSER_DISABLE_XDEBUG_WARN=1: jeśli pojawi się ostrzeżenie, oznacza to po prostu, że twój scrit nie działa. Definiowanie xdebug.remote_autostartwydaje się bezużyteczne, jeśli zdalne debugowanie jest wyłączone.
greg0ire

Masz rację xdebug.remote_autostart. O skuteczności skryptów: Composer sprawdza, czy rozszerzenie xdebug jest załadowane, a nie, czy faktycznie coś robi, spójrz na kod tutaj . Opcje ini działają dobrze w "zwykłych" skryptach php, ale znowu: nie wykonałem żadnych testów wydajności ...
Joost

(Wreszcie) znalazł odpowiednią część w podręczniku kompozytora na temat tego rozwiązywania problemów: wpływ xdebug na kompozytora . Wyjaśnia, że ​​wyłączenie wszystkich opcji xdebug przez flagi ini nie wystarczy do złagodzenia problemów z wydajnością. Więc mój skrypt nie zadziała. Szkoda!
Joost

Zrobiłem trochę czasu (na Mac OS X) i muszę powiedzieć, że jestem bardzo zadowolony z ulepszeń wydajności przy użyciu mojego skryptu! Z XDebug opcje włączone trwa 1m33 z opcji wyłączona trwa 0m19 . Bez rozszerzenia xdebug zajmuje 0m10 .
Joost

Ok, więc i tak jest poprawa. Nie jest to najlepsza dostępna poprawa, ale mimo to ogromna poprawa (przynajmniej na OS X)
greg0ire

6

Jeśli używasz PHPStorm, najnowsza wersja (2016.2) zawiera funkcję włączania XDebug dla skryptów CLI na żądanie, co oznacza, że ​​możesz po prostu wyłączyć XDebug globalnie na swoim komputerze deweloperskim. IDE włączy go w locie, gdy będzie to wymagane przez kod wewnątrz twoich projektów.

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

PhpStorm 2016.2 wprowadza tryb Xdebug On Demand, w którym możesz wyłączyć Xdebug dla swojej globalnej instalacji PHP, a PhpStorm włączy go tylko wtedy, gdy będzie to konieczne - podczas debugowania skryptów lub gdy potrzebujesz raportów pokrycia kodu.

Musisz edytować preferencje interpreterów PHP, aby uwzględnić ścieżkę do XDebug, jak opisano w powiązanym artykule.

Wydaje mi się, że jest to idealne rozwiązanie, ponieważ zwykle chcę XDebug tylko wtedy, gdy jestem w IDE.

Jednak XDebug ma inne potencjalne zastosowania, gdy jesteś „offline”, np. Rozszerzone zrzuty stosu w dziennikach błędów, które można stracić, wyłączając go globalnie. Oczywiście nie powinieneś mieć włączonego XDebug w środowisku produkcyjnym, więc byłoby to ograniczone do przypadków użycia, takich jak testy beta lub automatyczne testowanie skryptów CLI w fazie rozwoju.


5

Zamiast mieszać się z tymczasowym włączaniem lub wyłączaniem modułu PHP, gdy możesz mieć współbieżne procesy korzystające z PHP (na przykład jako część potoku CI), możesz powiedzieć PHP, aby wskazał inny katalog ładowania modułu.

Chociaż jest to podobne do niektórych rozwiązań wymienionych powyżej, rozwiązuje to kilka przypadków skrajnych, co jest bardzo przydatne, gdy jest używane przez Jenkinsa lub innego uczestnika CI, który przeprowadza testy na tej samej maszynie jednocześnie.

Najłatwiej to zrobić, używając zmiennej środowiskowej PHP_INI_SCAN_DIR

Używanie tego w skrypcie lub zadaniu kompilacji jest łatwe:

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

Oczywiście najpierw chciałbyś przygotować /etc/php.d.noxdebug, robiąc coś takiego:

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

Oznacza to, że masz środowisko podobne do starego środowiska php, z brakującym tylko jednym modułem. Oznacza to, że nie musisz się martwić koniecznością ładowania modułów phar / json, tak jak w przypadku rozwiązania php -n.


Używałbym dowiązań symbolicznych zamiast po prostu kopiować pliki ini.
greg0ire

1
Powstrzymałem się od używania linków symbolicznych, ponieważ sprawia to wrażenie, że foldery są zsynchronizowane, podczas gdy nowe moduły nie byłyby automatycznie umieszczane w folderze „noxdebug”.
KHobbits,

4

Wymyśliłem rozwiązanie dla instalatora Composera opartego na systemie Windows - powinno działać dla każdej instalacji Composera, po prostu tworzy kopię załadowanego pliku INI i komentuje rozszerzenie zend xdebug, a następnie ładuje ten plik konfiguracyjny po uruchomieniu kompozytora .

Otworzyłem problem, aby sprawdzić, czy chcieliby zintegrować tę zmianę:

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

Znajdziesz tam moje instrukcje i kod.


Prosty i skuteczny :) Czy musisz zastosować to ponownie po zaktualizowaniu programu Composer przez samoaktualizację?
marcovtwout

4

Jak wspomniano w odpowiedzi Joyce'a , ten problem nie istnieje już w najnowszej wersji Composera.

Dokumentacja Composera została zaktualizowana, aby to uwzględnić . Zawiera szczegółowe informacje, jak włączyć xdebug z Composerem (jeśli jest to wymagane).

Możesz zaktualizować swoją wersję Composera, korzystając z automatycznej aktualizacji .

Na moim Macu musiałem zrobić: sudo php /opt/local/bin/composer self-update

Więcej szczegółów na ten temat w kontekście instalacji Homebrew PHP można znaleźć w tym numerze .


To wspaniale! Czy wiesz, gdzie jest PR tej zmiany? Potrzebuję tego w innej aplikacji CLI
Tomáš Votruba,

3

Bezpośrednia manipulacja konfiguracją PHP

Oto mój wkład oparty na instalacji PHP zainstalowanej przez Homebrew w systemie Mac OS X.

Jest to opakowanie skryptu powłoki, zaprojektowane do zapisywania jako plik wykonywalny w /usr/local/bin/composer, z binarnym Composer pod adresem /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 operacji

Skrypt opakowania:

  • używa seda do tymczasowej modyfikacji pliku konfiguracyjnego, wyłączając Xdebug (linia 2)
  • wykonuje Composer, przechodząc przez argumenty do polecenia (wiersz 3)
  • używa seda do przywrócenia pliku konfiguracyjnego, ponownie włączając Xdebug (linia 4)

Skrypt jest połączony z instalacją PHP 5.5 w systemie OS X / Homebrew. Ścieżki powinny być dostosowane do pracy z innymi wersjami PHP oraz układami katalogów innych systemów operacyjnych i menedżerów pakietów. Zauważ również, że niektóre wersje seda nie potrzebują argumentu pustego łańcucha po -iopcji.

Caveat Utilitor

Skrypt jest prosty, ponieważ działa bezpośrednio na głównych plikach konfiguracyjnych PHP, jednak jest to również wada: Xdebug zostanie również wyłączony dla wszystkich skryptów wykonywanych jednocześnie z tym skryptem.

W moim środowisku programistycznym jest to akceptowalny kompromis, biorąc pod uwagę, że Composer jest uruchamiany ręcznie i tylko sporadycznie; Jednak możesz nie chcieć używać tej techniki, jeśli uruchamiasz Composer jako część automatycznego procesu wdrażania.


Nie jestem pewien, czy miałoby to wpływ na sposób obsługi błędów przez Composera - czy masz konkretny przykład lub problem? Skrypt ma na celu szybkie rozwiązanie problemu i nie został dokładnie przetestowany w walce. Powiedziawszy to, w czasie, gdy go używałem, działał bez żadnych problemów.
j13k

1
Martwię się, że ostatnia linia skryptu może nie zostać uruchomiona.
greg0ire

2

W większości przypadków nie potrzebujesz xdebug w trybie CLI. Jeśli jest to dla ciebie do przyjęcia, możesz inaczej skonfigurować cli i cgi.

Więc jeśli utworzysz php-cli.ini i conf-cli.d w pobliżu wyjścia z pliku php.ini, możesz inaczej skonfigurować cli i cgi (dla cgi będą to php.ini i conf.d ). Po prostu nie umieszczaj xdebug.ini w pliku conf-cli.d.


2

Jeśli instalujesz narzędzie Composer za pomocą brew na OS X, możesz użyć tego aliasu:

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

1

Moim szybkim rozwiązaniem dla instalacji macports z wieloma wersjami PHP było napisanie tego prostego opakowania powłoki dla Composera:

/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

Następnie uruchom dowolne polecenia kompozytora, takie jak:

sudo composer-nodebug.sh update

Wady:

  • wymaga sudo (chyba że chmodujesz pliki INI)
  • jeśli zabijesz go w trakcie modyfikowania plików INI
  • będzie wymagać dodania przyszłych wersji PHP.
  • gdy działa, wpływa to na inne procesy PHP

Nie eleganckie, ale proste.


Myślę, że jest skrót, którego możesz użyć zamiast $1…$7… może to $@lub coś takiego, będziesz musiał spojrzeć.
greg0ire

> jeśli zabijesz go w trakcie modyfikowania plików INI, napraw to przez przechwytywanie sygnału zabicia> będzie wymagać dodania przyszłych wersji PHP. możesz to również naprawić za pomocą prostej pętli
greg0ire

1

Tworzenie aliasu dla kompozytora, aby wyłączyć xdebug i zapobiec błędom pamięci:

Dodaj tę linię do swojego ~ / .bash_profile

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

Uruchom ponownie terminal, aby udostępnić nowy alias.


-3

Oto moje szybkie rozwiązanie, aby pozbyć się ostrzeżenia Xdebug w wersji PHP5-cli. Usunąłem obsługę Xdebug dla PHP5-cli w systemie Ubuntu 14.04.

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

sudo rm 20-xdebug.ini

Koniec z ostrzeżeniem Xdebug w PHP5-cli.


2
sudo phpdismod xdebugbyłby preferowaną metodą brutalnościrm
Jeff Puckett
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.