web-dev-qa-db-ja.com

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

composer diagnoseを実行すると、次のエラーが表示されます。

Xdebug拡張機能がロードされます。これにより、Composerが少し遅くなります。 Composerを使用する場合は無効にすることをお勧めします。

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

97
greg0ire

Update:この問題は Composer 1. で修正されました。次の回避策を試す代わりに、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 $@
74
Joyce Babu

このコマンドは、CLI(およびコンポーザー)のPHP5 Xdebugモジュールを無効にします。

Sudo php5dismod -s cli xdebug

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

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

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

Sudo phpdismod -s cli xdebug
76
ruleant

PHPを設定するオプションはないと思うので、ターゲットのスクリプトに従って異なる設定をロードできます。少なくとも、.iniファイルを複製することなく...

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

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

-nは、PHPにphp.iniを無視するように指示します。これにより、xdebugがこのコマンドに対してロードされなくなります。

-d optionsを使用すると、必要なオプションを追加できます(たとえば、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

Ugいように見えます(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
40
Gui-Don

エイリアスを作成すると、そのcomposerxdebugエラーメッセージが表示されなくなります。

この行をシステム内の~/.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"
14
Adriano Rosa

私は、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"
12
ezzatron

すべてのプロジェクトには別の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部分は、警告composerの問題を無効にします。

Xdebug拡張機能を無効にすることをお勧めします( composer troubleshooting を参照)が、個人的には単純なスクリプトが好きです。

私のマシンのいくつかのタイミング:2 xdebugおよびini対応で実行:1m33

Xdebugで実行しますが、iniが無効になっています:0m19

Xdebugなしで実行:0m10

7
Joost

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は必要な場合にのみ有効にします—スクリプトをデバッグしているとき、またはコードカバレッジレポートが必要なとき。

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

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

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

6
scipilot

WindowsベースのComposerインストーラーのソリューションを思い付きました-Composerのインストールで動作するはずです。基本的には、ロードされたINIのコピーを作成します。ファイルを作成し、xdebug zend拡張機能をコメントアウトしてから、composerの実行時にその構成ファイルを読み込みます。

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

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

そこに私の指示とコードがあります。

4
mindplay.dk

Joyce's answer に記載されているように、この問題はComposerの最新バージョンには存在しません。

Composerドキュメントが これに注意 に更新されました。 Composer(必要な場合)を使用してxdebugを有効にする方法を詳しく説明します。

self-update を使用して、Composerのバージョンを更新できます。

私のMacでは、次のことをしなければなりませんでした:Sudo php /opt/local/bin/composer self-update

Homebrew PHPインストールのコンテキストでのこれに関する詳細は this issue にあります。

4
Thomas Clowes

PHP構成の直接操作

これは、Mac OS Xでの Homebrew -installed 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行目)
  • composerを実行し、引数をコマンドに渡します(3行目)
  • sedを使用して構成ファイルを復元し、Xdebugを再度有効にします(4行目)

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

警告ユーティリティ

このスクリプトは簡単です。メインのPHP構成ファイルで直接動作するため、しかしこれは欠点でもあります。Xdebugはたまたまスクリプトに対しても無効になります。このスクリプトと同時に実行されます。

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

3
j13k

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

したがって、php-cli.iniおよびconf-cli.dを終了するphp.iniファイルの近くで作成すると、cliとcgiを別々に構成できます(cgiの場合は- php.iniおよびconf.d)。 xdebug.iniをconf-cli.dに入れないでください。

3
Vazgen Manukyan

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

これは上記のソリューションのいくつかと似ていますが、これはいくつかのEdgeケースを解決します。これは、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

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

3
KHobbits

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

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

複数のバージョンの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
scipilot

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

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

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

ターミナルを再起動して、新しいエイリアスを使用可能にします。

0