composerの実行時にxdebugを無効にする


98

実行するcomposer diagnoseと、次のエラーが発生します。

xdebug拡張機能が読み込まれます。これにより、Composerが少し遅くなる可能性があります。Composerを使用する場合は無効にすることをお勧めします。

Composerを実行している場合にのみxdebugを無効にするにはどうすればよいですか?

回答:


81

更新:この問題はComposer 1.3で修正されました。composer self-update次の回避策を試す代わりに、を実行してcomposerを最新バージョンに更新します。


これが@ezzatronのコードの私の変更です。phpinfoの出力からiniファイルを検出するようにスクリプトを更新しました。

#!/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です。ジョイス、ありがとう!
トーマス・ハンセン

2
ベスト。脚本。これまで
Maciej Paprocki 2016

1
私はにシェバングを調整しなければならなかったbin/bashのではなく/bin/sh、後者は好きではなかったとして、functionキーワード(Ubuntuの14.04 LTS)。
ashnazg 16

互換性を高めるために、コードを更新してfunctionキーワードを削除しました。
Joyce Babu、2016

1
最新バージョンを実行していることを確認するには、実行composer self-update
Joyce Babu

77

このコマンドは、CLI(したがってcomposer)のPHP5 Xdebugモジュールを無効にします。

sudo php5dismod -s cli xdebug

xdebug.iniシンボリックリンクを削除します/etc/php5/cli/conf.d/

これは提案されました http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

Ubuntu 16.04の場合、おそらく次のように実行する必要があることに注意してください。

sudo phpdismod -s cli xdebug

4
2つのエイリアスalias xdebug-on='sudo php5enmod -s cli xdebug'とを追加したalias xdebug-off='sudo php5dismod -s cli xdebug'ので、xdebug を有効xdebug-onまたは無効にするのは簡単xdebug-offです。
Daniel Mecke 2016

ポータブルではありません。おそらくLinuxのみです。
Diti、2016

Laravel Homesteadボックス(Ubuntu / Debian)でうまく動作します。それがどのように機能するかのより長い説明:laracasts.com/discuss/channels/forge/disable-xdebug
Justin

2
これに感謝します:)しかし、私はubuntu 16.04を持っています。誰かがこれを使用する必要がある場合は、sudo phpdismod -s cli xdebug
Angel Mを

Ubuntuのphp7はどうですか?シンボリックリンクを削除するだけでよいですか?/etc/php/7.0/cli/conf.d
gastonnina '10

40

PHPを構成するオプションがないため、ターゲットのスクリプトに応じて異なる構成をロードできるとは思いません。少なくとも、.iniファイルを複製せずに...

ただし、phpでcomposerを実行するときに、これらのオプションを追加できます。

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

-nphp.iniを無視するようにPHPに指示します。これにより、xdebugがこのコマンドだけをロードするのを防ぎます。

-doptionsを使用すると、必要なオプションを追加できます(たとえば、needed_ext.soをアクティブにします)。複数の-dオプションを使用できます。もちろん、これはオプションであり、必要ない場合もあります。

次に、エイリアスを作成して、もう一度甘くすることができます。

典型的な解決策(composerにはjsonが必要なため):

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

greg0ire>私の解決策、それに基づく:

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

見た目は醜く(xargsを使用して試してみましたが失敗しました)機能しますが、一部の拡張機能を無効にする必要がありました。それ以外の場合は、次の警告が表示されます。

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昨日試してみましたが、phar拡張子がないので問題がありました。機能するまで拡張機能をどんどん追加していきます。これは良い解決策だと思います。エイリアスによると、私はすでに維持していないいくつかのzshエイリアスを持っています。たぶん、バイナリをbashスクリプトに置き換えるか、エイリアスを構成できるかどうかを確認します。
greg0ire 2015年

ただし、このホワイトリストアプローチの問題は、composer.json「ext-ldap」:「*」など、ユーザーが何を必要とするかによって、または単にインストール後のタスクを適切に実行するために何が必要かによって、ホワイトリストが大きくなる可能性があることです。 …拡張機能をブラックリストに登録する方法があった場合のみ
greg0ire

1
php -m
-greg0ire

私の頭に浮かびますが、開発環境でxdebugを使用していると思います。composerは非常に遅いので、この調整が必要ですか?
Gui-Don

ああ、いや、私はこれをの出力から見ただけで、チームの開発用ドッキングコンテナーdiagnose構築しているので、速度を
少しでも

14

エイリアスを作成することにより、それを抑制します composer xdebugエラーメッセージ表示されなくなります。

この行を~/.bash_aliasesシステム内に追加するだけで、問題なく動作するはずです。

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

シェルをリロードして、新しいエイリアスをcomposer使用可能にします。

source ~/.bash_profile

使用法:

$ composer --version

注:
他のパラメータを必ずしも使用する必要はありません。
システムによっては、の.bashrc代わりにを使用している場合があります.bash_profile

更新:

@AlexanderKachkaevがコメントで言及しているように、特定の状況でのクラッシュを回避するために、次のようにmemory_limitを追加する価値はありません。

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

