Composer'ı çalıştırırken xdebug'u devre dışı bırakma


98

Koşarken composer diagnoseşu hatayı alıyorum:

Xdebug uzantısı yüklendi, bu Composer'ı biraz yavaşlatabilir. Composer kullanırken devre dışı bırakılması önerilir.

Xdebug'u yalnızca Composer'ı çalıştırırken nasıl devre dışı bırakabilirim?

Yanıtlar:


81

Güncelleme : Sorun Composer 1.3'te düzeltildi . composer self-updateAşağıdaki geçici çözümü denemek yerine, uygulayarak besteciyi en son sürüme güncelleyin .


İşte @ ezzatron'un kodundaki değişikliğim. Phpinfo çıktısından ini dosyalarını tespit etmek için betiği güncelledim.

#!/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
IMHO, sorunun açık ara en zarif çözümü. Teşekkürler Joyce!
Thomas Hansen

2
En iyi. Senaryo. Ever
Maciej Paprocki

1
Anahtar kelimeyi beğenmediğinden, shebang'ı bin/bashyerine ayarlamak zorunda kaldım (Ubuntu 14.04 LTS). /bin/shfunction
ashnazg

Daha iyi uyumluluk için kodu güncelledim ve işlev anahtar sözcüğünü kaldırdım.
Joyce Babu

1
composer self-update
Joyce Babu

77

Bu komut, CLI (ve dolayısıyla composer) için PHP5 Xdebug modülünü devre dışı bırakacaktır:

sudo php5dismod -s cli xdebug

Bu kaldırır xdebug.ini gelen sembolik/etc/php5/cli/conf.d/

Bu, http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/ adresinde önerilmiştir.

Ubuntu 16.04 için muhtemelen şu şekilde çalıştırmanız gerektiğini unutmayın:

sudo phpdismod -s cli xdebug

4
Ben iki takma ad ekledik alias xdebug-on='sudo php5enmod -s cli xdebug've alias xdebug-off='sudo php5dismod -s cli xdebug'şimdi etkinleştirmek kolay olması için, xdebug-onve devre dışı bırakma xdebug-offxdebug.
Daniel Mecke

Taşınabilir değil. Muhtemelen yalnızca Linux için.
Diti

Laravel Homestead kutusunda (Ubuntu / Debian) harika çalışıyor. Nasıl bunu daha uzun bir açıklama çalışır: laracasts.com/discuss/channels/forge/disable-xdebug
justin

2
Bunun için teşekkürler :) ama ubuntu 16.04 var ve birisi bu kullanmanız gerekecektir eğer sadece koşmak Sudo phpdismod -s cli xdebug
Melek M.

Ubuntu'da php7'ye ne dersiniz? Yalnızca sembolik bağlantıyı kaldırmam mı gerekiyor? /etc/php/7.0/cli/conf.d
gastonnina

40

Hedeflenen betiğe göre farklı yapılandırmaları yükleyebilmesi için PHP'yi yapılandırma seçeneği olduğunu sanmıyorum. En azından .ini dosyalarını kopyalamadan ...

Ancak, composer'ı php ile çalıştırırken bu seçenekleri ekleyebilirsiniz:

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

-nPHP'ye php.ini'yi göz ardı etmesini söyleyecektir. Bu, xdebug'un bu komut için yüklenmesini önleyecektir.

-doptions, istediğiniz herhangi bir seçeneği eklemenize izin verir (örneğin, required_ext.so öğesini etkinleştirin). Birden çok -dseçeneği kullanabilirsiniz . Elbette bu isteğe bağlıdır, ihtiyacınız olmayabilir.

Sonra tekrar şekerli hale getirmek için bir takma ad oluşturabilirsiniz.

