Menonaktifkan xdebug saat menjalankan komposer

98

Saat berjalan composer diagnose, saya mendapatkan kesalahan berikut:

Ekstensi xdebug dimuat, ini dapat sedikit memperlambat Komposer. Disarankan untuk menonaktifkannya saat menggunakan Komposer.

Bagaimana cara menonaktifkan xdebug hanya saat saya menjalankan Composer?

greg0ire
sumber

Jawaban:

81

Pembaruan : Masalah telah diperbaiki di Komposer 1.3 . Perbarui komposer ke versi terbaru dengan menjalankan composer self-update, daripada mencoba solusi berikut.


Berikut adalah modifikasi saya pada kode @ezzatron. Saya telah memperbarui skrip untuk mendeteksi file ini dari keluaran 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 $@
Joyce Babu
sumber
3
Sejauh ini, ini adalah solusi paling elegan untuk masalah tersebut, IMHO. Terima kasih Joyce!
Thomas Hansen
2
Terbaik. Naskah. Pernah
Maciej Paprocki
1
Saya harus menyesuaikan shebang ke bin/bashdaripada /bin/sh, karena yang terakhir tidak menyukai functionkata kunci (Ubuntu 14.04 LTS).
ashnazg
Saya telah memperbarui kode dan menghapus kata kunci fungsi, untuk kompatibilitas yang lebih baik.
Joyce Babu
1
Anda dapat mengonfirmasi bahwa Anda menjalankan versi terbaru dengan menjalankancomposer self-update
Joyce Babu
77

Perintah ini akan menonaktifkan modul PHP5 Xdebug untuk CLI (dan dengan demikian komposer):

sudo php5dismod -s cli xdebug

Ini menghapus symlink xdebug.ini dari/etc/php5/cli/conf.d/

Ini disarankan di http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

Perhatikan bahwa untuk Ubuntu 16.04 Anda mungkin perlu menjalankannya seperti ini:

sudo phpdismod -s cli xdebug
penguasa
sumber
4
Saya telah menambahkan dua alias alias xdebug-on='sudo php5enmod -s cli xdebug'dan alias xdebug-off='sudo php5dismod -s cli xdebug', jadi sekarang mudah untuk mengaktifkan xdebug-ondan menonaktifkan xdebug-offxdebug.
Daniel Mecke
Tidak portabel. Mungkin hanya untuk Linux.
Diti
Bekerja dengan baik pada kotak Laravel Homestead (Ubuntu / Debian). Penjelasan lebih panjang tentang cara kerjanya: laracasts.com/discuss/channels/forge/disable-xdebug
Justin
2
terima kasih untuk ini :) tapi saya punya ubuntu 16.04 dan jika seseorang perlu menggunakan ini, jalankan sudo phpdismod -s cli xdebug
Angel M.
Bagaimana dengan php7 di ubuntu? Apakah saya hanya perlu menghapus symlink? /etc/php/7.0/cli/conf.d
gastonnina
40

Saya rasa tidak ada opsi untuk mengkonfigurasi PHP sehingga dapat memuat konfigurasi yang berbeda sesuai dengan skrip yang ditargetkan. Setidaknya, bukan tanpa menduplikasi file .ini ...

Namun, Anda dapat menambahkan opsi tersebut saat menjalankan komposer dengan php:

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

-nakan memberitahu PHP untuk mengabaikan php.ini apapun. Ini akan mencegah xdebug memuat perintah ini.

-doptions memungkinkan Anda untuk menambahkan opsi apa pun yang Anda inginkan (misalnya, aktifkan required_ext.so). Anda dapat menggunakan banyak -dopsi. Tentu saja, ini opsional, Anda mungkin tidak membutuhkannya.

Kemudian Anda bisa membuat alias, untuk membuatnya lebih manis lagi.

Solusi tipikal (karena komposer membutuhkan json):

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

greg0ire> solusi saya, berdasarkan itu:

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

