回答:
更新:この問題は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 $@
bin/bash
のではなく/bin/sh
、後者は好きではなかったとして、function
キーワード(Ubuntuの14.04 LTS)。
composer self-update
このコマンドは、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
alias xdebug-on='sudo php5enmod -s cli xdebug'
とを追加したalias xdebug-off='sudo php5dismod -s cli xdebug'
ので、xdebug を有効xdebug-on
または無効にするのは簡単xdebug-off
です。
PHPを構成するオプションがないため、ターゲットのスクリプトに応じて異なる構成をロードできるとは思いません。少なくとも、.iniファイルを複製せずに...
ただし、phpでcomposerを実行するときに、これらのオプションを追加できます。
php -n -d extension=needed_ext.so composer.phar
-n
php.iniを無視するようにPHPに指示します。これにより、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
見た目は醜く(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スクリプトに置き換えるか、エイリアスを構成できるかどうかを確認します。
composer.json
「ext-ldap」:「*」など、ユーザーが何を必要とするかによって、または単にインストール後のタスクを適切に実行するために何が必要かによって、ホワイトリストが大きくなる可能性があることです。 …拡張機能をブラックリストに登録する方法があった場合のみ
php -m
エイリアスを作成することにより、それを抑制します 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"
-n
オプションはPhar
拡張機能を無効にするため、実行に失敗する可能性がありますcomposer.phar
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
一部は警告作曲の問題を無効にします。
xdebug拡張機能を無効にすることをお勧めします(composerのトラブルシューティングを参照))。ただし、個人的には、より単純なスクリプトが好きです。
私のマシンでのいくつかのタイミング:2 xdebugで実行し、iniを有効化:1m33
xdebugで実行しますが、iniを無効にします:0m19
xdebugなしで実行:0m10
COMPOSER_DISABLE_XDEBUG_WARN=1
思います。警告が表示された場合、それは単にスクリプトが機能しないことを意味します。xdebug.remote_autostart
リモートデバッグが無効になっている場合、定義は役に立たないようです。
PHPStormを使用する場合、最新リリース(2016.2)には、オンデマンドでCLIスクリプトのXDebugを有効にする機能が含まれています。つまり、開発マシンでXDebugをグローバルにオフにするだけです。IDEは、プロジェクト内のコードで必要なときに、その場で有効にします。
PhpStorm 2016.2は、グローバルなPHPインストールに対してXdebugを無効にできるXdebug On Demandモードを導入し、PhpStormは、必要な場合(スクリプトのデバッグ時またはコードカバレッジレポートが必要な場合)にのみ有効にします。
リンクされた記事で説明されているように、XDebugへのパスを含めるようにPHPインタープリターの設定を編集する必要があります。
私は通常、IDEにいる間だけXDebugが必要なので、これは完璧なソリューションのようです。
ただし、XDebugは、「オフライン」の場合、他の潜在的な用途があります。たとえば、エラーログの拡張スタックダンプは、グローバルにオフにすると失われます。もちろん、本番環境でXDebugを有効にするべきではないので、これは開発中のベータテストや自動テストCLIスクリプトなどのユースケースに限定されます。
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モジュールをロードする必要があることを心配する必要がないことを意味します。
私はWindowsベースのComposerインストーラーのソリューションを思いつきました-それはすべてのComposerインストールで機能するはずです、それは基本的に、ロードされたINIファイルのコピーを作成し、xdebug zend拡張機能をコメント化し、composerを実行するときにその構成ファイルをロードします。
この変更を統合するかどうかを確認するために問題を公開しました。
https://github.com/composer/windows-setup/issues/58
そこに私の説明とコードがあります。
ジョイスの答えで述べたように、この問題はComposerの最新バージョンでは存在しません。
Composerのドキュメントが更新され、これに注意するます。(必要に応じて)Composerでxdebugを有効にする方法について詳しく説明します。
自己更新を利用してComposerのバージョンを更新できます。
私のMacで私はしなければなりませんでした: sudo php /opt/local/bin/composer self-update
これが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
ラッパースクリプト:
スクリプトは、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を使用する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
欠点:
エレガントではありませんが、シンプルです。
$1…$7
。多分それ$@
はそのようなものです。見なければなりません。
xdebugを無効にしてメモリエラーを防ぐために、composerのエイリアスを作成します。
この行を〜/ .bash_profileに追加します
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
端末を再起動して、新しいエイリアスを使用可能にします。