Tipik bir çözüm (çünkü bestecinin json'a ihtiyacı vardır):

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

greg0ire> buna dayalı çözümüm:

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

Çirkin görünüyor (xargs ile bunu yapmayı denedim ve başarısız oldum), ama işe yarıyor… Yine de bazı uzantıları devre dışı bırakmak zorunda kaldım, aksi takdirde aşağıdaki uyarıları alıyorum:

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

-nDün denedim ve bir sorun yaşadım çünkü pharuzantıyı kaçırdım. Çalışana kadar daha fazla uzantı eklemeye çalışacağım, bunun iyi bir çözüm olduğunu düşünüyorum. Takma ada göre, korumadığım bazı zsh takma adlarım var. Belki ikiliyi bir bash betiğiyle değiştirmeyi deneyeceğim veya takma adları yapılandırıp yapılandıramayacağıma bakacağım.
greg0ire

Bununla birlikte, bu beyaz liste yaklaşımındaki sorun, beyaz listenin insanların ihtiyaç duyduklarına bağlı olarak composer.json, örneğin "ext-ldap": "*" veya yalnızca yükleme sonrası görevlerin düzgün çalışması için neye ihtiyaç duyulduğuna bağlı olarak büyüyebilmesidir. … Bir uzantıyı kara listeye almanın bir yolu
olsaydı

1
php -m
greg0ire

Aklıma geliyor, ama xdebug'u bir geliştirme ortamında kullandığınızı varsayıyorum. Besteci bu ince ayar gerektirecek kadar yavaş mı?
Gui-Don

Hayır, ben sadece çıkışından bu gördüm diagnoseve ben inşa ediyorum beri gelişme liman işçisi kapları ekibim için, en küçük hız gelişimi hepsine faydalı olacağını
greg0ire

14

Bir takma ad oluşturarak bu composer xdebughata mesajını bastırırsınız .

Sadece bu satırı ~/.bash_aliasessisteminize ekleyin ve kusursuz çalışması gerekir.

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

Yeni takma adı composerkullanılabilir hale getirmek için kabuğu yeniden yükleyin .

source ~/.bash_profile

KULLANIM:

$ composer --version

NOT:
Başka bir parametre kullanmanız gerekmez.
Sisteminize bağlı olarak bir .bashrcyerine sahip olabilirsiniz .bash_profile.

GÜNCELLEME:

@AlexanderKachkaev'in yorumlarda belirttiği gibi, bazı durumlarda çökmeyi önlemek için memory_limit'i aşağıdaki gibi eklemenin hiçbir değeri yoktur:

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

3
Bu, yükleme sonrası veya güncelleme sonrası komut dosyalarında uzantılardan birine ihtiyaç duyulduğu anda çok iyi çalışmayacaktır… yine de basit projelerde iyi bir çözüm olabilir.
greg0ire

1
Bu -nseçenek Pharuzantıyı devre dışı bırakır, bu nedenle çalıştırılamayabilircomposer.phar
brzuchal

1
Bu benim için çalıştı. Ek olarak, çökmeyi önlemek için bellek sınırını devre dışı alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
bıraktım

Bu çözüm oldukça basit ve benim durumum için uygulanabilir. @AlexanderKachkaev'in bellek sınırı önerisi bir zorunluluktur. Cevabı düzenlemekte iyi olun.
Henry

12

OSX için oldukça iyi çalışan bir yanıt buldum ve muhtemelen uzantılarını "ek ini dizininde" tek tek .ini dosyalarını kullanarak yükleyen herhangi bir PHP sürümüne uyarlanabilir:

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


Fantastik, Mac OS'de, brew yüklü php 7.1'de iyi çalışıyor. TY!
Antonio Carlos Ribeiro

7

Her projenin başka bir PHP sürümü olduğundan, genellikle proje başına bir kabuk betiği oluştururum. /bin/Yanında bir dizinde composer.pharve proje dizinimdeki composer.jsongibi çalıştırıyorum ./bin/composer.

Şöyle görünüyor (php56 için)

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

-dSeçenekler etkin bir devreden xdebug. COMPOSER_DISABLE_XDEBUG_WARN=1Bölüm uyarı besteci sorunları devre dışı bırakır.

Xdebug uzantısının devre dışı bırakılması tercih edilir ( composer sorun giderme bölümüne bakın ), ancak kişisel olarak daha basit komut dosyasını seviyorum.

Makinemde bazı zamanlamalar: 2 xdebug ve ini özellikli çalıştır: 1m33

Xdebug ile çalıştırın ancak devre dışı bırakıldı: 0m19

Xdebug olmadan çalıştırın: 0m10


XDebug'u devre dışı COMPOSER_DISABLE_XDEBUG_WARN=1bıraktığınız için şuna ihtiyacınız olmadığını düşünüyorum: bir uyarı alırsanız, bu sadece scrit'inizin çalışmadığı anlamına gelir. xdebug.remote_autostartUzaktan hata ayıklama devre dışı bırakılırsa tanımlama işe yaramaz.
greg0ire

Haklısın xdebug.remote_autostart. Komut dosyalarının etkinliği hakkında: Composer, xdebug uzantısının yüklenip yüklenmediğini kontrol eder, aslında buradaki koda bakıp bakmadığını kontrol eder . İni seçenekleri "normal" php betiklerinde iyi çalışıyor ama yine de: Performans testi yapmadım ...
Joost

(Son olarak) besteci kılavuzunda bu sorun giderme ile ilgili bölümü buldu : xdebug'ın besteci üzerindeki etkisi . Tüm xdebug seçeneklerini ini bayrakları aracılığıyla devre dışı bırakmanın performans sorunlarını azaltmak için yeterli olmadığını açıklar. Yani senaryom çalışmayacak. Çok kötü!
Joost

Biraz zamanlama yaptım (Mac OS X'te) ve betiğimi kullanarak performans iyileştirmelerinden oldukça memnun olduğumu söylemeliyim! Xdebug ile seçenekleri etkin Tek gereken 1m33 seçenekleri, devre dışı Tek gereken 0m19 . Xdebug uzantısı olmadan 0m10 alır .
Joost

Tamam yani yine de bir gelişme var. Mevcut en iyi gelişme değil, ancak yine de büyük bir gelişme (en azından OS X'te)
greg0ire

6

PHPStorm kullanıyorsanız, en son sürüm (2016.2), isteğe bağlı CLI komut dosyaları için XDebug'u etkinleştirme özelliğiyle birlikte gelir; bu, geliştirme makinenizde XDebug'u küresel olarak kapatabileceğiniz anlamına gelir. IDE, projelerinizdeki kod tarafından ihtiyaç duyulduğunda onu anında etkinleştirecektir.

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

PhpStorm 2016.2, global PHP kurulumunuz için Xdebug'u devre dışı bırakabileceğiniz Xdebug On Demand modunu sunar ve PhpStorm, bunu yalnızca gerektiğinde etkinleştirir - komut dosyalarınızda hata ayıklarken veya kod kapsamı raporlarına ihtiyacınız olduğunda.

Bağlantılı makalede açıklandığı gibi, XDebug yolunu dahil etmek için PHP Yorumlayıcı tercihlerinizi düzenlemeniz gerekir.

Bana göre bu mükemmel bir çözüm gibi görünüyor, çünkü IDE'deyken yalnızca XDebug'u istiyorum.

Ancak, "çevrimdışı" olduğunuzda XDebug'ın başka potansiyel kullanımları da vardır; örneğin, hata günlüklerindeki genişletilmiş yığın dökümleri, bunu global olarak kapattığınızda kaybedersiniz. Elbette, üretimde XDebug'ı etkinleştirmemelisiniz, bu nedenle bu, beta testi veya geliştirmede otomatik test CLI komut dosyaları gibi durumlarla sınırlı olacaktır.


5

PHP modülünü geçici olarak etkinleştirmek veya devre dışı bırakmakla karıştırmak yerine, PHP kullanan eşzamanlı işlemleriniz olduğunda (örneğin bir CI işlem hattının parçası olarak), PHP'ye farklı bir modül yükleme dizinini göstermesini söyleyebilirsiniz.

Bu, yukarıda bahsedilen çözümlerin bazılarına benzer olsa da, birkaç uç durumu çözer ve bu, aynı makinede aynı anda testleri çalıştıran Jenkins veya diğer CI çalıştırıcıları tarafından kullanıldığında çok yararlıdır.

Bunu yapmanın en kolay yolu, ortam değişkenini kullanmaktır. PHP_INI_SCAN_DIR

Bunu bir komut dosyasında veya derleme görevinde kullanmak kolaydır:

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

Elbette önce /etc/php.d.noxdebug'ı hazırlamanız ve aşağıdaki gibi bir şey yapmanız gerekir:

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

Bu, eski php ortamına benzer bir ortama sahip olduğunuz ve yalnızca bir modülün eksik olduğu anlamına gelir. Yani php -n çözümünde olduğu gibi phar / json modüllerini yüklemeniz gerekeceği konusunda endişelenmenize gerek yok.


Sadece ini dosyalarını kopyalamak yerine sembolik bağları kullanırdım.
greg0ire

1
Yeni modüller otomatik olarak 'noxdebug' klasörüne dahil edilmeyecekken, klasörlerin senkronize olduğu izlenimini verdiği için sembolik bağlantı kullanmaktan kaçındım.
KHobbits

4

Windows tabanlı Composer yükleyici için bir çözüm buldum - herhangi bir Composer yüklemesi için çalışmalı, yalnızca yüklenen INI dosyasının bir kopyasını oluşturuyor ve xdebug zend uzantısını yorumluyor, ardından composer'ı çalıştırdığında bu yapılandırma dosyasını yüklüyor .

Bu değişikliği entegre etmek isteyip istemediklerini görmek için bir sorun açtım:

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

Talimatlarımı ve kodumu orada bulabilirsiniz.


Basit ve etkili :) Kendini güncelleme yoluyla besteciyi güncelledikten sonra bunu tekrar uygulamak zorunda mısın?
marcovtwout

4

Joyce'un yanıtında belirtildiği gibi , bu sorun artık Composer'ın son sürümünde mevcut değildir.

Composer belgeleri bunu not edecek şekilde güncellendi . Composer ile xdebug'u nasıl etkinleştirebileceğinizi (gerekirse) detaylandırır.

Composer sürümünüzü kendi kendine güncelleme kullanarak güncelleyebilirsiniz .

Mac'imde yapmam gereken: sudo php /opt/local/bin/composer self-update

Homebrew PHP kurulumu bağlamında bununla ilgili daha fazla ayrıntı bu sayıda bulunabilir .


Bu harika! Bu değişikliğin PR'ın nerede olduğunu biliyor musunuz? Başka bir CLI uygulamasında buna ihtiyacım var
Tomáš Votruba

3

PHP yapılandırmasının doğrudan işlenmesi

İşte Mac OS X'te Homebrew tarafından yüklenmiş bir PHP kurulumuna dayanan katkım.

Bu /usr/local/bin/composer, Composer ikilisi aşağıdaki adresten yürütülebilir bir dosya olarak kaydedilmek üzere tasarlanmış bir kabuk-komut dosyası sarmalayıcısıdır /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

Operasyon teorisi

Sarmalayıcı komut dosyası:

  • yapılandırma dosyasını geçici olarak değiştirmek için sed kullanır , Xdebug'u devre dışı bırakır (2. satır)
  • Composer'ı çalıştırır, değiştirgelerden komuta geçer (satır 3)
  • yapılandırma dosyasını geri yüklemek için sed kullanır, Xdebug'ı yeniden etkinleştirir (satır 4)

Komut dosyası, PHP 5.5'in OS X / Homebrew kurulumuna bağlıdır. Yollar, diğer PHP sürümleri ve diğer işletim sistemleri ve paket yöneticilerinin dizin düzenleriyle çalışacak şekilde ayarlanmalıdır. Ayrıca sed'in bazı sürümlerinin, -iseçeneğin ardından boş dizge argümanına ihtiyaç duymadığını unutmayın .

Uyarı Yardımcısı

Komut dosyası, doğrudan ana PHP yapılandırma dosyalarında çalıştığı için basittir, ancak bu aynı zamanda bir dezavantajdır: Xdebug, bu komut dosyasıyla aynı anda çalıştırılan tüm komut dosyaları için de devre dışı bırakılacaktır.

Composer'ın elle ve sadece ara sıra çalıştırıldığı göz önüne alındığında, geliştirme ortamımda bu kabul edilebilir bir değiş tokuştur; ancak Composer'ı otomatik bir dağıtım işleminin parçası olarak çalıştırıyorsanız bu tekniği kullanmak istemeyebilirsiniz.


Composer tarafından hataların nasıl ele alındığı konusunda bir fark yaratacağından emin değilim - belirli bir örnek veya endişeniz var mı? Komut dosyası, soruna hızlı bir çözüm olarak tasarlanmıştır ve tam anlamıyla savaşta test edilmemiştir. Söyledikten sonra, onu kullandığım dönemde sorunsuz çalıştı.
j13k

1
Benim endişem, betiğin son satırının çalıştırılamayacağıdır.
greg0ire

2

Çoğu durumda, CLI modunda xdebug'a ihtiyacınız yoktur. Bu sizin için kabul edilebilirse, cli ve cgi'yi farklı şekilde yapılandırabilirsiniz.

Yani php-cli.ini ve conf-cli.d'yi php.ini dosyasından çıkarken yakın yaparsanız, cli ve cgi'yi farklı şekilde yapılandırabilirsiniz (cgi için php.ini ve conf.d olacaktır ). Xdebug.ini dosyasını conf-cli.d'ye koymayın.


2

Composer'ı OS X üzerinde brew kullanarak yüklerseniz Bu takma adı kullanabilirsiniz:

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

1

PHP'nin birden çok sürümüyle bir macports kurulumu için hızlı çözümüm, Composer için bu basit kabuk sarmalayıcıyı yazmaktı:

/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

Ardından herhangi bir composer komutunu şu şekilde çalıştırın:

sudo composer-nodebug.sh update

Dezavantajlar:

  • sudo gerektirir (INI dosyalarını değiştirmediğiniz sürece)
  • ortasında öldürürseniz INI dosyaları değiştirilir
  • gelecekteki PHP sürümlerinin eklenmesini gerektirecektir.
  • çalışırken diğer PHP süreçleri etkilenir

Zarif değil, ama basit.


Sanırım bunun yerine kullanabileceğiniz bir kısayol var $1…$7... belki $@ya da onun gibi bir şey, bakmanız gerekecek.
greg0ire

> INI dosyaları değiştirilirken onu ortadan kaldırırsanız, öldürme sinyalini yakalayarak> gelecekteki PHP sürümlerinin eklenmesini gerektireceğini düzeltirsiniz. bunu basit bir döngü ile de düzeltebilirsiniz
greg0ire

1

Composer için xdebug'u devre dışı bırakmak ve bellek hatalarını önlemek için bir takma ad oluşturma:

Bu satırı ~ / .bash_profile dosyanıza ekleyin

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

Yeni takma adı kullanılabilir hale getirmek için terminali yeniden başlatın.


-3

İşte PHP5-cli sürümündeki Xdebug uyarısından kurtulmak için hızlı çözümüm. Ubuntu 14.04'te PHP5-cli için Xdebug desteğini kaldırdım.

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

sudo rm 20-xdebug.ini

Artık PHP5-cli'de Xdebug uyarısı yok.


2
sudo phpdismod xdebugkaba davranmak için tercih edilen yöntem olurdurm
Jeff Puckett
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.