Kelihatannya jelek (saya mencoba dan gagal melakukannya dengan xargs), tetapi berfungsi ... Saya harus menonaktifkan beberapa ekstensi, jika tidak saya mendapatkan peringatan berikut:

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
Bendera
sumber
Saya mencoba -nkemarin dan mengalami masalah karena saya kehilangan pharekstensi. Saya akan mencoba menambahkan lebih banyak ekstensi hingga berhasil, saya pikir ini adalah solusi yang baik. Sesuai alias, saya sudah memiliki beberapa alias zsh yang tidak saya pertahankan. Mungkin saya akan mencoba mengganti biner dengan skrip bash, atau melihat apakah saya dapat mengkonfigurasi alias.
greg0ire
Masalah dengan pendekatan daftar putih ini, bagaimanapun, adalah bahwa daftar putih mungkin bertambah tergantung pada apa yang dibutuhkan orang dalam mereka composer.json, misalnya "ext-ldap": "*", atau hanya tergantung pada apa yang diperlukan untuk membuat tugas pasca pemasangan berjalan dengan baik … Seandainya ada cara untuk memasukkan ekstensi ke daftar hitam…
greg0ire
1
Saya akan mencoba melakukan sesuatu dengan keluaranphp -m
greg0ire
Itu terlintas di benak saya, tetapi, saya berasumsi Anda menggunakan xdebug dalam lingkungan pengembangan. Apakah komposer sangat lambat sehingga perlu penyesuaian ini?
Gui-Don
Oh tidak, saya baru saja melihat ini dari hasil diagnose, dan karena saya sedang membangun container docker pengembangan untuk tim saya, peningkatan kecepatan terkecil dapat bermanfaat bagi semuanya
greg0ire
14

Dengan membuat alias Anda akan menyembunyikan composer xdebugpesan kesalahan itu.

Cukup tambahkan baris ini ke ~/.bash_aliasesdalam sistem Anda dan itu akan bekerja dengan sempurna.

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

Muat ulang shell untuk membuat alias baru composertersedia.

source ~/.bash_profile

PEMAKAIAN:

$ composer --version

CATATAN:
Anda tidak perlu menggunakan parameter lain.
Tergantung pada sistem Anda, Anda mungkin memiliki .bashrcbukannya .bash_profile.

MEMPERBARUI:

Seperti yang disebutkan @AlexanderKachkaev di komentar, tidak ada gunanya menambahkan memory_limit sebagai berikut untuk menghindari crash dalam beberapa situasi:

alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Adriano Rosa
sumber
3
Ini tidak akan berjalan dengan baik segera setelah salah satu ekstensi diperlukan dalam pasca pemasangan atau skrip pasca pembaruan… mungkin bisa menjadi solusi yang baik untuk proyek sederhana sekalipun.
greg0ire
1
The -npilihan menonaktifkan Pharekstensi sehingga mungkin gagal untuk menjalankan daricomposer.phar
brzuchal
1
Ini berhasil untuk saya. Selain itu, saya menonaktifkan batas memori untuk menghindari crash:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Alexander Kachkaev
Solusi ini cukup sederhana dan bisa diterapkan untuk situasi saya. Saran batas memori dari @AlexanderKachkaev adalah suatu keharusan. Sebaiknya edit jawabannya.
Henry
12

Saya datang dengan jawaban yang bekerja cukup baik untuk OSX, dan mungkin dapat diadaptasi untuk versi PHP yang memuat ekstensinya menggunakan file .ini individual di "tambahan ini dir":

#!/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"
ezzatron.dll
sumber
Bagus! Saya membuat skrip tujuan umum berdasarkan ini untuk Ubuntu 14.04-15.10 gist.github.com/perk11/816c4e64023ea26976cf
Konstantin Pereiaslov
Fantastis, berfungsi dengan baik di Mac OS, di brew diinstal php 7.1. TY!
Antonio Carlos Ribeiro
7

