composer diagnose
を実行すると、次のエラーが表示されます。
Xdebug拡張機能がロードされます。これにより、Composerが少し遅くなります。 Composerを使用する場合は無効にすることをお勧めします。
Composerを実行しているときにのみxdebugを無効にするにはどうすればよいですか?
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 $@
このコマンドは、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
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
エイリアスを作成すると、その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"
私は、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"
すべてのプロジェクトには別の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
PHPStormを使用する場合、最新リリース(2016.2)には、CLIスクリプトのXDebugをオンデマンドで有効にする機能が付属しています。つまり、開発マシンでXDebugをグローバルにオフにできます。 IDEは、プロジェクト内のコードで必要になったときに、オンザフライで有効にします。
PhpStorm 2016.2では、グローバルPHPインストールでXdebugを無効にできるXdebug On Demandモードが導入され、PhpStormは必要な場合にのみ有効にします—スクリプトをデバッグしているとき、またはコードカバレッジレポートが必要なとき。
リンクされた記事で説明されているように、PHPインタープリターの設定を編集してXDebugへのパスを含める必要があります。
私はIDEにいる間だけXDebugが必要なので、これは完璧なソリューションのように思えます。
ただし、「オフライン」の場合、XDebugには他の潜在的な用途があります。エラーログの拡張スタックダンプ。グローバルに無効にすると失われます。もちろん、本番環境でXDebugを有効にしないでください。そのため、これは、開発中のベータテストや自動テストCLIスクリプトなどの使用例に限定されます。
WindowsベースのComposerインストーラーのソリューションを思い付きました-Composerのインストールで動作するはずです。基本的には、ロードされたINIのコピーを作成します。ファイルを作成し、xdebug zend拡張機能をコメントアウトしてから、composerの実行時にその構成ファイルを読み込みます。
この変更を統合するかどうかを確認するために問題を開きました。
https://github.com/composer/windows-setup/issues/58
そこに私の指示とコードがあります。
Joyce's answer に記載されているように、この問題はComposerの最新バージョンには存在しません。
Composerドキュメントが これに注意 に更新されました。 Composer(必要な場合)を使用してxdebugを有効にする方法を詳しく説明します。
self-update を使用して、Composerのバージョンを更新できます。
私のMacでは、次のことをしなければなりませんでした:Sudo php /opt/local/bin/composer self-update
Homebrew PHPインストールのコンテキストでのこれに関する詳細は this issue にあります。
これは、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
ラッパースクリプト:
このスクリプトは、PHP 5.5のOS X/Homebrewインストールに結合されています。パスは、他のPHPバージョンおよび他のオペレーティングシステムとパッケージマネージャーのディレクトリレイアウトで動作するように調整する必要があります。また、sedの一部のバージョンでは、-i
オプションに続く空文字列引数が不要であることに注意してください。
このスクリプトは簡単です。メインのPHP構成ファイルで直接動作するため、しかしこれは欠点でもあります。Xdebugはたまたまスクリプトに対しても無効になります。このスクリプトと同時に実行されます。
私の開発環境では、Composerが手動で、たまにしか実行されないため、これは許容できるトレードオフです。ただし、自動展開プロセスの一部としてComposerを実行する場合は、この手法を使用したくない場合があります。
ほとんどの場合、CLIモードでxdebugは必要ありません。これが受け入れられる場合は、cliとcgiを別々に構成できます。
したがって、php-cli.iniおよびconf-cli.dを終了するphp.iniファイルの近くで作成すると、cliとcgiを別々に構成できます(cgiの場合は- php.iniおよびconf.d)。 xdebug.iniをconf-cli.dに入れないでください。
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モジュールをロードする必要について心配する必要はありません。
OS Xでbrewを使用してcomposerをインストールする場合、次のエイリアスを使用できます。
alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')"
複数のバージョンの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
欠点:
エレガントではありませんが、シンプルです。
composerのエイリアスを作成してxdebugを無効にし、メモリエラーを防止します。
この行を〜/ .bash_profileに追加します
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
ターミナルを再起動して、新しいエイリアスを使用可能にします。