Jawaban:
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 $@
bin/bash
daripada /bin/sh
, karena yang terakhir tidak menyukai function
kata kunci (Ubuntu 14.04 LTS).
composer self-update
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
alias xdebug-on='sudo php5enmod -s cli xdebug'
dan alias xdebug-off='sudo php5dismod -s cli xdebug'
, jadi sekarang mudah untuk mengaktifkan xdebug-on
dan menonaktifkan xdebug-off
xdebug.
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
-n
akan memberitahu PHP untuk mengabaikan php.ini apapun. Ini akan mencegah xdebug memuat perintah ini.
-d
options memungkinkan Anda untuk menambahkan opsi apa pun yang Anda inginkan (misalnya, aktifkan required_ext.so). Anda dapat menggunakan banyak -d
opsi. 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
-n
kemarin dan mengalami masalah karena saya kehilangan phar
ekstensi. 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.
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…
php -m
diagnose
, dan karena saya sedang membangun container docker pengembangan untuk tim saya, peningkatan kecepatan terkecil dapat bermanfaat bagi semuanya
Dengan membuat alias Anda akan menyembunyikan composer
xdebug
pesan kesalahan itu.
Cukup tambahkan baris ini ke ~/.bash_aliases
dalam sistem Anda dan itu akan bekerja dengan sempurna.
alias composer="php -n /usr/local/bin/composer"
Muat ulang shell untuk membuat alias baru composer
tersedia.
source ~/.bash_profile
PEMAKAIAN:
$ composer --version
CATATAN:
Anda tidak perlu menggunakan parameter lain.
Tergantung pada sistem Anda, Anda mungkin memiliki .bashrc
bukannya .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"
-n
pilihan menonaktifkan Phar
ekstensi sehingga mungkin gagal untuk menjalankan daricomposer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
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"
Saya biasanya membuat skrip shell per proyek, karena setiap proyek memiliki versi PHP lain. Ini ada di /bin/
direktori di sebelahcomposer.phar
dan composer.json
dan saya menjalankannya seperti ./bin/composer
di 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=1
menonaktifkan 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
COMPOSER_DISABLE_XDEBUG_WARN=1
: jika Anda mendapat peringatan, itu berarti scrit Anda tidak berfungsi. Mendefinisikan xdebug.remote_autostart
tampaknya tidak berguna jika debugging jarak jauh dinonaktifkan.
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 ...
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.
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.
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.
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.
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 .
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
Skrip pembungkus:
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 -i
opsi.
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.
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.
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}')"
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:
Tidak elegan, tapi sederhana.
$1…$7
… mungkin itu $@
atau sesuatu seperti itu, Anda harus melihat.
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.
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.
sudo phpdismod xdebug
akan menjadi metode yang disukai untuk kasarrm