Saya biasanya membuat skrip shell per proyek, karena setiap proyek memiliki versi PHP lain. Ini ada di /bin/direktori di sebelahcomposer.phar dan composer.jsondan saya menjalankannya seperti ./bin/composerdi direktori proyek saya.

Ini terlihat seperti ini (untuk 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 "$@"

Itu -d pilihan efektif menonaktifkan Xdebug. Bagian COMPOSER_DISABLE_XDEBUG_WARN=1menonaktifkan masalah komposer peringatan.

Menonaktifkan ekstensi xdebug lebih disukai (lihat pemecahan masalah komposer ), tetapi saya pribadi menyukai skrip yang lebih sederhana.

Beberapa pengaturan waktu di komputer saya: 2 Jalankan dengan xdebug dan diaktifkan ini: 1m33

Jalankan dengan xdebug tetapi ini-nonaktif: 0m19

Jalankan tanpa xdebug: 0m10

Joost
sumber
Saya pikir karena Anda menonaktifkan XDebug, Anda tidak memerlukan COMPOSER_DISABLE_XDEBUG_WARN=1: jika Anda mendapat peringatan, itu berarti scrit Anda tidak berfungsi. Mendefinisikan xdebug.remote_autostarttampaknya tidak berguna jika debugging jarak jauh dinonaktifkan.
greg0ire
Anda benar tentang xdebug.remote_autostart. Tentang keefektifan skrip: Komposer memeriksa apakah ekstensi xdebug dimuat, bukan apakah benar-benar melakukan sesuatu, lihat kode di sini . Opsi ini bekerja dengan baik dalam skrip php "biasa" tetapi sekali lagi: Saya tidak melakukan tes kinerja ...
Joost
(Akhirnya) menemukan bagian yang relevan di manual komposer tentang pemecahan masalah ini : dampak xdebug pada komposer . Ini menjelaskan bahwa menonaktifkan semua opsi xdebug melalui flag ini tidak cukup untuk mengurangi masalah kinerja. Jadi skrip saya tidak akan berfungsi. Sangat buruk!
Joost
Saya melakukan beberapa pengaturan waktu (pada Mac OS X) dan saya harus mengatakan bahwa saya cukup senang dengan peningkatan kinerja menggunakan skrip saya! Dengan opsi xdebug diaktifkan dibutuhkan 1m33 , dengan opsi dinonaktifkan dibutuhkan 0m19 . Tanpa ekstensi xdebug dibutuhkan 0m10 .
Joost
Ok jadi ada perbaikan sih. Bukan peningkatan terbaik yang tersedia, tetapi peningkatan besar (setidaknya pada OS X)
greg0ire
6

Jika Anda menggunakan PHPStorm, rilis terbaru (2016.2) dilengkapi dengan fitur untuk mengaktifkan XDebug untuk skrip CLI sesuai permintaan, yang berarti Anda cukup mematikan XDebug secara global pada mesin pengembangan Anda. IDE akan mengaktifkannya dengan cepat saat dibutuhkan oleh kode di dalam proyek Anda.

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

PhpStorm 2016.2 memperkenalkan mode Xdebug On Demand di mana Anda dapat menonaktifkan Xdebug untuk instalasi PHP global Anda, dan PhpStorm hanya akan mengaktifkannya saat diperlukan - saat Anda men-debug skrip Anda, atau saat Anda memerlukan laporan cakupan kode.

Anda perlu mengedit preferensi Penerjemah PHP untuk menyertakan jalur ke XDebug, seperti yang dijelaskan di artikel yang ditautkan.

Bagi saya ini sepertinya solusi yang tepat, karena saya biasanya hanya menginginkan XDebug saat saya menggunakan IDE.

Namun XDebug memang memiliki kegunaan potensial lain saat Anda "offline" misalnya tumpukan dump yang diperpanjang di log kesalahan, yang akan hilang dengan mematikannya secara global. Tentu saja Anda tidak boleh mengaktifkan XDebug pada produksi, jadi ini akan dibatasi untuk kasus penggunaan seperti pengujian beta atau pengujian otomatis skrip CLI dalam pengembangan.

scipilot
sumber
5

Daripada mengacaukan dengan mengaktifkan atau menonaktifkan modul PHP untuk sementara, ketika Anda mungkin memiliki proses bersamaan menggunakan PHP (misalnya sebagai bagian dari pipeline CI), Anda dapat memberi tahu PHP untuk menunjuk ke direktori pemuatan modul yang berbeda.

Meskipun ini serupa dengan beberapa solusi yang disebutkan di atas, ini memecahkan beberapa kasus edge, yang sangat berguna saat digunakan oleh Jenkins atau runner CI lain yang menjalankan pengujian pada mesin yang sama secara bersamaan.

Cara termudah untuk melakukannya adalah dengan menggunakan variabel lingkungan PHP_INI_SCAN_DIR

Menggunakan ini dalam skrip atau tugas build itu mudah:

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

Tentu saja Anda ingin mempersiapkan /etc/php.d.noxdebug terlebih dahulu, melakukan sesuatu seperti:

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

Ini berarti Anda memiliki lingkungan yang mirip dengan lingkungan php lama, dengan hanya satu modul yang hilang. Artinya Anda tidak perlu khawatir perlu memuat modul phar / json seperti yang Anda lakukan dengan solusi php -n.

KHobbits
sumber
Saya akan menggunakan symlinks daripada hanya menyalin file ini.
greg0ire
1
Saya menghindari penggunaan symlink karena memberi kesan folder sinkron, sedangkan modul baru tidak akan otomatis disertakan dalam folder 'noxdebug'.
KHobbits
4

Saya datang dengan solusi untuk penginstal Komposer berbasis Windows - itu harus berfungsi untuk instalasi Komposer apa pun, itu pada dasarnya hanya membuat salinan file INI yang dimuat dan mengomentari ekstensi zend xdebug, kemudian memuat file konfigurasi itu ketika menjalankan komposer .

Saya telah membuka masalah untuk melihat apakah mereka ingin mengintegrasikan perubahan ini:

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

Anda dapat menemukan instruksi dan kode saya di sana.

mindplay.dk
sumber
Sederhana dan efektif :) Apakah Anda harus menerapkan ini lagi setelah memperbarui komposer melalui pembaruan otomatis?
marcovtwout
4