3
これは、拡張機能の1つがインストール後または更新後のスクリプトで必要になるとすぐにうまく機能しなくなりますが、単純なプロジェクトでは良い解決策になるかもしれません。
greg0ire 2016

1
この-nオプションはPhar拡張機能を無効にするため、実行に失敗する可能性がありますcomposer.phar
brzuchal

1
これでうまくいきました。また、I無効メモリの制限がクラッシュ避けるために:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
アレクサンダーKachkaev

このソリューションは非常にシンプルで、私の状況に対応できます。@AlexanderKachkaevからのメモリ制限の提案は必須です。答えを編集してください。
ヘンリー

12

私はOSXでかなりうまくいく答えを思いつきました、そしておそらく「追加のini dir」の個々の.iniファイルを使用してその拡張をロードするすべてのPHPバージョンに適応させることができます:

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


素晴らしい、Mac OS、brewでインストールされたphp 7.1で正常に動作します。TY!
アントニオカルロスリベイロ

7

すべてのプロジェクトに別のPHPバージョンがあるため、通常はプロジェクトごとにシェルスクリプトを作成します。それは/bin/隣のディレクトリにcomposer.pharありcomposer.json、私はそれを次のように実行します./bin/composer、プロジェクトディレクトリます。

次のようになります(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 "$@"

-dオプション効果的に無効にXdebugの。のCOMPOSER_DISABLE_XDEBUG_WARN=1一部は警告作曲の問題を無効にします。

xdebug拡張機能を無効にすることをお勧めします(composerのトラブルシューティングを参照))。ただし、個人的には、より単純なスクリプトが好きです。

私のマシンでのいくつかのタイミング:2 xdebugで実行し、iniを有効化:1m33

xdebugで実行しますが、iniを無効にします:0m19

xdebugなしで実行:0m10


XDebugを無効にしているので、必要はないとCOMPOSER_DISABLE_XDEBUG_WARN=1思います。警告が表示された場合、それは単にスクリプトが機能しないことを意味します。xdebug.remote_autostartリモートデバッグが無効になっている場合、定義は役に立たないようです。
greg0ire

あなたは正しいですxdebug.remote_autostart。スクリプトの有効性について:Composerは、実際に何か行っているかどうかではなく、xdebug拡張がロードされているかどうかをチェックします。「通常の」phpスクリプトではiniオプションは正常に機能しますが、繰り返しますが、パフォーマンステストは行っていません...
Joost

(最後に)このトラブルシューティングに関するcomposerマニュアルの関連部分を見つけました:composerへのxdebugの影響。これは、iniフラグを使用してすべてのxdebugオプションを無効にするだけでは、パフォーマンスの問題を軽減するには不十分であることを説明しています。したがって、私のスクリプトは機能しません。残念な!
Joost

私は(Mac OS Xで)いくつかのタイミングを行いましたが、スクリプトを使用したパフォーマンスの向上に非常に満足していると言わざるを得ません!xdebugオプションを有効にする1m33、オプションを無効にすると0m19かかります。xdebug拡張がないと、0m10かかります
Joost

とにかく改善があります。利用可能な最善の改善ではありませんが、それでも大幅な改善(少なくともOS Xでは)
greg0ire

6

PHPStormを使用する場合、最新リリース(2016.2)には、オンデマンドでCLIスクリプトのXDebugを有効にする機能が含まれています。つまり、開発マシンでXDebugをグローバルにオフにするだけです。IDEは、プロジェクト内のコードで必要なときに、その場で有効にします。

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

PhpStorm 2016.2は、グローバルなPHPインストールに対してXdebugを無効にできるXdebug On Demandモードを導入し、PhpStormは、必要な場合(スクリプトのデバッグ時またはコードカバレッジレポートが必要な場合)にのみ有効にします。

リンクされた記事で説明されているように、XDebugへのパスを含めるようにPHPインタープリターの設定を編集する必要があります。

私は通常、IDEにいる間だけXDebugが必要なので、これは完璧なソリューションのようです。

ただし、XDebugは、「オフライン」の場合、他の潜在的な用途があります。たとえば、エラーログの拡張スタックダンプは、グローバルにオフにすると失われます。もちろん、本番環境でXDebugを有効にするべきではないので、これは開発中のベータテストや自動テストCLIスクリプトなどのユースケースに限定されます。


5

PHPモジュールを一時的に有効または無効にするのではなく、PHPを使用して並行プロセスがある場合(たとえば、CIパイプラインの一部として)、別のモジュールロードディレクトリをポイントするようにPHPに指示できます。

これは上記のソリューションのいくつかに似ていますが、これはいくつかのエッジケースを解決します。これは、同じマシンで同時にテストを実行するJenkinsまたは他のCIランナーで使用される場合に非常に役立ちます。

これを行う最も簡単な方法は、環境変数を使用することです PHP_INI_SCAN_DIR

スクリプトまたはビルドタスクでこれを使用するのは簡単です。

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

もちろん、最初に/etc/php.d.noxdebugを準備したいでしょう:

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

これは、1つのモジュールだけが欠落している、古いphp環境に似た環境であることを意味します。php -nソリューションの場合のように、phar / jsonモジュールをロードする必要があることを心配する必要がないことを意味します。


