[php] composer를 실행할 때 xdebug 비활성화

실행할 때 composer diagnose다음 오류가 발생합니다.

xdebug 확장이로드되면 Composer가 약간 느려질 수 있습니다. Composer를 사용할 때 비활성화하는 것이 좋습니다.

Composer를 실행할 때만 xdebug를 비활성화하려면 어떻게해야합니까?



답변

업데이트 : Composer 1.3 에서 문제가 수정되었습니다 . composer self-update다음 해결 방법을 시도하는 대신을 실행하여 작성기를 최신 버전으로 업데이트 하십시오.


@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 모듈을 비활성화합니다 (따라서 composer).

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


답변

대상 스크립트에 따라 다른 구성을로드 할 수 있도록 PHP를 구성하는 옵션이 없다고 생각합니다. 최소한 .ini 파일을 복제하지 않고서는 안됩니다 …

그러나 php로 composer를 실행할 때 이러한 옵션을 추가 할 수 있습니다.

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

-nPHP는 모든 php.ini를 무시하도록 지시합니다. 이것은 바로이 명령에 대해 xdebug가로드되는 것을 방지합니다.

-d옵션을 사용하면 원하는 옵션을 추가 할 수 있습니다 (예 : needed_ext.so 활성화). 여러 -d옵션을 사용할 수 있습니다. 물론 이것은 선택 사항이며 필요하지 않을 수도 있습니다.

그런 다음 별칭을 만들어 다시 설탕으로 만들 수 있습니다.

일반적인 솔루션 (작성자는 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


답변

별칭을 만들면 해당 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에서 꽤 잘 작동하는 대답을 생각 해냈다. 그리고 아마도 “additional 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.pharcomposer.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 확장을 비활성화하는 것이 선호되지만 ( 작성기 문제 해결 참조 ) 개인적으로 더 간단한 스크립트를 좋아합니다.

내 컴퓨터의 일부 타이밍 : 2 xdebug 및 ini 활성화로 실행 : 1m33

xdebug로 실행하지만 ini 비활성화 : 0m19

xdebug없이 실행 : 0m10


답변

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 스크립트와 같은 사용 사례로 제한됩니다.