Sebagaimana dicatat dalam jawaban Joyce , masalah ini tidak lagi ada di versi terbaru Komposer.

Dokumentasi Komposer telah diperbarui untuk mencatat ini . Ini merinci bagaimana Anda dapat mengaktifkan xdebug dengan Komposer (jika diperlukan).

Anda dapat memperbarui versi Komposer Anda dengan memanfaatkan pembaruan sendiri .

Di Mac saya, saya harus melakukan: sudo php /opt/local/bin/composer self-update

Rincian lebih lanjut tentang ini dalam konteks penginstalan PHP Homebrew dapat ditemukan dalam edisi ini .

Thomas Clowes
sumber
Itu hebat! Apakah Anda tahu di mana PR untuk perubahan ini? Saya membutuhkannya di aplikasi CLI lain
Tomáš Votruba
3

Manipulasi langsung dari konfigurasi PHP

Ini kontribusi saya berdasarkan instalasi PHP yang diinstal Homebrew di Mac OS X.

Ini adalah pembungkus skrip-shell, dirancang untuk disimpan sebagai file yang dapat dieksekusi di /usr/local/bin/composer, dengan biner Komposer di /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

Teori Operasi

Skrip pembungkus:

  • menggunakan sed untuk mengubah sementara file konfigurasi, menonaktifkan Xdebug (baris 2)
  • menjalankan Composer, melewati args ke perintah (baris 3)
  • menggunakan sed untuk memulihkan file konfigurasi, mengaktifkan kembali Xdebug (baris 4)