私は単にiniファイルをコピーする代わりにシンボリックリンクを使用します。
greg0ire

1
新しいモジュールは自動的に「noxdebug」フォルダーに含まれませんが、フォルダーが同期しているような印象を与えるため、シンボリックリンクの使用は避けました。
KHobbits

4

私はWindowsベースのComposerインストーラーのソリューションを思いつきました-それはすべてのComposerインストールで機能するはずです、それは基本的に、ロードされたINIファイルのコピーを作成し、xdebug zend拡張機能をコメント化し、composerを実行するときにその構成ファイルをロードします。

この変更を統合するかどうかを確認するために問題を公開しました。

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

そこに私の説明とコードがあります。


シンプルで効果的:)自己更新でcomposerを更新した後、これを再度適用する必要がありますか?
marcovtwout

4

ジョイスの答えで述べたように、この問題はComposerの最新バージョンでは存在しません。

Composerのドキュメントが更新され、これ注意するます。(必要に応じて)Composerでxdebugを有効にする方法について詳しく説明します。

自己更新を利用してComposerのバージョンを更新できます

私のMacで私はしなければなりませんでした: sudo php /opt/local/bin/composer self-update

これについての詳細は、Homebrew PHPインストールのコンテキストで、この号に記載されています。


それは素晴らしいことです!この変更に対するPRがどこにあるか知っていますか?私は別のCLIのアプリでそれを必要とする
トマーシュVotruba

3

PHP設定の直接操作

これがHomebrewに基づく私の貢献です、Mac OS XにインストールされたPHPインストールに。

これはシェルスクリプトラッパー/usr/local/bin/composerであり、Composerバイナリがにある実行可能ファイルとしてに保存されるように設計されています/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

動作理論

ラッパースクリプト:

  • sedを使用しますをて構成ファイルを一時的に変更し、Xdebugを無効にします(行2)
  • argsをコマンドに渡してComposerを実行します(3行目)
  • sedを使用して構成ファイルを復元し、Xdebugを再度有効にします(4行目)

スクリプトは、PHP 5.5のOS X / Homebrewインストールに結合されています。他のPHPバージョン、他のオペレーティングシステム、パッケージマネージャーのディレクトリレイアウトで機能するようにパスを調整する必要があります。sedの一部のバージョンでは、後に続く空の文字列引数を必要としないことにも注意してください。-iオプションに。

警告ユーティリティ

それがメインのPHPの設定ファイル上で直接動作するという点でスクリプトは、簡単ですこれも欠点である:Xdebugのも、このスクリプトを同時に実行することが起こる任意のスクリプトのために無効になります。

私の開発環境では、Composerが手動で、たまにしか実行されないので、これは許容できるトレードオフです。ただし、自動デプロイメントプロセスの一部としてComposerを実行する場合は、この手法を使用したくない場合があります。


Composerによるエラーの処理方法に違いが出るかどうかはわかりません。具体的な例や懸念事項はありますか?このスクリプトは、問題の迅速な解決策を目的としており、完全に戦闘テストされていません。とはいえ、私が使っていた頃は問題なく動いていました。
j13k 2016

1
私の懸念は、スクリプトの最後の行が実行されない可能性があることです。
greg0ire 2016

2

ほとんどの場合、CLIモードではxdebugは必要ありません。これが許容できる場合は、cliとcgiを別々に構成できます。

したがって、php-cli.iniconf-cli.dを既存のphp.iniファイルの近くに作成すると、cliとcgiを別々に構成できます(cgiの場合はphp.iniconf.dになります)。xdebug.iniをconf-cli.dに配置しないでください。


2

OS Xでbrewを使用してcomposerをインストールする場合このエイリアスを使用できます。

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

1

複数のバージョンのPHPを使用するmacportsインストールの簡単な解決策は、Composer用のこの単純なシェルラッパーを記述することでした。

/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

次に、次のようなcomposerコマンドを実行します。

sudo composer-nodebug.sh update

欠点:

  • sudoが必要(INIファイルをchmodしない限り)
  • 途中で終了すると、INIファイルが変更されます
  • 今後追加されるPHPバージョンが必要になります。
  • 他のPHPプロセスの実行中に影響を受ける

エレガントではありませんが、シンプルです。


代わりに使用できるショートカットがあると思います$1…$7。多分それ$@はそのようなものです。見なければなりません。
greg0ire 2016年

> INIファイルが変更されている途中でkillした場合は、killシグナルをトラップすることで修正します>今後のPHPバージョンを追加する必要があります。単純なループでこれを修正することもできます
greg0ire

1

xdebugを無効にしてメモリエラーを防ぐために、composerのエイリアスを作成します。

この行を〜/ .bash_profileに追加します

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

端末を再起動して、新しいエイリアスを使用可能にします。


-3

これが、PHP5-cliバージョンのXdebug警告を取り除くための簡単な解決策です。Ubuntu 14.04でPHP5-cliのXdebugのサポートを削除しました。

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

sudo rm 20-xdebug.ini

PHP5-cliでのXdebug警告がなくなりました。


2
sudo phpdismod xdebugrm
暴力を振るう
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.