Skrip ini digabungkan ke instalasi OS X / Homebrew dari PHP 5.5. Path harus disesuaikan untuk bekerja dengan versi PHP lain dan tata letak direktori sistem operasi dan manajer paket lain. Perhatikan juga bahwa beberapa versi sed tidak memerlukan argumen string kosong mengikuti -iopsi.

Caveat Utilitor

Skrip ini sangat mudah, karena bekerja langsung pada file konfigurasi PHP utama, namun ini juga merupakan kelemahan: Xdebug juga akan dinonaktifkan untuk skrip yang dieksekusi secara bersamaan dengan skrip ini.

Dalam lingkungan pengembangan saya, ini adalah trade-off yang dapat diterima, mengingat Komposer dijalankan secara manual dan hanya sesekali; namun Anda mungkin tidak ingin menggunakan teknik ini jika menjalankan Composer sebagai bagian dari proses penerapan otomatis.

j13k
sumber
Saya tidak yakin itu akan membuat perbedaan pada bagaimana kesalahan ditangani oleh Composer — apakah Anda memiliki contoh atau perhatian khusus? Skrip ini dimaksudkan sebagai solusi cepat untuk masalah ini dan belum diuji secara menyeluruh. Karena itu, selama saya menggunakannya, itu telah berfungsi tanpa masalah.
j13k
1
Kekhawatiran saya adalah baris terakhir skrip mungkin tidak dapat dijalankan.
greg0ire
2

Dalam kebanyakan kasus, Anda tidak memerlukan xdebug pada mode CLI. Jika ini dapat diterima untuk Anda daripada Anda dapat mengkonfigurasi cli dan cgi secara berbeda.

Jadi jika Anda membuat php-cli.ini dan conf-cli.d mendekati keluar dari file php.ini daripada Anda dapat mengkonfigurasi cli dan cgi secara berbeda (untuk cgi adalah php.ini dan conf.d ). Hanya saja, jangan memasukkan xdebug.ini ke conf-cli.d.

Vazgen Manukyan
sumber
2

Jika Anda menginstal komposer menggunakan brew di OS X, Anda dapat menggunakan alias ini:

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

Solusi cepat saya untuk instalasi macports, dengan beberapa versi PHP adalah menulis bungkus shell sederhana ini untuk Komposer:

/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

Kemudian jalankan perintah komposer seperti ini:

sudo composer-nodebug.sh update

Kekurangan:

  • membutuhkan sudo (kecuali jika Anda mengubah file INI)
  • jika Anda mematikannya di tengah jalan, file INI diubah
  • akan membutuhkan versi PHP yang akan datang ditambahkan.
  • saat menjalankan proses PHP lainnya akan terpengaruh

Tidak elegan, tapi sederhana.

scipilot
sumber
Saya pikir ada jalan pintas yang dapat Anda gunakan sebagai pengganti $1…$7… mungkin itu $@atau sesuatu seperti itu, Anda harus melihat.
greg0ire
> jika Anda membunuhnya di tengah jalan, file INI diubah, Anda dapat memperbaikinya dengan menjebak sinyal kill> akan memerlukan versi PHP di masa mendatang yang ditambahkan. Anda juga dapat memperbaikinya dengan loop sederhana
greg0ire
1

Membuat alias untuk komposer untuk menonaktifkan xdebug dan mencegah kesalahan memori:

Tambahkan baris ini ke ~ / .bash_profile Anda

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

Mulai ulang terminal untuk membuat alias baru tersedia.

Matthias Schobner
sumber
-3

Berikut adalah solusi cepat saya untuk menghilangkan peringatan Xdebug pada versi PHP5-cli. Saya telah menghapus dukungan Xdebug untuk PHP5-cli di Ubuntu 14.04.

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

sudo rm 20-xdebug.ini

Sekarang tidak ada lagi peringatan Xdebug pada PHP5-cli.

milin mestry
sumber
2
sudo phpdismod xdebugakan menjadi metode yang disukai untuk kasarrm
Jeff Puckett